[Mesa-dev] [PATCH v2 2/3] radv: use a global BO list only for VK_EXT_descriptor_indexing

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu Apr 19 15:46:38 UTC 2018


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.pitoiset at 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



More information about the mesa-dev mailing list