summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/amd/vulkan/radv_device.c20
-rw-r--r--src/amd/vulkan/radv_private.h5
-rw-r--r--src/amd/vulkan/radv_wsi.c31
3 files changed, 42 insertions, 14 deletions
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index b51d7325df8..c34674d0904 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -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);
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index f3abc431e87..7a51afcbccc 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -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
diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index 960b09700bb..d93b263e859 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -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