summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-11-26 18:28:03 -0500
committerGravatar GitHub2018-11-26 18:28:03 -0500
commit7684f4d0cf92f3badf4e8599122d6d5f599764cb (patch)
treeecf4d5a4e078f3a707627a0ad782c137bf955d75 /src
parentMerge pull request #1798 from ReinUsesLisp/y-direction (diff)
parentImplemented BRA CC conditional and FSET CC Setting (diff)
downloadyuzu-7684f4d0cf92f3badf4e8599122d6d5f599764cb.tar.gz
yuzu-7684f4d0cf92f3badf4e8599122d6d5f599764cb.tar.xz
yuzu-7684f4d0cf92f3badf4e8599122d6d5f599764cb.zip
Merge pull request #1713 from FernandoS27/bra-cc
Implemented BRA CC conditional and FSET CC Setting
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp18
1 files changed, 14 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 3d4d0f23e..7c0935a4e 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -3401,6 +3401,10 @@ private:
3401 regs.SetRegisterToInteger(instr.gpr0, false, 0, predicate + " ? 0xFFFFFFFF : 0", 1, 3401 regs.SetRegisterToInteger(instr.gpr0, false, 0, predicate + " ? 0xFFFFFFFF : 0", 1,
3402 1); 3402 1);
3403 } 3403 }
3404 if (instr.generates_cc.Value() != 0) {
3405 regs.SetInternalFlag(InternalFlag::ZeroFlag, predicate);
3406 LOG_WARNING(HW_GPU, "FSET Condition Code is incomplete");
3407 }
3404 break; 3408 break;
3405 } 3409 }
3406 case OpCode::Type::IntegerSet: { 3410 case OpCode::Type::IntegerSet: {
@@ -3682,11 +3686,17 @@ private:
3682 "BRA with constant buffers are not implemented"); 3686 "BRA with constant buffers are not implemented");
3683 3687
3684 const Tegra::Shader::ConditionCode cc = instr.flow_condition_code; 3688 const Tegra::Shader::ConditionCode cc = instr.flow_condition_code;
3685 UNIMPLEMENTED_IF_MSG(cc != Tegra::Shader::ConditionCode::T,
3686 "BRA condition code used: {}", static_cast<u32>(cc));
3687
3688 const u32 target = offset + instr.bra.GetBranchTarget(); 3689 const u32 target = offset + instr.bra.GetBranchTarget();
3689 shader.AddLine("{ jmp_to = " + std::to_string(target) + "u; break; }"); 3690 if (cc != Tegra::Shader::ConditionCode::T) {
3691 const std::string condition_code = regs.GetConditionCode(cc);
3692 shader.AddLine("if (" + condition_code + "){");
3693 shader.scope++;
3694 shader.AddLine("{ jmp_to = " + std::to_string(target) + "u; break; }");
3695 shader.scope--;
3696 shader.AddLine('}');
3697 } else {
3698 shader.AddLine("{ jmp_to = " + std::to_string(target) + "u; break; }");
3699 }
3690 break; 3700 break;
3691 } 3701 }
3692 case OpCode::Id::IPA: { 3702 case OpCode::Id::IPA: {