summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2019-03-22 20:39:37 +1000
committerStenzek <stenzek@gmail.com>2019-03-29 20:06:56 +1000
commit6561850f2bbb8e6faa98e23bdf8293c002fbd405 (patch)
tree095196ca8f4a8915997719e47fb9ea81478357cc /Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
parent86da28257026e8f23b1fdcbda5630b8980105313 (diff)
Vulkan: Support subgroup reduction operations via GL_KHR_shader_subgroup
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/VulkanContext.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/VulkanContext.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
index 51c0cde329..52038e39dc 100644
--- a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
+++ b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
@@ -384,6 +384,7 @@ std::unique_ptr<VulkanContext> VulkanContext::Create(VkInstance instance, VkPhys
// Initialize DriverDetails so that we can check for bugs to disable features if needed.
context->InitDriverDetails();
+ context->PopulateShaderSubgroupSupport();
// Enable debug reports if the "Host GPU" log category is enabled.
if (enable_debug_reports)
@@ -864,4 +865,31 @@ void VulkanContext::InitDriverDetails()
static_cast<double>(m_device_properties.driverVersion),
DriverDetails::Family::UNKNOWN);
}
+
+void VulkanContext::PopulateShaderSubgroupSupport()
+{
+ // If this function isn't available, we don't support Vulkan 1.1.
+ if (!vkGetPhysicalDeviceProperties2)
+ return;
+
+ VkPhysicalDeviceProperties2 device_properties_2 = {};
+ device_properties_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+
+ VkPhysicalDeviceSubgroupProperties subgroup_properties = {};
+ subgroup_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
+ device_properties_2.pNext = &subgroup_properties;
+
+ vkGetPhysicalDeviceProperties2(m_physical_device, &device_properties_2);
+
+ m_shader_subgroup_size = subgroup_properties.subgroupSize;
+
+ // We require basic ops (for gl_SubgroupInvocationID), ballot (for subgroupBallot,
+ // subgroupBallotFindLSB), and arithmetic (for subgroupMin/subgroupMax).
+ constexpr VkSubgroupFeatureFlags required_operations = VK_SUBGROUP_FEATURE_BASIC_BIT |
+ VK_SUBGROUP_FEATURE_ARITHMETIC_BIT |
+ VK_SUBGROUP_FEATURE_BALLOT_BIT;
+ m_supports_shader_subgroup_operations =
+ (subgroup_properties.supportedOperations & required_operations) == required_operations &&
+ subgroup_properties.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT;
+}
} // namespace Vulkan