diff options
author | Mohan Maiya <m.maiya@samsung.com> | 2024-02-25 05:12:21 -0800 |
---|---|---|
committer | Angle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2024-02-29 04:26:48 +0000 |
commit | cdf6220c289e36d85dfb0e3ae74b8f8ca676d818 (patch) | |
tree | b88df7a6d9e2ddd19daf6d916a72d80b98a3e2b9 | |
parent | a971e5b42e1e8e61ccb0d8e4b3f2245aaa4f2d4d (diff) | |
download | angle-cdf6220c289e36d85dfb0e3ae74b8f8ca676d818.tar.gz |
Reland "Vulkan: Feature addition for QCOM foveated rendering extensions"
This is a reland of commit 72cf9915f561ca6ca72fa4b6c84c36bba815bf29
In the reland, cache the sample counts as VkSampleCountFlags type
and clamp framebufferColorSampleCounts with kSupportedSampleCounts
Also evaluate supportsImagelessFramebuffer feature before evaluating
supportsFoveatedRendering
Original change's description:
> Vulkan: Feature addition for QCOM foveated rendering extensions
>
> Add a new vulkan feature gating support for QCOM foveated rendering
> extensions and cache shading rates and sample counts of Vulkan ICD.
>
> Bug: angleproject:8484
> Change-Id: Id2925541098a605749f93ad5a54c885f4a4a2c66
> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5322317
> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Bug: angleproject:8484
Change-Id: Ie831d27ecc0e1429a3fe365d7728f264496e234c
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5328188
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
-rw-r--r-- | include/platform/autogen/FeaturesVk_autogen.h | 7 | ||||
-rw-r--r-- | include/platform/vk_features.json | 8 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/RendererVk.cpp | 144 | ||||
-rw-r--r-- | src/libANGLE/renderer/vulkan/RendererVk.h | 15 | ||||
-rw-r--r-- | util/autogen/angle_features_autogen.cpp | 1 | ||||
-rw-r--r-- | util/autogen/angle_features_autogen.h | 1 |
6 files changed, 138 insertions, 38 deletions
diff --git a/include/platform/autogen/FeaturesVk_autogen.h b/include/platform/autogen/FeaturesVk_autogen.h index 59897e9ce8..8fea0cd17e 100644 --- a/include/platform/autogen/FeaturesVk_autogen.h +++ b/include/platform/autogen/FeaturesVk_autogen.h @@ -931,6 +931,13 @@ struct FeaturesVk : FeatureSetBase &members, "http://anglebug.com/7172" }; + FeatureInfo supportsFoveatedRendering = { + "supportsFoveatedRendering", + FeatureCategory::VulkanFeatures, + "Use VK_KHR_fragment_shading_rate extension to implement QCOM foveated rendering extensions", + &members, "http://anglebug.com/8484" + }; + FeatureInfo supportsFragmentShaderPixelInterlock = { "supportsFragmentShaderPixelInterlock", FeatureCategory::VulkanFeatures, diff --git a/include/platform/vk_features.json b/include/platform/vk_features.json index 9e3fbf54c4..6a56b51125 100644 --- a/include/platform/vk_features.json +++ b/include/platform/vk_features.json @@ -1008,6 +1008,14 @@ "issue": "http://anglebug.com/7172" }, { + "name": "supports_foveated_rendering", + "category": "Features", + "description": [ + "Use VK_KHR_fragment_shading_rate extension to implement QCOM foveated rendering extensions" + ], + "issue": "http://anglebug.com/8484" + }, + { "name": "supports_fragment_shader_pixel_interlock", "category": "Features", "description": [ diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp index 4da4dec02b..3e9e741b8e 100644 --- a/src/libANGLE/renderer/vulkan/RendererVk.cpp +++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp @@ -1333,28 +1333,41 @@ constexpr char kEnableDebugMarkersPropertyName[] = "debug.angle.markers"; ANGLE_INLINE gl::ShadingRate GetShadingRateFromVkExtent(const VkExtent2D &extent) { - if (extent.width == 1 && extent.height == 2) + if (extent.width == 1) { - return gl::ShadingRate::_1x2; - } - else if (extent.width == 2 && extent.height == 1) - { - return gl::ShadingRate::_2x1; - } - else if (extent.width == 2 && extent.height == 2) - { - return gl::ShadingRate::_2x2; + if (extent.height == 1) + { + return gl::ShadingRate::_1x1; + } + else if (extent.height == 2) + { + return gl::ShadingRate::_1x2; + } } - else if (extent.width == 4 && extent.height == 2) + else if (extent.width == 2) { - return gl::ShadingRate::_4x2; + if (extent.height == 1) + { + return gl::ShadingRate::_2x1; + } + else if (extent.height == 2) + { + return gl::ShadingRate::_2x2; + } } - else if (extent.width == 4 && extent.height == 4) + else if (extent.width == 4) { - return gl::ShadingRate::_4x4; + if (extent.height == 2) + { + return gl::ShadingRate::_4x2; + } + else if (extent.height == 4) + { + return gl::ShadingRate::_4x4; + } } - return gl::ShadingRate::_1x1; + return gl::ShadingRate::Undefined; } } // namespace @@ -2258,6 +2271,7 @@ void RendererVk::appendDeviceExtensionFeaturesNotPromoted( if (ExtensionFound(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, deviceExtensionNames)) { vk::AddToPNextChain(deviceFeatures, &mFragmentShadingRateFeatures); + vk::AddToPNextChain(deviceProperties, &mFragmentShadingRateProperties); } if (ExtensionFound(VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, deviceExtensionNames)) @@ -2591,6 +2605,10 @@ void RendererVk::queryDeviceExtensionFeatures(const vk::ExtensionNameList &devic mFragmentShadingRateFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR; + mFragmentShadingRateProperties = {}; + mFragmentShadingRateProperties.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR; + mFragmentShaderInterlockFeatures = {}; mFragmentShaderInterlockFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT; @@ -3835,21 +3853,8 @@ uint32_t RendererVk::getDeviceVersion() return mDeviceVersion == 0 ? mInstanceVersion : mDeviceVersion; } -bool RendererVk::canSupportFragmentShadingRate(const vk::ExtensionNameList &deviceExtensionNames) +void RendererVk::queryAndCacheFragmentShadingRates() { - // VK_KHR_create_renderpass2 is required for VK_KHR_fragment_shading_rate - if (!mFeatures.supportsRenderpass2.enabled) - { - return false; - } - - // Device needs to support VK_KHR_fragment_shading_rate and specifically - // pipeline fragment shading rate. - if (mFragmentShadingRateFeatures.pipelineFragmentShadingRate != VK_TRUE) - { - return false; - } - // Init required functions #if !defined(ANGLE_SHARED_LIBVULKAN) InitFragmentShadingRateKHRInstanceFunction(mInstance); @@ -3874,15 +3879,36 @@ bool RendererVk::canSupportFragmentShadingRate(const vk::ExtensionNameList &devi // Cache supported fragment shading rates mSupportedFragmentShadingRates.reset(); + mSupportedFragmentShadingRateSampleCounts.fill(0u); for (const VkPhysicalDeviceFragmentShadingRateKHR &shadingRate : shadingRates) { if (shadingRate.sampleCounts == 0) { continue; } - mSupportedFragmentShadingRates.set(GetShadingRateFromVkExtent(shadingRate.fragmentSize)); + const gl::ShadingRate rate = GetShadingRateFromVkExtent(shadingRate.fragmentSize); + mSupportedFragmentShadingRates.set(rate); + mSupportedFragmentShadingRateSampleCounts[rate] = shadingRate.sampleCounts; + } +} + +bool RendererVk::canSupportFragmentShadingRate() const +{ + // VK_KHR_create_renderpass2 is required for VK_KHR_fragment_shading_rate + if (!mFeatures.supportsRenderpass2.enabled) + { + return false; } + // Device needs to support VK_KHR_fragment_shading_rate and specifically + // pipeline fragment shading rate. + if (mFragmentShadingRateFeatures.pipelineFragmentShadingRate != VK_TRUE) + { + return false; + } + + ASSERT(mSupportedFragmentShadingRates.any()); + // To implement GL_QCOM_shading_rate extension the Vulkan ICD needs to support at least the // following shading rates - // {1, 1} @@ -3895,6 +3921,38 @@ bool RendererVk::canSupportFragmentShadingRate(const vk::ExtensionNameList &devi mSupportedFragmentShadingRates.test(gl::ShadingRate::_2x2); } +bool RendererVk::canSupportFoveatedRendering() const +{ + // Device needs to support attachment fragment shading rate. + if (mFragmentShadingRateFeatures.attachmentFragmentShadingRate != VK_TRUE) + { + return false; + } + + ASSERT(mSupportedFragmentShadingRates.any()); + ASSERT(!mSupportedFragmentShadingRateSampleCounts.empty()); + + // To implement QCOM foveated rendering extensions the Vulkan ICD needs to support all sample + // count bits listed in VkPhysicalDeviceLimits::framebufferColorSampleCounts for these shading + // rates - + // {1, 1} + // {1, 2} + // {2, 1} + // {2, 2} + VkSampleCountFlags framebufferSampleCounts = + getPhysicalDeviceProperties().limits.framebufferColorSampleCounts & + vk_gl::kSupportedSampleCounts; + + return (mSupportedFragmentShadingRateSampleCounts[gl::ShadingRate::_1x1] & + framebufferSampleCounts) == framebufferSampleCounts && + (mSupportedFragmentShadingRateSampleCounts[gl::ShadingRate::_1x2] & + framebufferSampleCounts) == framebufferSampleCounts && + (mSupportedFragmentShadingRateSampleCounts[gl::ShadingRate::_2x1] & + framebufferSampleCounts) == framebufferSampleCounts && + (mSupportedFragmentShadingRateSampleCounts[gl::ShadingRate::_2x2] & + framebufferSampleCounts) == framebufferSampleCounts; +} + bool RendererVk::canPreferDeviceLocalMemoryHostVisible(VkPhysicalDeviceType deviceType) { if (deviceType == VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU) @@ -4667,21 +4725,33 @@ void RendererVk::initFeatures(DisplayVk *displayVk, mExtendedDynamicState2Features.extendedDynamicState2LogicOp == VK_TRUE && !(IsLinux() && isIntel && isMesaLessThan22_2) && !(IsAndroid() && isGalaxyS23)); + // Samsung Vulkan driver crashes in vkCmdClearAttachments() when imageless Framebuffer + // is used to begin Secondary Command Buffer before the corresponding vkCmdBeginRenderPass(). + ANGLE_FEATURE_CONDITION(&mFeatures, supportsImagelessFramebuffer, + mImagelessFramebufferFeatures.imagelessFramebuffer == VK_TRUE && + (vk::RenderPassCommandBuffer::ExecutesInline() || !isSamsung)); + + if (ExtensionFound(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, deviceExtensionNames)) + { + queryAndCacheFragmentShadingRates(); + } + // Support GL_QCOM_shading_rate extension ANGLE_FEATURE_CONDITION(&mFeatures, supportsFragmentShadingRate, - canSupportFragmentShadingRate(deviceExtensionNames)); + canSupportFragmentShadingRate()); + + // Support QCOM foveated rendering extensions. + // Gated on imageless framebuffer to reduce code complexity + ANGLE_FEATURE_CONDITION(&mFeatures, supportsFoveatedRendering, + mFeatures.supportsImagelessFramebuffer.enabled && + mFeatures.supportsFragmentShadingRate.enabled && + canSupportFoveatedRendering()); // We can use the interlock to support GL_ANGLE_shader_pixel_local_storage_coherent. ANGLE_FEATURE_CONDITION( &mFeatures, supportsFragmentShaderPixelInterlock, mFragmentShaderInterlockFeatures.fragmentShaderPixelInterlock == VK_TRUE); - // Samsung Vulkan driver crashes in vkCmdClearAttachments() when imageless Framebuffer - // is used to begin Secondary Command Buffer before the corresponding vkCmdBeginRenderPass(). - ANGLE_FEATURE_CONDITION(&mFeatures, supportsImagelessFramebuffer, - mImagelessFramebufferFeatures.imagelessFramebuffer == VK_TRUE && - (vk::RenderPassCommandBuffer::ExecutesInline() || !isSamsung)); - // The VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT behavior is used by // ANGLE, which requires the robustBufferAccess feature to be available. ANGLE_FEATURE_CONDITION(&mFeatures, supportsPipelineRobustness, diff --git a/src/libANGLE/renderer/vulkan/RendererVk.h b/src/libANGLE/renderer/vulkan/RendererVk.h index a2afb45b67..e19d64e041 100644 --- a/src/libANGLE/renderer/vulkan/RendererVk.h +++ b/src/libANGLE/renderer/vulkan/RendererVk.h @@ -555,6 +555,12 @@ class RendererVk : angle::NonCopyable return mSupportedFragmentShadingRates.test(shadingRate); } + VkExtent2D getMaxFragmentShadingRateAttachmentTexelSize() const + { + ASSERT(mFeatures.supportsFoveatedRendering.enabled); + return mFragmentShadingRateProperties.maxFragmentShadingRateAttachmentTexelSize; + } + void addBufferBlockToOrphanList(vk::BufferBlock *block) { mOrphanedBufferBlockList.add(block); } VkDeviceSize getSuballocationDestroyedSize() const @@ -768,7 +774,11 @@ class RendererVk : angle::NonCopyable angle::Result initializeMemoryAllocator(DisplayVk *displayVk); // Query and cache supported fragment shading rates - bool canSupportFragmentShadingRate(const vk::ExtensionNameList &deviceExtensionNames); + void queryAndCacheFragmentShadingRates(); + // Determine support for shading rate based rendering + bool canSupportFragmentShadingRate() const; + // Determine support for foveated rendering + bool canSupportFoveatedRendering() const; // Prefer host visible device local via device local based on device type and heap size. bool canPreferDeviceLocalMemoryHostVisible(VkPhysicalDeviceType deviceType); @@ -863,6 +873,7 @@ class RendererVk : angle::NonCopyable VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT mGraphicsPipelineLibraryProperties; VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT mVertexInputDynamicStateFeatures; VkPhysicalDeviceFragmentShadingRateFeaturesKHR mFragmentShadingRateFeatures; + VkPhysicalDeviceFragmentShadingRatePropertiesKHR mFragmentShadingRateProperties; VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT mFragmentShaderInterlockFeatures; VkPhysicalDeviceImagelessFramebufferFeaturesKHR mImagelessFramebufferFeatures; VkPhysicalDevicePipelineRobustnessFeaturesEXT mPipelineRobustnessFeatures; @@ -883,6 +894,8 @@ class RendererVk : angle::NonCopyable #endif angle::PackedEnumBitSet<gl::ShadingRate, uint8_t> mSupportedFragmentShadingRates; + angle::PackedEnumMap<gl::ShadingRate, VkSampleCountFlags> + mSupportedFragmentShadingRateSampleCounts; std::vector<VkQueueFamilyProperties> mQueueFamilyProperties; uint32_t mMaxVertexAttribDivisor; uint32_t mCurrentQueueFamilyIndex; diff --git a/util/autogen/angle_features_autogen.cpp b/util/autogen/angle_features_autogen.cpp index 478f1978ae..e8c359cafe 100644 --- a/util/autogen/angle_features_autogen.cpp +++ b/util/autogen/angle_features_autogen.cpp @@ -297,6 +297,7 @@ constexpr PackedEnumMap<Feature, const char *> kFeatureNames = {{ {Feature::SupportsExternalSemaphoreFd, "supportsExternalSemaphoreFd"}, {Feature::SupportsExternalSemaphoreFuchsia, "supportsExternalSemaphoreFuchsia"}, {Feature::SupportsFormatFeatureFlags2, "supportsFormatFeatureFlags2"}, + {Feature::SupportsFoveatedRendering, "supportsFoveatedRendering"}, {Feature::SupportsFragmentShaderInterlockARB, "supportsFragmentShaderInterlockARB"}, {Feature::SupportsFragmentShaderInterlockNV, "supportsFragmentShaderInterlockNV"}, {Feature::SupportsFragmentShaderOrderingINTEL, "supportsFragmentShaderOrderingINTEL"}, diff --git a/util/autogen/angle_features_autogen.h b/util/autogen/angle_features_autogen.h index 6d90c1a716..1f8adf4a4b 100644 --- a/util/autogen/angle_features_autogen.h +++ b/util/autogen/angle_features_autogen.h @@ -297,6 +297,7 @@ enum class Feature SupportsExternalSemaphoreFd, SupportsExternalSemaphoreFuchsia, SupportsFormatFeatureFlags2, + SupportsFoveatedRendering, SupportsFragmentShaderInterlockARB, SupportsFragmentShaderInterlockNV, SupportsFragmentShaderOrderingINTEL, |