mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2024-12-29 11:06:18 +00:00
aux/vk: Refactor out semaphore and native creation into a helper
This commit is contained in:
parent
b6e5c296f5
commit
170fe0e5d9
|
@ -956,6 +956,39 @@ vk_create_and_submit_fence_native(struct vk_bundle *vk, xrt_graphics_sync_handle
|
||||||
XRT_CHECK_RESULT VkResult
|
XRT_CHECK_RESULT VkResult
|
||||||
vk_create_fence_sync_from_native(struct vk_bundle *vk, xrt_graphics_sync_handle_t native, VkFence *out_fence);
|
vk_create_fence_sync_from_native(struct vk_bundle *vk, xrt_graphics_sync_handle_t native, VkFence *out_fence);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Creates a Vulkan semaphore and a native graphics sync handle.
|
||||||
|
*
|
||||||
|
* In case of success, the underlying Vulkan functionality's ownership semantics
|
||||||
|
* apply: ownership of the @p native handle may have transferred, a reference
|
||||||
|
* may have been added, or the Vulkan object may rely on the caller to keep the
|
||||||
|
* native handle alive until the Vulkan object is destroyed. Which option
|
||||||
|
* applies depends on the particular native handle type used.
|
||||||
|
*
|
||||||
|
* In case of error, neither @p out_sem and @p out_native is not touched by the
|
||||||
|
* function so the caller only becomes responsible for the output on success.
|
||||||
|
*
|
||||||
|
* See the corresponding Vulkan specification text:
|
||||||
|
* https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#synchronization-semaphores
|
||||||
|
*
|
||||||
|
* @ingroup aux_vk
|
||||||
|
*/
|
||||||
|
XRT_CHECK_RESULT VkResult
|
||||||
|
vk_create_semaphore_and_native(struct vk_bundle *vk, VkSemaphore *out_sem, xrt_graphics_sync_handle_t *out_native);
|
||||||
|
|
||||||
|
#ifdef VK_KHR_timeline_semaphore
|
||||||
|
/*
|
||||||
|
* Creates a Vulkan timeline semaphore and a native graphics sync
|
||||||
|
* handle, see @ref vk_create_semaphore_and_native for more details.
|
||||||
|
*
|
||||||
|
* @ingroup aux_vk
|
||||||
|
*/
|
||||||
|
XRT_CHECK_RESULT VkResult
|
||||||
|
vk_create_timeline_semaphore_and_native(struct vk_bundle *vk,
|
||||||
|
VkSemaphore *out_sem,
|
||||||
|
xrt_graphics_sync_handle_t *out_native);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief Creates a Vulkan semaphore from a native graphics sync handle.
|
* @brief Creates a Vulkan semaphore from a native graphics sync handle.
|
||||||
*
|
*
|
||||||
|
|
|
@ -23,6 +23,26 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static VkExternalSemaphoreHandleTypeFlagBits
|
||||||
|
vk_get_semaphore_handle_type(struct vk_bundle *vk)
|
||||||
|
{
|
||||||
|
#if defined(XRT_GRAPHICS_SYNC_HANDLE_IS_FD)
|
||||||
|
if (vk->external.binary_semaphore_opaque_fd) {
|
||||||
|
return VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#elif defined(XRT_GRAPHICS_SYNC_HANDLE_IS_WIN32_HANDLE)
|
||||||
|
if (vk->external.binary_semaphore_win32_handle) {
|
||||||
|
return VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#error "Need to port semaphore type code."
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef VK_KHR_timeline_semaphore
|
#ifdef VK_KHR_timeline_semaphore
|
||||||
static VkExternalSemaphoreHandleTypeFlagBits
|
static VkExternalSemaphoreHandleTypeFlagBits
|
||||||
vk_get_timeline_semaphore_handle_type(struct vk_bundle *vk)
|
vk_get_timeline_semaphore_handle_type(struct vk_bundle *vk)
|
||||||
|
@ -156,6 +176,126 @@ vk_create_and_submit_fence_native(struct vk_bundle *vk, xrt_graphics_sync_handle
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XRT_CHECK_RESULT static VkResult
|
||||||
|
create_semaphore_and_native(struct vk_bundle *vk,
|
||||||
|
VkExternalSemaphoreHandleTypeFlagBits handle_type,
|
||||||
|
const void *next,
|
||||||
|
VkSemaphore *out_sem,
|
||||||
|
xrt_graphics_sync_handle_t *out_native)
|
||||||
|
{
|
||||||
|
xrt_graphics_sync_handle_t native = XRT_GRAPHICS_SYNC_HANDLE_INVALID;
|
||||||
|
VkSemaphore semaphore = VK_NULL_HANDLE;
|
||||||
|
VkResult ret;
|
||||||
|
|
||||||
|
VkExportSemaphoreCreateInfo export_info = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
|
||||||
|
.pNext = next,
|
||||||
|
.handleTypes = handle_type,
|
||||||
|
};
|
||||||
|
|
||||||
|
VkSemaphoreCreateInfo semaphore_create_info = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
|
||||||
|
.pNext = &export_info,
|
||||||
|
.flags = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
ret = vk->vkCreateSemaphore( //
|
||||||
|
vk->device, // dev
|
||||||
|
&semaphore_create_info, // pCreateInfo
|
||||||
|
NULL, // pAllocator
|
||||||
|
&semaphore); // pSemaphore
|
||||||
|
if (ret != VK_SUCCESS) {
|
||||||
|
VK_ERROR(vk, "vkCreateSemaphore: %s", vk_result_string(ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(XRT_GRAPHICS_SYNC_HANDLE_IS_FD)
|
||||||
|
VkSemaphoreGetFdInfoKHR get_fd_info = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
|
||||||
|
.semaphore = semaphore,
|
||||||
|
.handleType = handle_type,
|
||||||
|
};
|
||||||
|
|
||||||
|
ret = vk->vkGetSemaphoreFdKHR(vk->device, &get_fd_info, &native);
|
||||||
|
if (ret != VK_SUCCESS) {
|
||||||
|
VK_ERROR(vk, "vkGetSemaphoreFdKHR: %s", vk_result_string(ret));
|
||||||
|
vk->vkDestroySemaphore(vk->device, semaphore, NULL);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#elif defined(XRT_GRAPHICS_SYNC_HANDLE_IS_WIN32_HANDLE)
|
||||||
|
VkSemaphoreGetWin32HandleInfoKHR get_handle_info = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR,
|
||||||
|
.semaphore = semaphore,
|
||||||
|
.handleType = handle_type,
|
||||||
|
};
|
||||||
|
|
||||||
|
ret = vk->vkGetSemaphoreWin32HandleKHR(vk->device, &get_handle_info, &native);
|
||||||
|
if (ret != VK_SUCCESS) {
|
||||||
|
VK_ERROR(vk, "vkGetSemaphoreWin32HandleKHR: %s", vk_result_string(ret));
|
||||||
|
vk->vkDestroySemaphore(vk->device, semaphore, NULL);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#error "Need to port semaphore creation code."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// All done, pass ownership.
|
||||||
|
*out_sem = semaphore;
|
||||||
|
*out_native = native;
|
||||||
|
|
||||||
|
return VK_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VkResult
|
||||||
|
vk_create_semaphore_and_native(struct vk_bundle *vk, VkSemaphore *out_sem, xrt_graphics_sync_handle_t *out_native)
|
||||||
|
{
|
||||||
|
VkExternalSemaphoreHandleTypeFlagBits handle_type = 0;
|
||||||
|
|
||||||
|
handle_type = vk_get_semaphore_handle_type(vk);
|
||||||
|
if (handle_type == 0) {
|
||||||
|
VK_ERROR(vk, "No semaphore type supported for export/import.");
|
||||||
|
return VK_ERROR_FEATURE_NOT_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return create_semaphore_and_native( //
|
||||||
|
vk, // vk_bundle
|
||||||
|
handle_type, // handle_type
|
||||||
|
NULL, // next
|
||||||
|
out_sem, // out_sem
|
||||||
|
out_native); // out_native
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VK_KHR_timeline_semaphore
|
||||||
|
VkResult
|
||||||
|
vk_create_timeline_semaphore_and_native(struct vk_bundle *vk,
|
||||||
|
VkSemaphore *out_sem,
|
||||||
|
xrt_graphics_sync_handle_t *out_native)
|
||||||
|
{
|
||||||
|
VkExternalSemaphoreHandleTypeFlagBits handle_type = 0;
|
||||||
|
|
||||||
|
handle_type = vk_get_timeline_semaphore_handle_type(vk);
|
||||||
|
if (handle_type == 0) {
|
||||||
|
VK_ERROR(vk, "No timeline semaphore type supported for export/import.");
|
||||||
|
return VK_ERROR_FEATURE_NOT_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
VkSemaphoreTypeCreateInfo type_info = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
|
||||||
|
.pNext = NULL,
|
||||||
|
.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
|
||||||
|
.initialValue = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
return create_semaphore_and_native( //
|
||||||
|
vk, // vk_bundle
|
||||||
|
handle_type, // handle_type
|
||||||
|
&type_info, // next
|
||||||
|
out_sem, // out_sem
|
||||||
|
out_native); // out_native
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
|
|
|
@ -81,78 +81,13 @@ comp_semaphore_create(struct vk_bundle *vk,
|
||||||
return XRT_ERROR_VULKAN;
|
return XRT_ERROR_VULKAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkExternalSemaphoreHandleTypeFlags handle_type = 0;
|
VkSemaphore semaphore;
|
||||||
|
ret = vk_create_timeline_semaphore_and_native(vk, &semaphore, out_handle);
|
||||||
|
|
||||||
#if defined(XRT_GRAPHICS_SYNC_HANDLE_IS_FD)
|
|
||||||
if (!vk->external.timeline_semaphore_opaque_fd) {
|
|
||||||
VK_ERROR(vk, "External timeline semaphore opaque fd not supported!");
|
|
||||||
return XRT_ERROR_VULKAN;
|
|
||||||
} else {
|
|
||||||
handle_type = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT;
|
|
||||||
}
|
|
||||||
#elif defined(XRT_GRAPHICS_SYNC_HANDLE_IS_WIN32_HANDLE)
|
|
||||||
if (!vk->external.timeline_semaphore_win32_handle) {
|
|
||||||
VK_ERROR(vk, "External timeline semaphore win32 handle not supported!");
|
|
||||||
return XRT_ERROR_VULKAN;
|
|
||||||
} else {
|
|
||||||
handle_type = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#error "Need to port semaphore creation code."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
VkExportSemaphoreCreateInfo export_info = {
|
|
||||||
.sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
|
|
||||||
.handleTypes = handle_type,
|
|
||||||
};
|
|
||||||
|
|
||||||
VkSemaphoreTypeCreateInfo type_info = {
|
|
||||||
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
|
|
||||||
.pNext = &export_info,
|
|
||||||
.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
|
|
||||||
.initialValue = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
VkSemaphoreCreateInfo semaphore_create_info = {
|
|
||||||
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
|
|
||||||
.pNext = &type_info,
|
|
||||||
.flags = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
VkSemaphore semaphore = VK_NULL_HANDLE;
|
|
||||||
ret = vk->vkCreateSemaphore( //
|
|
||||||
vk->device, // dev
|
|
||||||
&semaphore_create_info, // pCreateInfo
|
|
||||||
NULL, // pAllocator
|
|
||||||
&semaphore); // pSemaphore
|
|
||||||
if (ret != VK_SUCCESS) {
|
if (ret != VK_SUCCESS) {
|
||||||
VK_ERROR(vk, "vkCreateSemaphore: %s", vk_result_string(ret));
|
|
||||||
return XRT_ERROR_VULKAN;
|
return XRT_ERROR_VULKAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(XRT_GRAPHICS_SYNC_HANDLE_IS_FD)
|
|
||||||
VkSemaphoreGetFdInfoKHR get_fd_info = {
|
|
||||||
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
|
|
||||||
.semaphore = semaphore,
|
|
||||||
.handleType = handle_type,
|
|
||||||
};
|
|
||||||
|
|
||||||
ret = vk->vkGetSemaphoreFdKHR(vk->device, &get_fd_info, out_handle);
|
|
||||||
if (ret != VK_SUCCESS) {
|
|
||||||
VK_ERROR(vk, "vkGetSemaphoreFdKHR: %s", vk_result_string(ret));
|
|
||||||
vk->vkDestroySemaphore(vk->device, semaphore, NULL);
|
|
||||||
return XRT_ERROR_VULKAN;
|
|
||||||
}
|
|
||||||
#elif defined(XRT_GRAPHICS_SYNC_HANDLE_IS_WIN32_HANDLE)
|
|
||||||
#error "No windows port"
|
|
||||||
#else
|
|
||||||
#error "Need to port semaphore creation code."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
struct comp_semaphore *csem = U_TYPED_CALLOC(struct comp_semaphore);
|
struct comp_semaphore *csem = U_TYPED_CALLOC(struct comp_semaphore);
|
||||||
|
|
||||||
csem->base.reference.count = 1;
|
csem->base.reference.count = 1;
|
||||||
|
|
Loading…
Reference in a new issue