summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2016-01-24 20:20:39 -0800
committerGravatar Yuri Kunde Schlesner2016-01-24 20:29:06 -0800
commit083d2d89a5ef0d5f61de60bd241e65f43289a381 (patch)
treea763dde5a7df8470d076997ae277fbaef73b6388 /src
parentMerge pull request #1334 from tfarley/hw-depth-modifiers (diff)
downloadyuzu-083d2d89a5ef0d5f61de60bd241e65f43289a381.tar.gz
yuzu-083d2d89a5ef0d5f61de60bd241e65f43289a381.tar.xz
yuzu-083d2d89a5ef0d5f61de60bd241e65f43289a381.zip
Shader: Implement "invert condition" feature of IFU instruction
If the bit 0 of the JMPU instruction is set, then the jump condition will be inverted. That is, a jump will happen when the boolean is false instead of when it is true.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/shader/shader_interpreter.cpp3
-rw-r--r--src/video_core/shader/shader_jit_x64.cpp4
2 files changed, 5 insertions, 2 deletions
diff --git a/src/video_core/shader/shader_interpreter.cpp b/src/video_core/shader/shader_interpreter.cpp
index 7b0c20b74..aeced71b0 100644
--- a/src/video_core/shader/shader_interpreter.cpp
+++ b/src/video_core/shader/shader_interpreter.cpp
@@ -515,7 +515,8 @@ void RunInterpreter(UnitState<Debug>& state) {
515 515
516 case OpCode::Id::JMPU: 516 case OpCode::Id::JMPU:
517 Record<DebugDataRecord::COND_BOOL_IN>(state.debug, iteration, uniforms.b[instr.flow_control.bool_uniform_id]); 517 Record<DebugDataRecord::COND_BOOL_IN>(state.debug, iteration, uniforms.b[instr.flow_control.bool_uniform_id]);
518 if (uniforms.b[instr.flow_control.bool_uniform_id]) { 518
519 if (uniforms.b[instr.flow_control.bool_uniform_id] == !(instr.flow_control.num_instructions & 1)) {
519 state.program_counter = instr.flow_control.dest_offset - 1; 520 state.program_counter = instr.flow_control.dest_offset - 1;
520 } 521 }
521 break; 522 break;
diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp
index 00415e402..6554830b2 100644
--- a/src/video_core/shader/shader_jit_x64.cpp
+++ b/src/video_core/shader/shader_jit_x64.cpp
@@ -710,7 +710,9 @@ void JitCompiler::Compile_JMP(Instruction instr) {
710 else 710 else
711 UNREACHABLE(); 711 UNREACHABLE();
712 712
713 FixupBranch b = J_CC(CC_NZ, true); 713 bool inverted_condition = (instr.opcode.Value() == OpCode::Id::JMPU) &&
714 (instr.flow_control.num_instructions & 1);
715 FixupBranch b = J_CC(inverted_condition ? CC_Z : CC_NZ, true);
714 716
715 Compile_Block(instr.flow_control.dest_offset); 717 Compile_Block(instr.flow_control.dest_offset);
716 718