summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/PixelShaderGen.cpp
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2021-04-14 07:04:16 -0400
committerGitHub <noreply@github.com>2021-04-14 07:04:16 -0400
commit14959a1087b05500c5704b59e7d694d941d4a5cf (patch)
tree43748455f196eb02f5f69b866f075844e725773e /Source/Core/VideoCommon/PixelShaderGen.cpp
parente8ac63d159d905d0765e29534233943a381ca8db (diff)
parentaba9cae5ab5749f1a86cdf56f3e6c7b6906d8d8c (diff)
Merge pull request #9636 from sspacelynx/mali-broken-and
DriverDetails: Fix broken vector bitwise AND on Mali drivers
Diffstat (limited to 'Source/Core/VideoCommon/PixelShaderGen.cpp')
-rw-r--r--Source/Core/VideoCommon/PixelShaderGen.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp
index b4e99cd3c6..ab59bfd52a 100644
--- a/Source/Core/VideoCommon/PixelShaderGen.cpp
+++ b/Source/Core/VideoCommon/PixelShaderGen.cpp
@@ -1252,12 +1252,24 @@ static void WriteStage(ShaderCode& out, const pixel_shader_uid_data* uid_data, i
if (ac.dest >= TevOutput::Color0)
out.SetConstantsUsed(C_COLORS + u32(ac.dest.Value()), C_COLORS + u32(ac.dest.Value()));
- out.Write("\ttevin_a = int4({}, {})&int4(255, 255, 255, 255);\n",
- tev_c_input_table[u32(cc.a.Value())], tev_a_input_table[u32(ac.a.Value())]);
- out.Write("\ttevin_b = int4({}, {})&int4(255, 255, 255, 255);\n",
- tev_c_input_table[u32(cc.b.Value())], tev_a_input_table[u32(ac.b.Value())]);
- out.Write("\ttevin_c = int4({}, {})&int4(255, 255, 255, 255);\n",
- tev_c_input_table[u32(cc.c.Value())], tev_a_input_table[u32(ac.c.Value())]);
+ if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_VECTOR_BITWISE_AND))
+ {
+ out.Write("\ttevin_a = int4({} & 255, {} & 255);\n", tev_c_input_table[u32(cc.a.Value())],
+ tev_a_input_table[u32(ac.a.Value())]);
+ out.Write("\ttevin_b = int4({} & 255, {} & 255);\n", tev_c_input_table[u32(cc.b.Value())],
+ tev_a_input_table[u32(ac.b.Value())]);
+ out.Write("\ttevin_c = int4({} & 255, {} & 255);\n", tev_c_input_table[u32(cc.c.Value())],
+ tev_a_input_table[u32(ac.c.Value())]);
+ }
+ else
+ {
+ out.Write("\ttevin_a = int4({}, {})&int4(255, 255, 255, 255);\n",
+ tev_c_input_table[u32(cc.a.Value())], tev_a_input_table[u32(ac.a.Value())]);
+ out.Write("\ttevin_b = int4({}, {})&int4(255, 255, 255, 255);\n",
+ tev_c_input_table[u32(cc.b.Value())], tev_a_input_table[u32(ac.b.Value())]);
+ out.Write("\ttevin_c = int4({}, {})&int4(255, 255, 255, 255);\n",
+ tev_c_input_table[u32(cc.c.Value())], tev_a_input_table[u32(ac.c.Value())]);
+ }
out.Write("\ttevin_d = int4({}, {});\n", tev_c_input_table[u32(cc.d.Value())],
tev_a_input_table[u32(ac.d.Value())]);