diff options
| -rw-r--r-- | src/video_core/engines/shader_bytecode.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 24 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index bc61f953f..67a0770dd 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h | |||
| @@ -1246,6 +1246,7 @@ public: | |||
| 1246 | OUT_R, // Emit vertex/primitive | 1246 | OUT_R, // Emit vertex/primitive |
| 1247 | ISBERD, | 1247 | ISBERD, |
| 1248 | VMAD, | 1248 | VMAD, |
| 1249 | VSETP, | ||
| 1249 | FFMA_IMM, // Fused Multiply and Add | 1250 | FFMA_IMM, // Fused Multiply and Add |
| 1250 | FFMA_CR, | 1251 | FFMA_CR, |
| 1251 | FFMA_RC, | 1252 | FFMA_RC, |
| @@ -1501,6 +1502,7 @@ private: | |||
| 1501 | INST("1111101111100---", Id::OUT_R, Type::Trivial, "OUT_R"), | 1502 | INST("1111101111100---", Id::OUT_R, Type::Trivial, "OUT_R"), |
| 1502 | INST("1110111111010---", Id::ISBERD, Type::Trivial, "ISBERD"), | 1503 | INST("1110111111010---", Id::ISBERD, Type::Trivial, "ISBERD"), |
| 1503 | INST("01011111--------", Id::VMAD, Type::Trivial, "VMAD"), | 1504 | INST("01011111--------", Id::VMAD, Type::Trivial, "VMAD"), |
| 1505 | INST("0101000011110---", Id::VSETP, Type::Trivial, "VSETP"), | ||
| 1504 | INST("0011001-1-------", Id::FFMA_IMM, Type::Ffma, "FFMA_IMM"), | 1506 | INST("0011001-1-------", Id::FFMA_IMM, Type::Ffma, "FFMA_IMM"), |
| 1505 | INST("010010011-------", Id::FFMA_CR, Type::Ffma, "FFMA_CR"), | 1507 | INST("010010011-------", Id::FFMA_CR, Type::Ffma, "FFMA_CR"), |
| 1506 | INST("010100011-------", Id::FFMA_RC, Type::Ffma, "FFMA_RC"), | 1508 | INST("010100011-------", Id::FFMA_RC, Type::Ffma, "FFMA_RC"), |
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index ad4d5a72f..42a072ed9 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -3362,6 +3362,30 @@ private: | |||
| 3362 | instr.vmad.cc); | 3362 | instr.vmad.cc); |
| 3363 | break; | 3363 | break; |
| 3364 | } | 3364 | } |
| 3365 | case OpCode::Id::VSETP: { | ||
| 3366 | const std::string op_a = GetVideoOperandA(instr); | ||
| 3367 | const std::string op_b = GetVideoOperandB(instr); | ||
| 3368 | |||
| 3369 | // We can't use the constant predicate as destination. | ||
| 3370 | ASSERT(instr.vsetp.pred3 != static_cast<u64>(Pred::UnusedIndex)); | ||
| 3371 | |||
| 3372 | const std::string second_pred = GetPredicateCondition(instr.vsetp.pred39, false); | ||
| 3373 | |||
| 3374 | const std::string combiner = GetPredicateCombiner(instr.vsetp.op); | ||
| 3375 | |||
| 3376 | const std::string predicate = GetPredicateComparison(instr.vsetp.cond, op_a, op_b); | ||
| 3377 | // Set the primary predicate to the result of Predicate OP SecondPredicate | ||
| 3378 | SetPredicate(instr.vsetp.pred3, | ||
| 3379 | '(' + predicate + ") " + combiner + " (" + second_pred + ')'); | ||
| 3380 | |||
| 3381 | if (instr.vsetp.pred0 != static_cast<u64>(Pred::UnusedIndex)) { | ||
| 3382 | // Set the secondary predicate to the result of !Predicate OP SecondPredicate, | ||
| 3383 | // if enabled | ||
| 3384 | SetPredicate(instr.vsetp.pred0, | ||
| 3385 | "!(" + predicate + ") " + combiner + " (" + second_pred + ')'); | ||
| 3386 | } | ||
| 3387 | break; | ||
| 3388 | } | ||
| 3365 | default: { | 3389 | default: { |
| 3366 | LOG_CRITICAL(HW_GPU, "Unhandled instruction: {}", opcode->GetName()); | 3390 | LOG_CRITICAL(HW_GPU, "Unhandled instruction: {}", opcode->GetName()); |
| 3367 | UNREACHABLE(); | 3391 | UNREACHABLE(); |