diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 18 |
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: { |