diff options
| author | 2018-08-15 09:27:43 -0500 | |
|---|---|---|
| committer | 2018-08-15 09:27:43 -0500 | |
| commit | 91140f6c0a64d77460c9cc740da4d7b20d314157 (patch) | |
| tree | 22236019768cf55e1e3aaac15b41a7312c95c8f7 /src | |
| parent | Shader/I2F: Implemented the negate I2F_C instruction variant. (diff) | |
| download | yuzu-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.cpp | 16 |
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 | } |