mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-18 06:47:31 -04:00
render/vulkan: use VK_EXT_external_memory_host for uploads
This allows the Vulkan driver to directly access client buffers. References: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3264
This commit is contained in:
parent
4565b07484
commit
edc2f7222a
3 changed files with 172 additions and 30 deletions
|
|
@ -457,17 +457,16 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
|||
// For dmabuf import we require at least the external_memory_fd,
|
||||
// external_memory_dma_buf, queue_family_foreign and
|
||||
// image_drm_format_modifier extensions.
|
||||
const char *extensions[] = {
|
||||
VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
|
||||
VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
|
||||
VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, // or vulkan 1.2
|
||||
VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME,
|
||||
VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME,
|
||||
VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,
|
||||
VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, // or vulkan 1.2
|
||||
VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, // or vulkan 1.3
|
||||
};
|
||||
size_t extensions_len = sizeof(extensions) / sizeof(extensions[0]);
|
||||
const char *extensions[32] = {0};
|
||||
size_t extensions_len = 0;
|
||||
extensions[extensions_len++] = VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME;
|
||||
extensions[extensions_len++] = VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME;
|
||||
extensions[extensions_len++] = VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME; // or vulkan 1.2
|
||||
extensions[extensions_len++] = VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME;
|
||||
extensions[extensions_len++] = VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME;
|
||||
extensions[extensions_len++] = VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME;
|
||||
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
|
||||
|
||||
for (size_t i = 0; i < extensions_len; i++) {
|
||||
if (!check_extension(avail_ext_props, avail_extc, extensions[i])) {
|
||||
|
|
@ -477,6 +476,14 @@ struct wlr_vk_device *vulkan_device_create(struct wlr_vk_instance *ini,
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
assert(extensions_len < sizeof(extensions) / sizeof(extensions[0]));
|
||||
|
||||
{
|
||||
uint32_t qfam_count;
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(phdev, &qfam_count, NULL);
|
||||
|
|
@ -591,6 +598,11 @@ 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);
|
||||
}
|
||||
|
||||
size_t max_fmts;
|
||||
const struct wlr_vk_format *fmts = vulkan_get_format_list(&max_fmts);
|
||||
dev->shm_formats = calloc(max_fmts, sizeof(*dev->shm_formats));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue