if (ws->debug_all_bos) {
struct radv_amdgpu_winsys_bo *bo;
- pthread_mutex_lock(&ws->global_bo_list_lock);
-
handles = malloc(sizeof(handles[0]) * ws->num_buffers);
if (!handles) {
- pthread_mutex_unlock(&ws->global_bo_list_lock);
return VK_ERROR_OUT_OF_HOST_MEMORY;
}
handles[num_handles].bo_priority = bo->priority;
num_handles++;
}
-
- pthread_mutex_unlock(&ws->global_bo_list_lock);
} else if (count == 1 && !num_extra_bo && !extra_cs && !radv_bo_list &&
!radv_amdgpu_cs(cs_array[0])->num_virtual_buffers) {
struct radv_amdgpu_cs *cs = (struct radv_amdgpu_cs*)cs_array[0];
struct radv_amdgpu_ctx *ctx = radv_amdgpu_ctx(_ctx);
struct radv_amdgpu_fence *fence = (struct radv_amdgpu_fence *)_fence;
struct radv_amdgpu_cs *cs0 = radv_amdgpu_cs(cs_array[0]);
+ struct radv_amdgpu_winsys *aws = cs0->ws;
struct drm_amdgpu_bo_list_entry *handles = NULL;
struct radv_amdgpu_cs_request request = {0};
struct amdgpu_cs_ib_info ibs[2];
}
}
+ if (aws->debug_all_bos)
+ pthread_rwlock_rdlock(&aws->global_bo_list_lock);
+
/* Get the BO list. */
result = radv_amdgpu_get_bo_list(cs0->ws, cs_array, cs_count, NULL, 0,
initial_preamble_cs, radv_bo_list,
&num_handles, &handles);
if (result != VK_SUCCESS)
- return result;
+ goto fail;
/* Configure the CS request. */
if (initial_preamble_cs) {
free(request.handles);
if (result != VK_SUCCESS)
- return result;
+ goto fail;
if (fence)
radv_amdgpu_request_to_fence(ctx, fence, &request);
radv_assign_last_submit(ctx, &request);
- return VK_SUCCESS;
+fail:
+ if (aws->debug_all_bos)
+ pthread_rwlock_unlock(&aws->global_bo_list_lock);
+ return result;
}
static VkResult
struct radv_amdgpu_cs_request request = {};
struct amdgpu_cs_ib_info *ibs;
struct radv_amdgpu_cs *cs0;
+ struct radv_amdgpu_winsys *aws;
unsigned num_handles = 0;
unsigned number_of_ibs;
VkResult result;
assert(cs_count);
cs0 = radv_amdgpu_cs(cs_array[0]);
+ aws = cs0->ws;
/* Compute the number of IBs for this submit. */
number_of_ibs = cs_count + !!initial_preamble_cs;
+ if (aws->debug_all_bos)
+ pthread_rwlock_rdlock(&aws->global_bo_list_lock);
+
/* Get the BO list. */
result = radv_amdgpu_get_bo_list(cs0->ws, &cs_array[0], cs_count, NULL, 0,
initial_preamble_cs, radv_bo_list,
&num_handles, &handles);
- if (result != VK_SUCCESS)
- return result;
+ if (result != VK_SUCCESS) {
+ goto fail;
+ }
ibs = malloc(number_of_ibs * sizeof(*ibs));
if (!ibs) {
free(handles);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
+ result = VK_ERROR_OUT_OF_HOST_MEMORY;
+ goto fail;
}
/* Configure the CS request. */
free(ibs);
if (result != VK_SUCCESS)
- return result;
+ goto fail;
if (fence)
radv_amdgpu_request_to_fence(ctx, fence, &request);
radv_assign_last_submit(ctx, &request);
- return VK_SUCCESS;
+fail:
+ if (aws->debug_all_bos)
+ pthread_rwlock_unlock(&aws->global_bo_list_lock);
+ return result;
}
static VkResult
struct radv_amdgpu_fence *fence = (struct radv_amdgpu_fence *)_fence;
struct radv_amdgpu_cs *cs0 = radv_amdgpu_cs(cs_array[0]);
struct radeon_winsys *ws = (struct radeon_winsys*)cs0->ws;
+ struct radv_amdgpu_winsys *aws = cs0->ws;
struct radv_amdgpu_cs_request request;
uint32_t pad_word = PKT3_NOP_PAD;
bool emit_signal_sem = sem_info->cs_emit_signal;
ibs[0].flags = 0;
}
+ if (aws->debug_all_bos)
+ pthread_rwlock_rdlock(&aws->global_bo_list_lock);
+
result = radv_amdgpu_get_bo_list(cs0->ws, &cs_array[i], cnt,
(struct radv_amdgpu_winsys_bo **)bos,
number_of_ibs, preamble_cs,
if (result != VK_SUCCESS) {
free(ibs);
free(bos);
+ if (aws->debug_all_bos)
+ pthread_rwlock_unlock(&aws->global_bo_list_lock);
return result;
}
result = radv_amdgpu_cs_submit(ctx, &request, sem_info);
free(request.handles);
+ if (aws->debug_all_bos)
+ pthread_rwlock_unlock(&aws->global_bo_list_lock);
for (unsigned j = 0; j < number_of_ibs; j++) {
ws->buffer_destroy(bos[j]);
}
}
if(cs->ws->debug_all_bos) {
- pthread_mutex_lock(&cs->ws->global_bo_list_lock);
+ pthread_rwlock_rdlock(&cs->ws->global_bo_list_lock);
list_for_each_entry(struct radv_amdgpu_winsys_bo, bo,
&cs->ws->global_bo_list, global_list_item) {
if (addr >= bo->base.va && addr - bo->base.va < bo->size) {
if (amdgpu_bo_cpu_map(bo->bo, &ret) == 0) {
- pthread_mutex_unlock(&cs->ws->global_bo_list_lock);
+ pthread_rwlock_unlock(&cs->ws->global_bo_list_lock);
return (char *)ret + (addr - bo->base.va);
}
}
}
- pthread_mutex_unlock(&cs->ws->global_bo_list_lock);
+ pthread_rwlock_unlock(&cs->ws->global_bo_list_lock);
}
return ret;
}
chunks,
&request->seq_no);
- if (bo_list)
- amdgpu_bo_list_destroy_raw(ctx->ws->dev, bo_list);
-
if (r) {
if (r == -ENOMEM) {
fprintf(stderr, "amdgpu: Not enough memory for command submission.\n");
}
}
+ if (bo_list)
+ amdgpu_bo_list_destroy_raw(ctx->ws->dev, bo_list);
+
error_out:
if (in_syncobjs) {
radv_amdgpu_cache_free_syncobjs(ctx->ws, sem_info->wait.syncobj_count, in_syncobjs);