Just because a modifier is returned for the given format, that doesn't mean it works with all usages and flags. We need to filter the list by calling vkGetPhysicalDeviceImageFormatProperties2. --- src/vulkan/wsi/wsi_common.c | 32 +++++++++++++++++++++++++++++++- src/vulkan/wsi/wsi_common.h | 1 + 2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 52a91ad9450..6401f136849 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -76,6 +76,7 @@ wsi_device_init(struct wsi_device *wsi, WSI_GET_CB(GetMemoryFdKHR); WSI_GET_CB(GetPhysicalDeviceFormatProperties); WSI_GET_CB(GetPhysicalDeviceFormatProperties2KHR); + WSI_GET_CB(GetPhysicalDeviceImageFormatProperties2); WSI_GET_CB(ResetFences); WSI_GET_CB(QueueSubmit); WSI_GET_CB(WaitForFences); @@ -289,7 +290,36 @@ wsi_create_native_image(const struct wsi_swapchain *chain, wsi->GetPhysicalDeviceFormatProperties2KHR(wsi->pdevice, pCreateInfo->imageFormat, &format_props); - modifier_prop_count = modifier_props_list.drmFormatModifierCount; + + /* Call GetImageFormatProperties with every modifier and filter the list + * down to those that we know work. + */ + modifier_prop_count = 0; + for (uint32_t i = 0; i < modifier_props_list.drmFormatModifierCount; i++) { + VkPhysicalDeviceImageDrmFormatModifierInfoEXT mod_info = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT, + .pNext = NULL, + .drmFormatModifier = modifier_props[i].drmFormatModifier, + }; + VkPhysicalDeviceImageFormatInfo2 format_info = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, + .pNext = &mod_info, + .format = pCreateInfo->imageFormat, + .type = VK_IMAGE_TYPE_2D, + .tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, + .usage = pCreateInfo->imageUsage, + .flags = 0, + }; + VkImageFormatProperties2 format_props = { + .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, + .pNext = NULL, + }; + result = wsi->GetPhysicalDeviceImageFormatProperties2(wsi->pdevice, + &format_info, + &format_props); + if (result == VK_SUCCESS) + modifier_props[modifier_prop_count++] = modifier_props[i]; + } uint32_t max_modifier_count = 0; for (uint32_t l = 0; l < num_modifier_lists; l++) diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 69f0a52c3e8..c0c3eb3b873 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -103,6 +103,7 @@ struct wsi_device { WSI_CB(GetMemoryFdKHR); WSI_CB(GetPhysicalDeviceFormatProperties); WSI_CB(GetPhysicalDeviceFormatProperties2KHR); + WSI_CB(GetPhysicalDeviceImageFormatProperties2); WSI_CB(ResetFences); WSI_CB(QueueSubmit); WSI_CB(WaitForFences); -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev