vulkan: Add support for D3D12 fences

This commit is contained in:
Benjamin Otte
2024-11-07 22:01:57 +01:00
parent 3e9b6abdec
commit 847c7e2315
5 changed files with 49 additions and 2 deletions

View File

@@ -52,8 +52,9 @@ typedef enum {
GDK_VULKAN_FEATURE_TIMELINE_SEMAPHORE = 1 << 3,
GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT = 1 << 4,
GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT = 1 << 5,
GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT = 1 << 6,
GDK_VULKAN_FEATURE_SWAPCHAIN_MAINTENANCE = 1 << 7,
GDK_VULKAN_FEATURE_WIN32_SEMAPHORE = 1 << 6,
GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT = 1 << 7,
GDK_VULKAN_FEATURE_SWAPCHAIN_MAINTENANCE = 1 << 8,
} GdkVulkanFeatures;
#define GDK_VULKAN_N_FEATURES 6

View File

@@ -42,6 +42,7 @@ const GdkDebugKey gdk_vulkan_feature_keys[] = {
{ "timeline-semaphore", GDK_VULKAN_FEATURE_TIMELINE_SEMAPHORE, "Disable timeline semaphore support (disables Windows sync)"},
{ "semaphore-export", GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT, "Disable sync of exported dmabufs" },
{ "semaphore-import", GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT, "Disable sync of imported dmabufs" },
{ "win32-semaphore", GDK_VULKAN_FEATURE_WIN32_SEMAPHORE, "Disable Windows sync support" },
{ "incremental-present", GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT, "Do not send damage regions" },
{ "swapchain-maintenance", GDK_VULKAN_FEATURE_SWAPCHAIN_MAINTENANCE, "Do not use advanced swapchain features" },
};
@@ -639,6 +640,10 @@ physical_device_check_features (VkPhysicalDevice device)
#ifdef GDK_WINDOWING_WIN32
if (physical_device_supports_extension (device, VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME))
features |= GDK_VULKAN_FEATURE_WIN32;
if ((features & GDK_VULKAN_FEATURE_TIMELINE_SEMAPHORE) &&
physical_device_supports_extension (device, VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME))
features |= GDK_VULKAN_FEATURE_WIN32_SEMAPHORE;
#endif
if (physical_device_supports_extension (device, VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME))
@@ -1488,6 +1493,8 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
G_N_ELEMENTS (gdk_vulkan_feature_keys));
if (skip_features & GDK_VULKAN_FEATURE_YCBCR)
skip_features |= GDK_VULKAN_FEATURE_DMABUF;
if (skip_features & GDK_VULKAN_FEATURE_TIMELINE_SEMAPHORE)
skip_features |= GDK_VULKAN_FEATURE_WIN32_SEMAPHORE;
if (GDK_DISPLAY_DEBUG_CHECK (display, VULKAN))
{
@@ -1595,6 +1602,10 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
}
if (features & GDK_VULKAN_FEATURE_WIN32_SEMAPHORE)
{
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME);
}
#endif
if (features & (GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT | GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT))
{

View File

@@ -239,6 +239,9 @@ gsk_vulkan_frame_upload_texture (GskGpuFrame *frame,
image = gsk_vulkan_image_new_for_d3d12resource (GSK_VULKAN_DEVICE (gsk_gpu_frame_get_device (frame)),
gdk_d3d12_texture_get_resource (d3d_texture),
gdk_d3d12_texture_get_resource_handle (d3d_texture),
gdk_d3d12_texture_get_fence (d3d_texture),
gdk_d3d12_texture_get_fence_handle (d3d_texture),
gdk_d3d12_texture_get_fence_wait (d3d_texture),
gdk_memory_format_alpha (gdk_texture_get_format (texture)) != GDK_MEMORY_ALPHA_STRAIGHT);
if (image)
{

View File

@@ -1300,6 +1300,9 @@ GskGpuImage *
gsk_vulkan_image_new_for_d3d12resource (GskVulkanDevice *device,
ID3D12Resource *resource,
HANDLE resource_handle,
ID3D12Fence *fence,
HANDLE fence_handle,
guint64 fence_wait,
gboolean premultiplied)
{
GskVulkanImage *self;
@@ -1465,6 +1468,32 @@ gsk_vulkan_image_new_for_d3d12resource (GskVulkanDevice *device,
.memoryOffset = self->allocation.offset,
});
if (gsk_vulkan_device_has_feature (device, GDK_VULKAN_FEATURE_WIN32_SEMAPHORE) && fence)
{
PFN_vkImportSemaphoreWin32HandleKHR func_vkImportSemaphoreWin32HandleKHR;
func_vkImportSemaphoreWin32HandleKHR = (PFN_vkImportSemaphoreWin32HandleKHR) vkGetDeviceProcAddr (vk_device, "vkImportSemaphoreWin32HandleKHR");
GSK_VK_CHECK (vkCreateSemaphore, vk_device,
&(VkSemaphoreCreateInfo) {
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
.pNext = &(VkSemaphoreTypeCreateInfo) {
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
},
},
NULL,
&self->vk_semaphore);
GSK_VK_CHECK (func_vkImportSemaphoreWin32HandleKHR, vk_device,
&(VkImportSemaphoreWin32HandleInfoKHR) {
.sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,
.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,
.semaphore = self->vk_semaphore,
.handle = fence_handle,
});
self->vk_semaphore_wait = fence_wait;
}
if (is_yuv)
{
self->ycbcr = gsk_vulkan_device_get_ycbcr (device, vk_format);

View File

@@ -55,6 +55,9 @@ GdkTexture * gsk_vulkan_image_to_dmabuf_texture (GskVulk
GskGpuImage * gsk_vulkan_image_new_for_d3d12resource (GskVulkanDevice *device,
ID3D12Resource *resource,
HANDLE resource_handle,
ID3D12Fence *fence,
HANDLE fence_handle,
guint64 fence_wait,
gboolean premultiplied);
#endif