From 05135b4f4322d88c383d7ef17da75c331fbc5c56 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Mon, 11 Jul 2022 21:20:38 -0500 Subject: [PATCH 1/2] VideoCommon: fix uint shader compiler error in specialized shaders. This error is in renderers that use uint for their color output (for logic ops). Remove D3D check for uint output since other backends could use uint output as well. --- Source/Core/VideoCommon/PixelShaderGen.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index 79d2bd1d52..af8435270b 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -1675,9 +1675,17 @@ static void WriteAlphaTest(ShaderCode& out, const pixel_shader_uid_data* uid_dat else out.Write(")) {{\n"); - out.Write("\t\tocol0 = float4(0.0, 0.0, 0.0, 0.0);\n"); - if (use_dual_source && !(api_type == APIType::D3D && uid_data->uint_output)) - out.Write("\t\tocol1 = float4(0.0, 0.0, 0.0, 0.0);\n"); + if (uid_data->uint_output) + out.Write("\t\tocol0 = uint4(0, 0, 0, 0);\n"); + else + out.Write("\t\tocol0 = float4(0.0, 0.0, 0.0, 0.0);\n"); + if (use_dual_source) + { + if (uid_data->uint_output) + out.Write("\t\tocol1 = uint4(0, 0, 0, 0);\n"); + else + out.Write("\t\tocol1 = float4(0.0, 0.0, 0.0, 0.0);\n"); + } if (per_pixel_depth) { out.Write("\t\tdepth = {};\n", @@ -1805,8 +1813,9 @@ static void WriteLogicOp(ShaderCode& out, const pixel_shader_uid_data* uid_data) static void WriteColor(ShaderCode& out, APIType api_type, const pixel_shader_uid_data* uid_data, bool use_dual_source) { - // D3D requires that the shader outputs be uint when writing to a uint render target for logic op. - if (api_type == APIType::D3D && uid_data->uint_output) + // Some backends require the shader outputs be uint when writing to a uint render target for logic + // op. + if (uid_data->uint_output) { if (uid_data->rgba6_format) out.Write("\tocol0 = uint4(prev & 0xFC);\n"); From 637dca680ccc53a2a7183917451c356e71117894 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Sat, 6 Aug 2022 16:04:05 -0500 Subject: [PATCH 2/2] VideoCommon: update ubershader pixel to not enforce d3d when writing color output that has been defined as uints --- Source/Core/VideoCommon/UberShaderPixel.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/Core/VideoCommon/UberShaderPixel.cpp b/Source/Core/VideoCommon/UberShaderPixel.cpp index 22708f3d66..8e062ad98e 100644 --- a/Source/Core/VideoCommon/UberShaderPixel.cpp +++ b/Source/Core/VideoCommon/UberShaderPixel.cpp @@ -1092,8 +1092,9 @@ ShaderCode GenPixelShader(APIType api_type, const ShaderHostConfig& host_config, " }}\n"); } - // D3D requires that the shader outputs be uint when writing to a uint render target for logic op. - if (api_type == APIType::D3D && uid_data->uint_output) + // Some backends require that the shader outputs be uint when writing to a uint render target for + // logic op. + if (uid_data->uint_output) { out.Write(" if (bpmem_rgba6_format)\n" " ocol0 = uint4(TevResult & 0xFC);\n"