VideoBackends:Multiple: Split up BUG_BROKEN_SUBGROUP_OPS

We now use subgroup ops for more than just a minor performance optimization
This commit is contained in:
TellowKrinkle
2023-05-17 19:28:27 -05:00
parent 6243e50b21
commit 463269f704
6 changed files with 35 additions and 14 deletions

View File

@ -245,8 +245,6 @@ void Metal::Util::PopulateBackendInfoFeatures(VideoConfig* config, id<MTLDevice>
[device supportsFamily:MTLGPUFamilyMac2] || [device supportsFamily:MTLGPUFamilyApple6];
config->backend_info.bSupportsFramebufferFetch = [device supportsFamily:MTLGPUFamilyApple1];
}
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_SUBGROUP_OPS))
g_features.subgroup_ops = false;
#if TARGET_OS_OSX
if (@available(macOS 11, *))
if (vendor == DriverDetails::VENDOR_INTEL)
@ -434,6 +432,13 @@ std::optional<std::string> Metal::Util::TranslateShaderToMSL(ShaderStage stage,
full_source.append(header);
if (Metal::g_features.subgroup_ops)
full_source.append(SUBGROUP_HELPER_HEADER);
if (DriverDetails::HasBug(DriverDetails::BUG_INVERTED_IS_HELPER))
{
full_source.append("#define gl_HelperInvocation !gl_HelperInvocation "
"// Work around broken AMD Metal driver\n");
}
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_SUBGROUP_OPS_WITH_DISCARD))
full_source.append("#define BROKEN_SUBGROUP_WITH_DISCARD 1\n");
full_source.append(source);
std::optional<SPIRV::CodeVector> code;

View File

@ -7,6 +7,7 @@
#include <string>
#include "VideoBackends/Vulkan/VulkanContext.h"
#include "VideoCommon/DriverDetails.h"
#include "VideoCommon/Spirv.h"
namespace Vulkan::ShaderCompiler
@ -98,6 +99,13 @@ static std::string GetShaderCode(std::string_view source, std::string_view heade
full_source_code.append(header);
if (g_vulkan_context->SupportsShaderSubgroupOperations())
full_source_code.append(SUBGROUP_HELPER_HEADER, subgroup_helper_header_length);
if (DriverDetails::HasBug(DriverDetails::BUG_INVERTED_IS_HELPER))
{
full_source_code.append("#define gl_HelperInvocation !gl_HelperInvocation "
"// Work around broken AMD Metal driver\n");
}
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_SUBGROUP_OPS_WITH_DISCARD))
full_source_code.append("#define BROKEN_SUBGROUP_WITH_DISCARD 1\n");
full_source_code.append(source);
}

View File

@ -1000,8 +1000,7 @@ void VulkanContext::PopulateShaderSubgroupSupport()
VK_SUBGROUP_FEATURE_BALLOT_BIT | VK_SUBGROUP_FEATURE_SHUFFLE_BIT;
m_supports_shader_subgroup_operations =
(subgroup_properties.supportedOperations & required_operations) == required_operations &&
subgroup_properties.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT &&
!DriverDetails::HasBug(DriverDetails::BUG_BROKEN_SUBGROUP_OPS);
subgroup_properties.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT;
}
bool VulkanContext::SupportsExclusiveFullscreen(const WindowSystemInfo& wsi, VkSurfaceKHR surface)