Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #10749 from tellowkrinkle/IntelUbershaders
VideoCommon: Fix ubershaders on MoltenVK Intel
  • Loading branch information
JMC47 committed Jul 10, 2022
2 parents 38cb76d + 2592978 commit cce6133
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 16 deletions.
4 changes: 4 additions & 0 deletions Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
Expand Up @@ -377,6 +377,10 @@ void VulkanContext::PopulateBackendInfoFeatures(VideoConfig* config, VkPhysicalD
// We will use shader blending, so disable hardware dual source blending.
config->backend_info.bSupportsDualSourceBlend = false;
}

// Dynamic sampler indexing locks up Intel GPUs on MoltenVK/Metal
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_DYNAMIC_SAMPLER_INDEXING))
config->backend_info.bSupportsDynamicSamplerIndexing = false;
}

void VulkanContext::PopulateBackendInfoMultisampleModes(
Expand Down
2 changes: 2 additions & 0 deletions Source/Core/VideoCommon/DriverDetails.cpp
Expand Up @@ -140,6 +140,8 @@ constexpr BugInfo m_known_bugs[] = {
-1.0, -1.0, true},
{API_VULKAN, OS_OSX, VENDOR_APPLE, DRIVER_PORTABILITY, Family::UNKNOWN,
BUG_BROKEN_DISCARD_WITH_EARLY_Z, -1.0, -1.0, true},
{API_VULKAN, OS_OSX, VENDOR_INTEL, DRIVER_PORTABILITY, Family::UNKNOWN,
BUG_BROKEN_DYNAMIC_SAMPLER_INDEXING, -1.0, -1.0, true},
};

static std::map<Bug, BugInfo> m_bugs;
Expand Down
6 changes: 6 additions & 0 deletions Source/Core/VideoCommon/DriverDetails.h
Expand Up @@ -320,6 +320,12 @@ enum Bug
// Started version: -1
// Ended version: -1
BUG_BROKEN_DISCARD_WITH_EARLY_Z,

// BUG: Using dynamic sampler indexing locks up the GPU
// Affected devices: Intel (macOS Metal)
// Started version: -1
// Ended version: -1
BUG_BROKEN_DYNAMIC_SAMPLER_INDEXING,
};

// Initializes our internal vendor, device family, and driver version
Expand Down
23 changes: 7 additions & 16 deletions Source/Core/VideoCommon/UberShaderPixel.cpp
Expand Up @@ -485,14 +485,6 @@ ShaderCode GenPixelShader(APIType api_type, const ShaderHostConfig& host_config,
"\n"
"int4 getTevReg(in State s, uint index) {{\n");
WriteSwitch(out, api_type, "index", tev_regs_lookup_table, 2, false);
out.Write("}}\n"
"\n"
"void setRegColor(inout State s, uint index, int3 color) {{\n");
WriteSwitch(out, api_type, "index", tev_c_set_table, 2, true);
out.Write("}}\n"
"\n"
"void setRegAlpha(inout State s, uint index, int alpha) {{\n");
WriteSwitch(out, api_type, "index", tev_a_set_table, 2, true);
out.Write("}}\n"
"\n");

Expand Down Expand Up @@ -798,9 +790,9 @@ ShaderCode GenPixelShader(APIType api_type, const ShaderHostConfig& host_config,
" else\n"
" color = clamp(color, -1024, 1023);\n"
"\n"
" // Write result to the correct input register of the next stage\n"
" setRegColor(s, color_dest, color);\n"
"\n");
" // Write result to the correct input register of the next stage\n");
WriteSwitch(out, api_type, "color_dest", tev_c_set_table, 6, true);
out.Write("\n");

// Alpha combiner
out.Write(" // Alpha Combiner\n");
Expand Down Expand Up @@ -864,11 +856,10 @@ ShaderCode GenPixelShader(APIType api_type, const ShaderHostConfig& host_config,
" else\n"
" alpha = clamp(alpha, -1024, 1023);\n"
"\n"
" // Write result to the correct input register of the next stage\n"
" setRegAlpha(s, alpha_dest, alpha);\n"
" }}\n");

out.Write(" }} // Main TEV loop\n"
" // Write result to the correct input register of the next stage\n");
WriteSwitch(out, api_type, "alpha_dest", tev_a_set_table, 6, true);
out.Write(" }}\n"
" }} // Main TEV loop\n"
"\n");

// Select the output color and alpha registers from the last stage.
Expand Down

0 comments on commit cce6133

Please sign in to comment.