From 9ae1e621e56fb845b7195f7bd5fb84f52ebff688 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 16 Dec 2021 14:14:19 -0600 Subject: [PATCH] anv: Implement vk_device::create_sync_for_memory Fixes: 36ea90a3619f ("anv: Convert to the common sync and submit framework") Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_bo_sync.c | 36 +++++++++++++++++++++++++++++----- src/intel/vulkan/anv_device.c | 1 + src/intel/vulkan/anv_private.h | 5 +++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/intel/vulkan/anv_bo_sync.c b/src/intel/vulkan/anv_bo_sync.c index fe933ca3811..4415b1fa51e 100644 --- a/src/intel/vulkan/anv_bo_sync.c +++ b/src/intel/vulkan/anv_bo_sync.c @@ -212,10 +212,11 @@ const struct vk_sync_type anv_bo_sync_type = { .wait_many = anv_bo_sync_wait, }; -VkResult -anv_sync_create_for_bo(struct anv_device *device, - struct anv_bo *bo, - struct vk_sync **sync_out) +static VkResult +_anv_sync_create_for_bo(struct anv_device *device, + struct anv_bo *bo, + enum anv_bo_sync_state state, + struct vk_sync **sync_out) { struct anv_bo_sync *bo_sync; @@ -225,10 +226,35 @@ anv_sync_create_for_bo(struct anv_device *device, return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); bo_sync->sync.type = &anv_bo_sync_type; - bo_sync->state = ANV_BO_SYNC_STATE_SUBMITTED; + bo_sync->state = state; bo_sync->bo = anv_bo_ref(bo); *sync_out = &bo_sync->sync; return VK_SUCCESS; } + +VkResult +anv_sync_create_for_bo(struct anv_device *device, + struct anv_bo *bo, + struct vk_sync **sync_out) +{ + return _anv_sync_create_for_bo(device, bo, ANV_BO_SYNC_STATE_SUBMITTED, + sync_out); +} + +VkResult +anv_create_sync_for_memory(struct vk_device *vk_device, + VkDeviceMemory memory, + bool signal_memory, + struct vk_sync **sync_out) +{ + ANV_FROM_HANDLE(anv_device_memory, mem, memory); + struct anv_device *device = + container_of(vk_device, struct anv_device, vk); + + enum anv_bo_sync_state state = signal_memory ? + ANV_BO_SYNC_STATE_RESET : ANV_BO_SYNC_STATE_SUBMITTED; + + return _anv_sync_create_for_bo(device, mem->bo, state, sync_out); +} diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index d8a44bf353b..0553cd4e532 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -3025,6 +3025,7 @@ VkResult anv_CreateDevice( } device->vk.check_status = anv_device_check_status; + device->vk.create_sync_for_memory = anv_create_sync_for_memory; vk_device_set_drm_fd(&device->vk, device->fd); uint32_t num_queues = 0; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 61196d5ff69..9143fe2cfc7 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3176,6 +3176,11 @@ VkResult anv_sync_create_for_bo(struct anv_device *device, struct anv_bo *bo, struct vk_sync **sync_out); +VkResult anv_create_sync_for_memory(struct vk_device *device, + VkDeviceMemory memory, + bool signal_memory, + struct vk_sync **sync_out); + struct anv_event { struct vk_object_base base; uint64_t semaphore;