summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-06-18 22:24:57 -0400
committerGravatar GitHub2018-06-18 22:24:57 -0400
commit7a0bb406d5ad6f9f649f69978c820d904e59d9cb (patch)
tree95818043d690ca1df635baf5565f67a7963b832e /src
parentMerge pull request #561 from DarkLordZach/fix-odyssey-input-crash (diff)
parentGPU: Perform negation after absolute value in the float shader instructions. (diff)
downloadyuzu-7a0bb406d5ad6f9f649f69978c820d904e59d9cb.tar.gz
yuzu-7a0bb406d5ad6f9f649f69978c820d904e59d9cb.tar.xz
yuzu-7a0bb406d5ad6f9f649f69978c820d904e59d9cb.zip
Merge pull request #574 from Subv/shader_abs_neg
GPU: Perform negation after absolute value in the float shader instructions.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index 6dc695def..fc80d4b29 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -822,22 +822,25 @@ private:
822 822
823 switch (opcode->GetType()) { 823 switch (opcode->GetType()) {
824 case OpCode::Type::Arithmetic: { 824 case OpCode::Type::Arithmetic: {
825 std::string op_a = instr.alu.negate_a ? "-" : ""; 825 std::string op_a = regs.GetRegisterAsFloat(instr.gpr8);
826 op_a += regs.GetRegisterAsFloat(instr.gpr8);
827 if (instr.alu.abs_a) { 826 if (instr.alu.abs_a) {
828 op_a = "abs(" + op_a + ')'; 827 op_a = "abs(" + op_a + ')';
829 } 828 }
830 829
831 std::string op_b = instr.alu.negate_b ? "-" : ""; 830 if (instr.alu.negate_a) {
831 op_a = "-(" + op_a + ')';
832 }
833
834 std::string op_b;
832 835
833 if (instr.is_b_imm) { 836 if (instr.is_b_imm) {
834 op_b += GetImmediate19(instr); 837 op_b = GetImmediate19(instr);
835 } else { 838 } else {
836 if (instr.is_b_gpr) { 839 if (instr.is_b_gpr) {
837 op_b += regs.GetRegisterAsFloat(instr.gpr20); 840 op_b = regs.GetRegisterAsFloat(instr.gpr20);
838 } else { 841 } else {
839 op_b += regs.GetUniform(instr.cbuf34.index, instr.cbuf34.offset, 842 op_b = regs.GetUniform(instr.cbuf34.index, instr.cbuf34.offset,
840 GLSLRegister::Type::Float); 843 GLSLRegister::Type::Float);
841 } 844 }
842 } 845 }
843 846
@@ -845,6 +848,10 @@ private:
845 op_b = "abs(" + op_b + ')'; 848 op_b = "abs(" + op_b + ')';
846 } 849 }
847 850
851 if (instr.alu.negate_b) {
852 op_b = "-(" + op_b + ')';
853 }
854
848 switch (opcode->GetId()) { 855 switch (opcode->GetId()) {
849 case OpCode::Id::MOV_C: 856 case OpCode::Id::MOV_C:
850 case OpCode::Id::MOV_R: { 857 case OpCode::Id::MOV_R: {