diff options
| author | Stenzek <stenzek@gmail.com> | 2019-03-22 20:39:37 +1000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2019-03-29 20:06:56 +1000 |
| commit | 6561850f2bbb8e6faa98e23bdf8293c002fbd405 (patch) | |
| tree | 095196ca8f4a8915997719e47fb9ea81478357cc /Source/Core/VideoBackends/Vulkan/VulkanContext.cpp | |
| parent | 86da28257026e8f23b1fdcbda5630b8980105313 (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.cpp | 28 |
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 |
