aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShahbaz Youssefi <syoussefi@chromium.org>2024-05-07 13:40:18 -0400
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-05-07 20:43:16 +0000
commite29d643e5215c42f1aba7c5cd9925129212b6e05 (patch)
tree9ac85bc95475e2161b95d0e93482190c079a0bd4
parent3d04180cb55db695109430f21b7f773d4c876efa (diff)
downloadangle-e29d643e5215c42f1aba7c5cd9925129212b6e05.tar.gz
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 <cnorthrop@google.com> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
-rw-r--r--include/platform/autogen/FeaturesVk_autogen.h7
-rw-r--r--include/platform/vk_features.json8
-rw-r--r--src/libANGLE/renderer/vulkan/SurfaceVk.cpp31
-rw-r--r--src/libANGLE/renderer/vulkan/vk_renderer.cpp9
-rw-r--r--util/autogen/angle_features_autogen.cpp1
-rw-r--r--util/autogen/angle_features_autogen.h1
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
@@ -1253,6 +1253,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",
"description": [
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<uint32_t>(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<Feature, const char *> 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,