mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-12 22:20:33 +01:00
anv: refcount semaphores
Delayed submissions required by timeline semaphores mean we need to be able to update the sync fd backed semaphores in a delayed fashion. This could mean a race between the application destroying the semaphore and the submission code trying to update it with the new sync fd. This change prepares semaphores to be refcounted, we'll most likely only take a reference for cases where we signal a sync fd semaphore. Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
3da798c9f1
commit
3e22363537
2 changed files with 26 additions and 6 deletions
|
|
@ -2806,6 +2806,8 @@ struct anv_semaphore_impl {
|
|||
};
|
||||
|
||||
struct anv_semaphore {
|
||||
uint32_t refcount;
|
||||
|
||||
/* Permanent semaphore state. Every semaphore has some form of permanent
|
||||
* state (type != ANV_SEMAPHORE_TYPE_NONE). This may be a BO to fence on
|
||||
* (for cross-process semaphores0 or it could just be a dummy for use
|
||||
|
|
|
|||
|
|
@ -947,11 +947,13 @@ VkResult anv_CreateSemaphore(
|
|||
|
||||
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO);
|
||||
|
||||
semaphore = vk_alloc2(&device->alloc, pAllocator, sizeof(*semaphore), 8,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
||||
semaphore = vk_alloc(&device->alloc, sizeof(*semaphore), 8,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
|
||||
if (semaphore == NULL)
|
||||
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
|
||||
p_atomic_set(&semaphore->refcount, 1);
|
||||
|
||||
const VkExportSemaphoreCreateInfo *export =
|
||||
vk_find_struct_const(pCreateInfo->pNext, EXPORT_SEMAPHORE_CREATE_INFO);
|
||||
VkExternalSemaphoreHandleTypeFlags handleTypes =
|
||||
|
|
@ -1049,6 +1051,25 @@ anv_semaphore_reset_temporary(struct anv_device *device,
|
|||
anv_semaphore_impl_cleanup(device, &semaphore->temporary);
|
||||
}
|
||||
|
||||
static struct anv_semaphore *
|
||||
anv_semaphore_ref(struct anv_semaphore *semaphore)
|
||||
{
|
||||
assert(semaphore->refcount);
|
||||
p_atomic_inc(&semaphore->refcount);
|
||||
return semaphore;
|
||||
}
|
||||
|
||||
static void
|
||||
anv_semaphore_unref(struct anv_device *device, struct anv_semaphore *semaphore)
|
||||
{
|
||||
if (!p_atomic_dec_zero(&semaphore->refcount))
|
||||
return;
|
||||
|
||||
anv_semaphore_impl_cleanup(device, &semaphore->temporary);
|
||||
anv_semaphore_impl_cleanup(device, &semaphore->permanent);
|
||||
vk_free(&device->alloc, semaphore);
|
||||
}
|
||||
|
||||
void anv_DestroySemaphore(
|
||||
VkDevice _device,
|
||||
VkSemaphore _semaphore,
|
||||
|
|
@ -1060,10 +1081,7 @@ void anv_DestroySemaphore(
|
|||
if (semaphore == NULL)
|
||||
return;
|
||||
|
||||
anv_semaphore_impl_cleanup(device, &semaphore->temporary);
|
||||
anv_semaphore_impl_cleanup(device, &semaphore->permanent);
|
||||
|
||||
vk_free2(&device->alloc, pAllocator, semaphore);
|
||||
anv_semaphore_unref(device, semaphore);
|
||||
}
|
||||
|
||||
void anv_GetPhysicalDeviceExternalSemaphoreProperties(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue