summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/engines/shader_bytecode.h2
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp24
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();