From f6993ab0da19f96965936ef840462d1069cb3677 Mon Sep 17 00:00:00 2001 From: Kenny Levinsen Date: Sun, 16 Jun 2024 12:17:41 +0200 Subject: [PATCH] render/vulkan: Prepare VK_EXT_external_memory_host --- include/render/vulkan.h | 2 ++ render/vulkan/vulkan.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/render/vulkan.h b/include/render/vulkan.h index 5b74b613e..17467a25f 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -54,6 +54,7 @@ struct wlr_vk_device { PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR; PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR; PFN_vkQueueSubmit2KHR vkQueueSubmit2KHR; + PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; } api; uint32_t format_prop_count; @@ -61,6 +62,7 @@ struct wlr_vk_device { struct wlr_drm_format_set dmabuf_render_formats; struct wlr_drm_format_set dmabuf_texture_formats; struct wlr_drm_format_set shm_texture_formats; + size_t minImportedHostPointerAlignment; }; // Tries to find the VkPhysicalDevice for the given drm fd. diff --git a/render/vulkan/vulkan.c b/render/vulkan/vulkan.c index 7cdc44a02..7582b2ab6 100644 --- a/render/vulkan/vulkan.c +++ b/render/vulkan/vulkan.c @@ -470,6 +470,12 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini, extensions[extensions_len++] = VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME; // or vulkan 1.2 extensions[extensions_len++] = VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME; // or vulkan 1.3 + bool has_ext_external_memory_host = + check_extension(avail_ext_props, avail_extc, VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME); + if (has_ext_external_memory_host) { + extensions[extensions_len++] = VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME; + } + for (size_t i = 0; i < extensions_len; i++) { if (!check_extension(avail_ext_props, avail_extc, extensions[i])) { wlr_log(WLR_ERROR, "vulkan: required device extension %s not found", @@ -621,6 +627,20 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini, load_device_proc(dev, "vkImportSemaphoreFdKHR", &dev->api.vkImportSemaphoreFdKHR); load_device_proc(dev, "vkQueueSubmit2KHR", &dev->api.vkQueueSubmit2KHR); + if (has_ext_external_memory_host) { + load_device_proc(dev, "vkGetMemoryHostPointerPropertiesEXT", + &dev->api.vkGetMemoryHostPointerPropertiesEXT); + VkPhysicalDeviceExternalMemoryHostPropertiesEXT memory_host_props = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, + }; + VkPhysicalDeviceProperties2 props = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, + .pNext = &memory_host_props, + }; + vkGetPhysicalDeviceProperties2(phdev, &props); + dev->minImportedHostPointerAlignment = memory_host_props.minImportedHostPointerAlignment; + } + size_t max_fmts; const struct wlr_vk_format *fmts = vulkan_get_format_list(&max_fmts); dev->format_props = calloc(max_fmts, sizeof(*dev->format_props));