turnip: semaphores simplification (only syncobj semaphores supported)
Signed-off-by: Jonathan Marek <jonathan@marek.ca> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6719>
This commit is contained in:

committed by
Marge Bot

parent
1dfb5a93d2
commit
fb76af24a2
@@ -436,40 +436,12 @@ tu_enumerate_devices(struct tu_instance *instance)
|
||||
return result;
|
||||
}
|
||||
|
||||
// Queue semaphore functions
|
||||
|
||||
static void
|
||||
tu_semaphore_part_destroy(struct tu_device *device,
|
||||
struct tu_semaphore_part *part)
|
||||
semaphore_set_temporary(struct tu_device *device, struct tu_semaphore *sem, uint32_t syncobj)
|
||||
{
|
||||
switch(part->kind) {
|
||||
case TU_SEMAPHORE_NONE:
|
||||
break;
|
||||
case TU_SEMAPHORE_SYNCOBJ:
|
||||
drmSyncobjDestroy(device->fd, part->syncobj);
|
||||
break;
|
||||
}
|
||||
part->kind = TU_SEMAPHORE_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
tu_semaphore_remove_temp(struct tu_device *device,
|
||||
struct tu_semaphore *sem)
|
||||
{
|
||||
if (sem->temporary.kind != TU_SEMAPHORE_NONE) {
|
||||
tu_semaphore_part_destroy(device, &sem->temporary);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
tu_semaphores_remove_temp(struct tu_device *device,
|
||||
const VkSemaphore *sems,
|
||||
uint32_t sem_count)
|
||||
{
|
||||
for (uint32_t i = 0; i < sem_count; ++i) {
|
||||
TU_FROM_HANDLE(tu_semaphore, sem, sems[i]);
|
||||
tu_semaphore_remove_temp(device, sem);
|
||||
}
|
||||
if (sem->temporary)
|
||||
drmSyncobjDestroy(device->fd, sem->temporary);
|
||||
sem->temporary = syncobj;
|
||||
}
|
||||
|
||||
VkResult
|
||||
@@ -486,14 +458,13 @@ tu_CreateSemaphore(VkDevice _device,
|
||||
if (!sem)
|
||||
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
|
||||
sem->temporary.kind = TU_SEMAPHORE_NONE;
|
||||
sem->permanent.kind = TU_SEMAPHORE_SYNCOBJ;
|
||||
|
||||
if (drmSyncobjCreate(device->fd, 0, &sem->permanent.syncobj) < 0) {
|
||||
if (drmSyncobjCreate(device->fd, 0, &sem->permanent) < 0) {
|
||||
vk_free2(&device->vk.alloc, pAllocator, sem);
|
||||
return VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
sem->temporary = 0;
|
||||
|
||||
*pSemaphore = tu_semaphore_to_handle(sem);
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
@@ -508,8 +479,8 @@ tu_DestroySemaphore(VkDevice _device,
|
||||
if (!_semaphore)
|
||||
return;
|
||||
|
||||
tu_semaphore_part_destroy(device, &sem->permanent);
|
||||
tu_semaphore_part_destroy(device, &sem->temporary);
|
||||
semaphore_set_temporary(device, sem, 0);
|
||||
drmSyncobjDestroy(device->fd, sem->permanent);
|
||||
|
||||
vk_object_free(&device->vk, pAllocator, sem);
|
||||
}
|
||||
@@ -521,7 +492,7 @@ tu_ImportSemaphoreFdKHR(VkDevice _device,
|
||||
TU_FROM_HANDLE(tu_device, device, _device);
|
||||
TU_FROM_HANDLE(tu_semaphore, sem, pImportSemaphoreFdInfo->semaphore);
|
||||
int ret;
|
||||
struct tu_semaphore_part *dst = NULL;
|
||||
uint32_t *dst = NULL;
|
||||
|
||||
if (pImportSemaphoreFdInfo->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) {
|
||||
dst = &sem->temporary;
|
||||
@@ -529,7 +500,7 @@ tu_ImportSemaphoreFdKHR(VkDevice _device,
|
||||
dst = &sem->permanent;
|
||||
}
|
||||
|
||||
uint32_t syncobj = dst->kind == TU_SEMAPHORE_SYNCOBJ ? dst->syncobj : 0;
|
||||
uint32_t syncobj = *dst;
|
||||
|
||||
switch(pImportSemaphoreFdInfo->handleType) {
|
||||
case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT: {
|
||||
@@ -564,8 +535,7 @@ tu_ImportSemaphoreFdKHR(VkDevice _device,
|
||||
if (ret) {
|
||||
return VK_ERROR_INVALID_EXTERNAL_HANDLE;
|
||||
}
|
||||
dst->syncobj = syncobj;
|
||||
dst->kind = TU_SEMAPHORE_SYNCOBJ;
|
||||
*dst = syncobj;
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
@@ -578,15 +548,7 @@ tu_GetSemaphoreFdKHR(VkDevice _device,
|
||||
TU_FROM_HANDLE(tu_device, device, _device);
|
||||
TU_FROM_HANDLE(tu_semaphore, sem, pGetFdInfo->semaphore);
|
||||
int ret;
|
||||
uint32_t syncobj_handle;
|
||||
|
||||
if (sem->temporary.kind != TU_SEMAPHORE_NONE) {
|
||||
assert(sem->temporary.kind == TU_SEMAPHORE_SYNCOBJ);
|
||||
syncobj_handle = sem->temporary.syncobj;
|
||||
} else {
|
||||
assert(sem->permanent.kind == TU_SEMAPHORE_SYNCOBJ);
|
||||
syncobj_handle = sem->permanent.syncobj;
|
||||
}
|
||||
uint32_t syncobj_handle = sem->temporary ?: sem->permanent;
|
||||
|
||||
switch(pGetFdInfo->handleType) {
|
||||
case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
|
||||
@@ -595,8 +557,8 @@ tu_GetSemaphoreFdKHR(VkDevice _device,
|
||||
case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
|
||||
ret = drmSyncobjExportSyncFile(device->fd, syncobj_handle, pFd);
|
||||
if (!ret) {
|
||||
if (sem->temporary.kind != TU_SEMAPHORE_NONE) {
|
||||
tu_semaphore_part_destroy(device, &sem->temporary);
|
||||
if (sem->temporary) {
|
||||
semaphore_set_temporary(device, sem, 0);
|
||||
} else {
|
||||
drmSyncobjReset(device->fd, &syncobj_handle, 1);
|
||||
}
|
||||
@@ -652,28 +614,16 @@ tu_QueueSubmit(VkQueue _queue,
|
||||
|
||||
for (uint32_t i = 0; i < submit->waitSemaphoreCount; i++) {
|
||||
TU_FROM_HANDLE(tu_semaphore, sem, submit->pWaitSemaphores[i]);
|
||||
|
||||
struct tu_semaphore_part *part =
|
||||
sem->temporary.kind != TU_SEMAPHORE_NONE ?
|
||||
&sem->temporary : &sem->permanent;
|
||||
if (part->kind != TU_SEMAPHORE_SYNCOBJ)
|
||||
continue;
|
||||
in_syncobjs[nr_in_syncobjs++] = (struct drm_msm_gem_submit_syncobj) {
|
||||
.handle = part->syncobj,
|
||||
.handle = sem->temporary ?: sem->permanent,
|
||||
.flags = MSM_SUBMIT_SYNCOBJ_RESET,
|
||||
};
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < submit->signalSemaphoreCount; i++) {
|
||||
TU_FROM_HANDLE(tu_semaphore, sem, submit->pSignalSemaphores[i]);
|
||||
|
||||
struct tu_semaphore_part *part =
|
||||
sem->temporary.kind != TU_SEMAPHORE_NONE ?
|
||||
&sem->temporary : &sem->permanent;
|
||||
if (part->kind != TU_SEMAPHORE_SYNCOBJ)
|
||||
continue;
|
||||
out_syncobjs[nr_out_syncobjs++] = (struct drm_msm_gem_submit_syncobj) {
|
||||
.handle = part->syncobj,
|
||||
.handle = sem->temporary ?: sem->permanent,
|
||||
.flags = 0,
|
||||
};
|
||||
}
|
||||
@@ -744,8 +694,12 @@ tu_QueueSubmit(VkQueue _queue,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
tu_semaphores_remove_temp(queue->device, pSubmits[i].pWaitSemaphores,
|
||||
pSubmits[i].waitSemaphoreCount);
|
||||
/* restore permanent payload on wait */
|
||||
for (uint32_t i = 0; i < submit->waitSemaphoreCount; i++) {
|
||||
TU_FROM_HANDLE(tu_semaphore, sem, submit->pWaitSemaphores[i]);
|
||||
semaphore_set_temporary(queue->device, sem, 0);
|
||||
}
|
||||
|
||||
if (last_submit) {
|
||||
if (queue->fence >= 0)
|
||||
close(queue->fence);
|
||||
|
@@ -1486,26 +1486,9 @@ struct tu_query_pool
|
||||
struct tu_bo bo;
|
||||
};
|
||||
|
||||
enum tu_semaphore_kind
|
||||
{
|
||||
TU_SEMAPHORE_NONE,
|
||||
TU_SEMAPHORE_SYNCOBJ,
|
||||
};
|
||||
|
||||
struct tu_semaphore_part
|
||||
{
|
||||
enum tu_semaphore_kind kind;
|
||||
union {
|
||||
uint32_t syncobj;
|
||||
};
|
||||
};
|
||||
|
||||
struct tu_semaphore
|
||||
{
|
||||
struct tu_semaphore {
|
||||
struct vk_object_base base;
|
||||
|
||||
struct tu_semaphore_part permanent;
|
||||
struct tu_semaphore_part temporary;
|
||||
uint32_t permanent, temporary;
|
||||
};
|
||||
|
||||
void
|
||||
|
Reference in New Issue
Block a user