From e29d643e5215c42f1aba7c5cd9925129212b6e05 Mon Sep 17 00:00:00 2001 From: Shahbaz Youssefi Date: Tue, 7 May 2024 13:40:18 -0400 Subject: Vulkan: Fix missing per-present-mode query ... if VK_EXT_surface_maintenance1 is supported but VK_EXT_swapchain_maintenance1 isn't. The code mistakenly made the appropriate query conditional to the presence of swapchain_maint1 instead of surface_maint1. On devices where surface_maint1 was available but swapchain_maint1 wasn't, this caused a VVL error that is now fixed. Bug: angleproject:8680 Change-Id: Ide9a87f0e50887572f693d741d5476361320ea19 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5522756 Reviewed-by: Cody Northrop Reviewed-by: Charlie Lao Commit-Queue: Shahbaz Youssefi --- include/platform/autogen/FeaturesVk_autogen.h | 7 ++++++ include/platform/vk_features.json | 8 +++++++ src/libANGLE/renderer/vulkan/SurfaceVk.cpp | 31 ++++++++++++++++----------- src/libANGLE/renderer/vulkan/vk_renderer.cpp | 9 +++++--- util/autogen/angle_features_autogen.cpp | 1 + util/autogen/angle_features_autogen.h | 1 + 6 files changed, 41 insertions(+), 16 deletions(-) diff --git a/include/platform/autogen/FeaturesVk_autogen.h b/include/platform/autogen/FeaturesVk_autogen.h index 876f85421b..581d373b7e 100644 --- a/include/platform/autogen/FeaturesVk_autogen.h +++ b/include/platform/autogen/FeaturesVk_autogen.h @@ -1151,6 +1151,13 @@ struct FeaturesVk : FeatureSetBase &members, "https://anglebug.com/7899" }; + FeatureInfo supportsSurfaceMaintenance1 = { + "supportsSurfaceMaintenance1", + FeatureCategory::VulkanFeatures, + "VkDevice supports the VK_EXT_surface_maintenance1 extension", + &members, "https://anglebug.com/7847" + }; + FeatureInfo supportsSwapchainMaintenance1 = { "supportsSwapchainMaintenance1", FeatureCategory::VulkanFeatures, diff --git a/include/platform/vk_features.json b/include/platform/vk_features.json index 8d4529dbfa..b5b557bd60 100644 --- a/include/platform/vk_features.json +++ b/include/platform/vk_features.json @@ -1252,6 +1252,14 @@ ], "issue": "https://anglebug.com/7899" }, + { + "name": "supports_surface_maintenance1", + "category": "Features", + "description": [ + "VkDevice supports the VK_EXT_surface_maintenance1 extension" + ], + "issue": "https://anglebug.com/7847" + }, { "name": "supports_swapchain_maintenance1", "category": "Features", diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp index e22771208c..8bde953c9a 100644 --- a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp +++ b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp @@ -1647,9 +1647,9 @@ angle::Result WindowSurfaceVk::createSwapChain(vk::Context *context, } } - // Get the list of compatible present modes to avoid unnecessary swapchain recreation. - VkSwapchainPresentModesCreateInfoEXT compatibleModesInfo = {}; - if (renderer->getFeatures().supportsSwapchainMaintenance1.enabled) + // Get the list of compatible present modes to avoid unnecessary swapchain recreation. Also + // update minImageCount with the per-present limit. + if (renderer->getFeatures().supportsSurfaceMaintenance1.enabled) { VkPhysicalDeviceSurfaceInfo2KHR surfaceInfo2 = {}; surfaceInfo2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR; @@ -1676,19 +1676,10 @@ angle::Result WindowSurfaceVk::createSwapChain(vk::Context *context, mCompatiblePresentModes.resize(compatibleModes.presentModeCount); - // The implementation must always return the given preesnt mode as compatible with itself. + // The implementation must always return the given present mode as compatible with itself. ASSERT(IsCompatiblePresentMode(mDesiredSwapchainPresentMode, mCompatiblePresentModes.data(), mCompatiblePresentModes.size())); - if (compatibleModes.presentModeCount > 1) - { - compatibleModesInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT; - compatibleModesInfo.presentModeCount = compatibleModes.presentModeCount; - compatibleModesInfo.pPresentModes = mCompatiblePresentModes.data(); - - vk::AddToPNextChain(&swapchainInfo, &compatibleModesInfo); - } - // Vulkan spec says "The per-present mode image counts may be less-than or greater-than the // image counts returned when VkSurfacePresentModeEXT is not provided.". Use the per present // mode imageCount here. Otherwise we may get into @@ -1697,6 +1688,20 @@ angle::Result WindowSurfaceVk::createSwapChain(vk::Context *context, mMinImageCount = GetMinImageCount(mSurfaceCaps); swapchainInfo.minImageCount = mMinImageCount; } + + VkSwapchainPresentModesCreateInfoEXT compatibleModesInfo = {}; + if (renderer->getFeatures().supportsSwapchainMaintenance1.enabled) + { + if (mCompatiblePresentModes.size() > 1) + { + compatibleModesInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT; + compatibleModesInfo.presentModeCount = + static_cast(mCompatiblePresentModes.size()); + compatibleModesInfo.pPresentModes = mCompatiblePresentModes.data(); + + vk::AddToPNextChain(&swapchainInfo, &compatibleModesInfo); + } + } else { // Without VK_EXT_swapchain_maintenance1, each present mode can be considered only diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.cpp b/src/libANGLE/renderer/vulkan/vk_renderer.cpp index 037b33c13f..4c4a49d719 100644 --- a/src/libANGLE/renderer/vulkan/vk_renderer.cpp +++ b/src/libANGLE/renderer/vulkan/vk_renderer.cpp @@ -284,8 +284,6 @@ constexpr const char *kSkippedMessages[] = { // https://issuetracker.google.com/336847261 "VUID-VkImageCreateInfo-pNext-02397", "VUID-vkCmdDraw-None-06550", - // https://anglebug.com/8680 - "VUID-VkSwapchainCreateInfoKHR-presentMode-02839", }; // Validation messages that should be ignored only when VK_EXT_primitive_topology_list_restart is @@ -1696,7 +1694,12 @@ angle::Result Renderer::enableInstanceExtensions(vk::Context *context, mEnabledInstanceExtensions.push_back(VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME); } - if (ExtensionFound(VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME, instanceExtensionNames)) + ANGLE_FEATURE_CONDITION( + &mFeatures, supportsSurfaceMaintenance1, + !isMockICDEnabled() && ExtensionFound(VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME, + instanceExtensionNames)); + + if (mFeatures.supportsSurfaceMaintenance1.enabled) { mEnabledInstanceExtensions.push_back(VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME); } diff --git a/util/autogen/angle_features_autogen.cpp b/util/autogen/angle_features_autogen.cpp index 89976fadf5..7758d320e9 100644 --- a/util/autogen/angle_features_autogen.cpp +++ b/util/autogen/angle_features_autogen.cpp @@ -366,6 +366,7 @@ constexpr PackedEnumMap kFeatureNames = {{ {Feature::SupportsSharedPresentableImageExtension, "supportsSharedPresentableImageExtension"}, {Feature::SupportsSurfaceCapabilities2Extension, "supportsSurfaceCapabilities2Extension"}, {Feature::SupportsSurfacelessQueryExtension, "supportsSurfacelessQueryExtension"}, + {Feature::SupportsSurfaceMaintenance1, "supportsSurfaceMaintenance1"}, {Feature::SupportsSurfaceProtectedCapabilitiesExtension, "supportsSurfaceProtectedCapabilitiesExtension"}, {Feature::SupportsSurfaceProtectedSwapchains, "supportsSurfaceProtectedSwapchains"}, {Feature::SupportsSwapchainMaintenance1, "supportsSwapchainMaintenance1"}, diff --git a/util/autogen/angle_features_autogen.h b/util/autogen/angle_features_autogen.h index 0cadb2e2e9..54b4bd1c34 100644 --- a/util/autogen/angle_features_autogen.h +++ b/util/autogen/angle_features_autogen.h @@ -366,6 +366,7 @@ enum class Feature SupportsSharedPresentableImageExtension, SupportsSurfaceCapabilities2Extension, SupportsSurfacelessQueryExtension, + SupportsSurfaceMaintenance1, SupportsSurfaceProtectedCapabilitiesExtension, SupportsSurfaceProtectedSwapchains, SupportsSwapchainMaintenance1, -- cgit v1.2.3