summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2016-01-26 15:58:16 +0100
committerbunnei <bunneidev@gmail.com>2016-01-26 15:58:16 +0100
commitc407b6ce2fbd6f438e5258bc14dc3def1a8c33e5 (patch)
tree8df2098c831d561bad520b08727b1af0958cc605
parentMerge pull request #1370 from yuriks/gpureg-names (diff)
parentShader: Implement "invert condition" feature of IFU instruction (diff)
downloadyuzu-c407b6ce2fbd6f438e5258bc14dc3def1a8c33e5.tar
yuzu-c407b6ce2fbd6f438e5258bc14dc3def1a8c33e5.tar.gz
yuzu-c407b6ce2fbd6f438e5258bc14dc3def1a8c33e5.tar.bz2
yuzu-c407b6ce2fbd6f438e5258bc14dc3def1a8c33e5.tar.lz
yuzu-c407b6ce2fbd6f438e5258bc14dc3def1a8c33e5.tar.xz
yuzu-c407b6ce2fbd6f438e5258bc14dc3def1a8c33e5.tar.zst
yuzu-c407b6ce2fbd6f438e5258bc14dc3def1a8c33e5.zip
-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) {
case OpCode::Id::JMPU:
Record<DebugDataRecord::COND_BOOL_IN>(state.debug, iteration, uniforms.b[instr.flow_control.bool_uniform_id]);
- if (uniforms.b[instr.flow_control.bool_uniform_id]) {
+
+ if (uniforms.b[instr.flow_control.bool_uniform_id] == !(instr.flow_control.num_instructions & 1)) {
state.program_counter = instr.flow_control.dest_offset - 1;
}
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) {
else
UNREACHABLE();
- FixupBranch b = J_CC(CC_NZ, true);
+ bool inverted_condition = (instr.opcode.Value() == OpCode::Id::JMPU) &&
+ (instr.flow_control.num_instructions & 1);
+ FixupBranch b = J_CC(inverted_condition ? CC_Z : CC_NZ, true);
Compile_Block(instr.flow_control.dest_offset);