aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohan Maiya <m.maiya@samsung.com>2024-02-25 05:12:21 -0800
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-02-29 04:26:48 +0000
commitcdf6220c289e36d85dfb0e3ae74b8f8ca676d818 (patch)
treeb88df7a6d9e2ddd19daf6d916a72d80b98a3e2b9
parenta971e5b42e1e8e61ccb0d8e4b3f2245aaa4f2d4d (diff)
downloadangle-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.h7
-rw-r--r--include/platform/vk_features.json8
-rw-r--r--src/libANGLE/renderer/vulkan/RendererVk.cpp144
-rw-r--r--src/libANGLE/renderer/vulkan/RendererVk.h15
-rw-r--r--util/autogen/angle_features_autogen.cpp1
-rw-r--r--util/autogen/angle_features_autogen.h1
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,