radv: Add WSI buffers to BO list only if they can be used.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Tue, 24 Mar 2020 16:59:26 +0000 (17:59 +0100)
committerMarge Bot <eric+marge@anholt.net>
Mon, 27 Apr 2020 18:01:24 +0000 (18:01 +0000)
Also reverse the BO list removal loop. This way typical WSI usage
should find the entry in O(active swapchains) iterations, which
should not be a performance issues. Tested with Doom(2106) which
found the entry in 1 iteration every time.

Acked-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4306>

src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_private.h
src/amd/vulkan/radv_wsi.c

index b51d7325df8f43280d3f4afcc9ef5e4fd129b8b9..c34674d09040e0c60d9020f0142ce07ea74b2c9f 100644 (file)
@@ -2231,8 +2231,8 @@ radv_bo_list_finish(struct radv_bo_list *bo_list)
        pthread_mutex_destroy(&bo_list->mutex);
 }
 
-static VkResult radv_bo_list_add(struct radv_device *device,
-                                struct radeon_winsys_bo *bo)
+VkResult radv_bo_list_add(struct radv_device *device,
+                         struct radeon_winsys_bo *bo)
 {
        struct radv_bo_list *bo_list = &device->bo_list;
 
@@ -2261,8 +2261,8 @@ static VkResult radv_bo_list_add(struct radv_device *device,
        return VK_SUCCESS;
 }
 
-static void radv_bo_list_remove(struct radv_device *device,
-                               struct radeon_winsys_bo *bo)
+void radv_bo_list_remove(struct radv_device *device,
+                        struct radeon_winsys_bo *bo)
 {
        struct radv_bo_list *bo_list = &device->bo_list;
 
@@ -2273,7 +2273,9 @@ static void radv_bo_list_remove(struct radv_device *device,
                return;
 
        pthread_mutex_lock(&bo_list->mutex);
-       for(unsigned i = 0; i < bo_list->list.count; ++i) {
+       /* Loop the list backwards so we find the most recently added
+        * memory first. */
+       for(unsigned i = bo_list->list.count; i-- > 0;) {
                if (bo_list->list.bos[i] == bo) {
                        bo_list->list.bos[i] = bo_list->list.bos[bo_list->list.count - 1];
                        --bo_list->list.count;
@@ -5241,9 +5243,11 @@ static VkResult radv_alloc_memory(struct radv_device *device,
                mem->type_index = mem_type_index;
        }
 
-       result = radv_bo_list_add(device, mem->bo);
-       if (result != VK_SUCCESS)
-               goto fail;
+       if (!wsi_info) {
+               result = radv_bo_list_add(device, mem->bo);
+               if (result != VK_SUCCESS)
+                       goto fail;
+       }
 
        *pMem = radv_device_memory_to_handle(mem);
 
index f3abc431e876804acbecbdfc966556a46b01fbbc..7a51afcbccc9a3a249e872dc30c95e02630e58a9 100644 (file)
@@ -758,6 +758,11 @@ struct radv_bo_list {
        pthread_mutex_t mutex;
 };
 
+VkResult radv_bo_list_add(struct radv_device *device,
+                         struct radeon_winsys_bo *bo);
+void radv_bo_list_remove(struct radv_device *device,
+                        struct radeon_winsys_bo *bo);
+
 struct radv_secure_compile_process {
        /* Secure process file descriptors. Used to communicate between the
         * user facing device and the idle forked device used to fork a clean
index 960b09700bb8d849dd345efd7fb394b646473192..d93b263e8598665407136b776eed0d17c8a2e6a2 100644 (file)
@@ -35,15 +35,34 @@ radv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
        return radv_lookup_entrypoint(pName);
 }
 
+static void
+radv_wsi_set_memory_ownership(VkDevice _device,
+                              VkDeviceMemory _mem,
+                              VkBool32 ownership)
+{
+       RADV_FROM_HANDLE(radv_device, device, _device);
+       RADV_FROM_HANDLE(radv_device_memory, mem, _mem);
+
+       if (ownership)
+               radv_bo_list_add(device, mem->bo);
+       else
+               radv_bo_list_remove(device, mem->bo);
+}
+
 VkResult
 radv_init_wsi(struct radv_physical_device *physical_device)
 {
-       return wsi_device_init(&physical_device->wsi_device,
-                              radv_physical_device_to_handle(physical_device),
-                              radv_wsi_proc_addr,
-                              &physical_device->instance->alloc,
-                              physical_device->master_fd,
-                              &physical_device->instance->dri_options);
+       VkResult result =  wsi_device_init(&physical_device->wsi_device,
+                                          radv_physical_device_to_handle(physical_device),
+                                          radv_wsi_proc_addr,
+                                          &physical_device->instance->alloc,
+                                          physical_device->master_fd,
+                                          &physical_device->instance->dri_options);
+       if (result != VK_SUCCESS)
+               return result;
+
+       physical_device->wsi_device.set_memory_ownership = radv_wsi_set_memory_ownership;
+       return VK_SUCCESS;
 }
 
 void