diff options
| author | bunnei <bunneidev@gmail.com> | 2018-07-05 11:28:50 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-05 11:28:50 -0400 | 
| commit | 1b0a74e23f8eb716e5561d07f4c15d62d6162491 (patch) | |
| tree | 1e3fa8f0ce4d7f156ce363bd7b2e59d9b84fd502 | |
| parent | 9a3c0b161e4400946ae3a5b4173b6b240c3ae4c4 (diff) | |
| parent | 53a55bd751f6f89ac6c9d9eac9d3e9a8bd28c552 (diff) | |
Merge pull request #621 from Subv/psetp_
GPU: Implemented the PSETP shader instruction.
| -rw-r--r-- | src/video_core/engines/shader_bytecode.h | 13 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 30 | 
2 files changed, 43 insertions, 0 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index c1226a649..95b7d46ec 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h @@ -329,6 +329,19 @@ union Instruction {      } isetp;      union { +        BitField<0, 3, u64> pred0; +        BitField<3, 3, u64> pred3; +        BitField<12, 3, u64> pred12; +        BitField<15, 1, u64> neg_pred12; +        BitField<24, 2, PredOperation> cond; +        BitField<29, 3, u64> pred29; +        BitField<32, 1, u64> neg_pred29; +        BitField<39, 3, u64> pred39; +        BitField<42, 1, u64> neg_pred39; +        BitField<45, 2, PredOperation> op; +    } psetp; + +    union {          BitField<39, 3, u64> pred39;          BitField<42, 1, u64> neg_pred;          BitField<43, 1, u64> neg_a; diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index ec9956edb..a4b730e1c 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp @@ -1477,6 +1477,36 @@ private:              }              break;          } +        case OpCode::Type::PredicateSetPredicate: { +            std::string op_a = +                GetPredicateCondition(instr.psetp.pred12, instr.psetp.neg_pred12 != 0); +            std::string op_b = +                GetPredicateCondition(instr.psetp.pred29, instr.psetp.neg_pred29 != 0); + +            using Tegra::Shader::Pred; +            // We can't use the constant predicate as destination. +            ASSERT(instr.psetp.pred3 != static_cast<u64>(Pred::UnusedIndex)); + +            std::string second_pred = +                GetPredicateCondition(instr.psetp.pred39, instr.psetp.neg_pred39 != 0); + +            std::string combiner = GetPredicateCombiner(instr.psetp.op); + +            std::string predicate = +                '(' + op_a + ") " + GetPredicateCombiner(instr.psetp.cond) + " (" + op_b + ')'; + +            // Set the primary predicate to the result of Predicate OP SecondPredicate +            SetPredicate(instr.psetp.pred3, +                         '(' + predicate + ") " + combiner + " (" + second_pred + ')'); + +            if (instr.psetp.pred0 != static_cast<u64>(Pred::UnusedIndex)) { +                // Set the secondary predicate to the result of !Predicate OP SecondPredicate, +                // if enabled +                SetPredicate(instr.psetp.pred0, +                             "!(" + predicate + ") " + combiner + " (" + second_pred + ')'); +            } +            break; +        }          case OpCode::Type::FloatSet: {              std::string op_a = instr.fset.neg_a ? "-" : "";              op_a += regs.GetRegisterAsFloat(instr.gpr8);  | 
