diff options
author | Jason Ekstrand <[email protected]> | 2018-10-01 16:14:24 -0500 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-01-17 18:27:29 +0000 |
commit | 210e68874bbf5321adc6e6464a80526c177f8741 (patch) | |
tree | a9b8e8497822c81abc772cac0610314e1789b907 /src/vulkan/wsi/wsi_common.c | |
parent | c78926b84df245cd77a881f9c4a79e4145eac42d (diff) |
vulkan/wsi: Use the interface from the real modifiers extension
The anv implementation still isn't quite complete, but we can at least
start using the structs from the real extension.
v2: Fix circular pNext list (Lionel)
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3434>
Diffstat (limited to 'src/vulkan/wsi/wsi_common.c')
-rw-r--r-- | src/vulkan/wsi/wsi_common.c | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index e8e38843fce..cc5e233093f 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -90,6 +90,7 @@ wsi_device_init(struct wsi_device *wsi, WSI_GET_CB(FreeMemory); WSI_GET_CB(FreeCommandBuffers); WSI_GET_CB(GetBufferMemoryRequirements); + WSI_GET_CB(GetImageDrmFormatModifierPropertiesEXT); WSI_GET_CB(GetImageMemoryRequirements); WSI_GET_CB(GetImageSubresourceLayout); WSI_GET_CB(GetMemoryFdKHR); @@ -350,11 +351,6 @@ wsi_create_native_image(const struct wsi_swapchain *chain, for (int i = 0; i < ARRAY_SIZE(image->fds); i++) image->fds[i] = -1; - struct wsi_image_create_info image_wsi_info = { - .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA, - .pNext = NULL, - }; - VkImageCreateInfo image_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .flags = 0, @@ -376,20 +372,24 @@ wsi_create_native_image(const struct wsi_swapchain *chain, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, }; - __vk_append_struct(&image_info, &image_wsi_info); + struct wsi_image_create_info image_wsi_info; + VkImageDrmFormatModifierListCreateInfoEXT image_modifier_list; uint32_t image_modifier_count = 0, modifier_prop_count = 0; - struct wsi_format_modifier_properties *modifier_props = NULL; + struct VkDrmFormatModifierPropertiesEXT *modifier_props = NULL; uint64_t *image_modifiers = NULL; if (num_modifier_lists == 0) { /* If we don't have modifiers, fall back to the legacy "scanout" flag */ - image_wsi_info.scanout = true; + image_wsi_info = (struct wsi_image_create_info) { + .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA, + .scanout = true, + }; + __vk_append_struct(&image_info, &image_wsi_info); } else { /* The winsys can't request modifiers if we don't support them. */ assert(wsi->supports_modifiers); - struct wsi_format_modifier_properties_list modifier_props_list = { - .sType = VK_STRUCTURE_TYPE_WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA, - .pNext = NULL, + struct VkDrmFormatModifierPropertiesListEXT modifier_props_list = { + .sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT, }; VkFormatProperties2 format_props = { .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, @@ -398,10 +398,10 @@ wsi_create_native_image(const struct wsi_swapchain *chain, wsi->GetPhysicalDeviceFormatProperties2KHR(wsi->pdevice, pCreateInfo->imageFormat, &format_props); - assert(modifier_props_list.modifier_count > 0); + assert(modifier_props_list.drmFormatModifierCount > 0); modifier_props = vk_alloc(&chain->alloc, sizeof(*modifier_props) * - modifier_props_list.modifier_count, + modifier_props_list.drmFormatModifierCount, 8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND); if (!modifier_props) { @@ -409,11 +409,11 @@ wsi_create_native_image(const struct wsi_swapchain *chain, goto fail; } - modifier_props_list.modifier_properties = modifier_props; + modifier_props_list.pDrmFormatModifierProperties = modifier_props; wsi->GetPhysicalDeviceFormatProperties2KHR(wsi->pdevice, pCreateInfo->imageFormat, &format_props); - modifier_prop_count = modifier_props_list.modifier_count; + modifier_prop_count = modifier_props_list.drmFormatModifierCount; uint32_t max_modifier_count = 0; for (uint32_t l = 0; l < num_modifier_lists; l++) @@ -436,7 +436,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain, */ for (uint32_t i = 0; i < num_modifiers[l]; i++) { for (uint32_t j = 0; j < modifier_prop_count; j++) { - if (modifier_props[j].modifier == modifiers[l][i]) + if (modifier_props[j].drmFormatModifier == modifiers[l][i]) image_modifiers[image_modifier_count++] = modifiers[l][i]; } } @@ -447,8 +447,13 @@ wsi_create_native_image(const struct wsi_swapchain *chain, } if (image_modifier_count > 0) { - image_wsi_info.modifier_count = image_modifier_count; - image_wsi_info.modifiers = image_modifiers; + image_modifier_list = (VkImageDrmFormatModifierListCreateInfoEXT) { + .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT, + .drmFormatModifierCount = image_modifier_count, + .pDrmFormatModifiers = image_modifiers, + }; + image_info.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; + __vk_append_struct(&image_info, &image_modifier_list); } else { /* TODO: Add a proper error here */ assert(!"Failed to find a supported modifier! This should never " @@ -511,12 +516,20 @@ wsi_create_native_image(const struct wsi_swapchain *chain, goto fail; if (num_modifier_lists > 0) { - image->drm_modifier = wsi->image_get_modifier(image->image); + VkImageDrmFormatModifierPropertiesEXT image_mod_props = { + .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT, + }; + result = wsi->GetImageDrmFormatModifierPropertiesEXT(chain->device, + image->image, + &image_mod_props); + if (result != VK_SUCCESS) + goto fail; + image->drm_modifier = image_mod_props.drmFormatModifier; assert(image->drm_modifier != DRM_FORMAT_MOD_INVALID); for (uint32_t j = 0; j < modifier_prop_count; j++) { - if (modifier_props[j].modifier == image->drm_modifier) { - image->num_planes = modifier_props[j].modifier_plane_count; + if (modifier_props[j].drmFormatModifier == image->drm_modifier) { + image->num_planes = modifier_props[j].drmFormatModifierPlaneCount; break; } } |