summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Subv2018-08-15 09:27:43 -0500
committerGravatar Subv2018-08-15 09:27:43 -0500
commit91140f6c0a64d77460c9cc740da4d7b20d314157 (patch)
tree22236019768cf55e1e3aaac15b41a7312c95c8f7 /src
parentShader/I2F: Implemented the negate I2F_C instruction variant. (diff)
downloadyuzu-91140f6c0a64d77460c9cc740da4d7b20d314157.tar.gz
yuzu-91140f6c0a64d77460c9cc740da4d7b20d314157.tar.xz
yuzu-91140f6c0a64d77460c9cc740da4d7b20d314157.zip
Shader/Conversion: Implemented the negate bit in F2F and I2I instructions.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index 218ca5261..e0dfdbb9f 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -1250,6 +1250,10 @@ private:
1250 op_a = "abs(" + op_a + ')'; 1250 op_a = "abs(" + op_a + ')';
1251 } 1251 }
1252 1252
1253 if (instr.conversion.negate_a) {
1254 op_a = "-(" + op_a + ')';
1255 }
1256
1253 regs.SetRegisterToInteger(instr.gpr0, instr.conversion.is_output_signed, 0, op_a, 1, 1257 regs.SetRegisterToInteger(instr.gpr0, instr.conversion.is_output_signed, 0, op_a, 1,
1254 1, instr.alu.saturate_d, 0, instr.conversion.dest_size); 1258 1, instr.alu.saturate_d, 0, instr.conversion.dest_size);
1255 break; 1259 break;
@@ -1289,6 +1293,14 @@ private:
1289 ASSERT_MSG(instr.conversion.src_size == Register::Size::Word, "Unimplemented"); 1293 ASSERT_MSG(instr.conversion.src_size == Register::Size::Word, "Unimplemented");
1290 std::string op_a = regs.GetRegisterAsFloat(instr.gpr20); 1294 std::string op_a = regs.GetRegisterAsFloat(instr.gpr20);
1291 1295
1296 if (instr.conversion.abs_a) {
1297 op_a = "abs(" + op_a + ')';
1298 }
1299
1300 if (instr.conversion.negate_a) {
1301 op_a = "-(" + op_a + ')';
1302 }
1303
1292 switch (instr.conversion.f2f.rounding) { 1304 switch (instr.conversion.f2f.rounding) {
1293 case Tegra::Shader::F2fRoundingOp::None: 1305 case Tegra::Shader::F2fRoundingOp::None:
1294 break; 1306 break;
@@ -1311,10 +1323,6 @@ private:
1311 break; 1323 break;
1312 } 1324 }
1313 1325
1314 if (instr.conversion.abs_a) {
1315 op_a = "abs(" + op_a + ')';
1316 }
1317
1318 regs.SetRegisterToFloat(instr.gpr0, 0, op_a, 1, 1, instr.alu.saturate_d); 1326 regs.SetRegisterToFloat(instr.gpr0, 0, op_a, 1, 1, instr.alu.saturate_d);
1319 break; 1327 break;
1320 } 1328 }