Maintaining two different paths is annoying but this gets rid of the performance regression introduced by the global BO list.
We might find a better solution in the future, but for now just keeps two paths. Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> --- src/amd/vulkan/radv_device.c | 32 ++++++++++++++++++++++++++------ src/amd/vulkan/radv_private.h | 3 +++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 14ecbd02001..2c643ae086b 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -1299,8 +1299,14 @@ radv_bo_list_finish(struct radv_bo_list *bo_list) pthread_mutex_destroy(&bo_list->mutex); } -static VkResult radv_bo_list_add(struct radv_bo_list *bo_list, struct radeon_winsys_bo *bo) +static VkResult radv_bo_list_add(struct radv_device *device, + struct radeon_winsys_bo *bo) { + struct radv_bo_list *bo_list = &device->bo_list; + + if (unlikely(!device->use_global_bo_list)) + return VK_SUCCESS; + pthread_mutex_lock(&bo_list->mutex); if (bo_list->list.count == bo_list->capacity) { unsigned capacity = MAX2(4, bo_list->capacity * 2); @@ -1320,8 +1326,14 @@ static VkResult radv_bo_list_add(struct radv_bo_list *bo_list, struct radeon_win return VK_SUCCESS; } -static void radv_bo_list_remove(struct radv_bo_list *bo_list, struct radeon_winsys_bo *bo) +static void radv_bo_list_remove(struct radv_device *device, + struct radeon_winsys_bo *bo) { + struct radv_bo_list *bo_list = &device->bo_list; + + if (unlikely(!device->use_global_bo_list)) + return; + pthread_mutex_lock(&bo_list->mutex); for(unsigned i = 0; i < bo_list->list.count; ++i) { if (bo_list->list.bos[i] == bo) { @@ -1430,6 +1442,12 @@ VkResult radv_CreateDevice( keep_shader_info = device->enabled_extensions.AMD_shader_info; + /* With update after bind we can't attach bo's to the command buffer + * from the descriptor set anymore, so we have to use a global BO list. + */ + device->use_global_bo_list = + device->enabled_extensions.EXT_descriptor_indexing; + mtx_init(&device->shader_slab_mutex, mtx_plain); list_inithead(&device->shader_slabs); @@ -2502,14 +2520,16 @@ VkResult radv_QueueSubmit( sem_info.cs_emit_wait = j == 0; sem_info.cs_emit_signal = j + advance == pSubmits[i].commandBufferCount; - pthread_mutex_lock(&queue->device->bo_list.mutex); + if (unlikely(queue->device->use_global_bo_list)) + pthread_mutex_lock(&queue->device->bo_list.mutex); ret = queue->device->ws->cs_submit(ctx, queue->queue_idx, cs_array + j, advance, initial_preamble, continue_preamble_cs, &sem_info, &queue->device->bo_list.list, can_patch, base_fence); - pthread_mutex_unlock(&queue->device->bo_list.mutex); + if (unlikely(queue->device->use_global_bo_list)) + pthread_mutex_unlock(&queue->device->bo_list.mutex); if (ret) { radv_loge("failed to submit CS %d\n", i); @@ -2757,7 +2777,7 @@ static VkResult radv_alloc_memory(struct radv_device *device, mem->type_index = mem_type_index; } - result = radv_bo_list_add(&device->bo_list, mem->bo); + result = radv_bo_list_add(device, mem->bo); if (result != VK_SUCCESS) goto fail_bo; @@ -2794,7 +2814,7 @@ void radv_FreeMemory( if (mem == NULL) return; - radv_bo_list_remove(&device->bo_list, mem->bo); + radv_bo_list_remove(device, mem->bo); device->ws->buffer_destroy(mem->bo); mem->bo = NULL; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index dfe4c5f9422..883342ede88 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -670,6 +670,9 @@ struct radv_device { struct radv_device_extension_table enabled_extensions; + /* Whether the driver uses a global BO list. */ + bool use_global_bo_list; + struct radv_bo_list bo_list; }; -- 2.17.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev