mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 02:47:02 +02:00
shader: recognize remaining disabled debug branches
This commit is contained in:
@@ -116,7 +116,9 @@ constexpr OpcodeMap SOPP_OPCODE_LIST[] = {
|
||||
{0x12u, Opcode::S_TRAP},
|
||||
{0x16u, Opcode::S_TTRACEDATA},
|
||||
{0x17u, Opcode::S_CBRANCH_CDBGSYS},
|
||||
{0x18u, Opcode::S_CBRANCH_CDBGUSER},
|
||||
{0x19u, Opcode::S_CBRANCH_CDBGSYS_OR_USER},
|
||||
{0x1au, Opcode::S_CBRANCH_CDBGSYS_AND_USER},
|
||||
{0x20u, Opcode::S_INST_PREFETCH},
|
||||
{0x23u, Opcode::S_WAITCNT_DEPCTR},
|
||||
};
|
||||
|
||||
@@ -186,7 +186,9 @@ bool IsConditionalBranch(Opcode opcode) {
|
||||
switch (opcode) {
|
||||
// Conditional shader debugging is disabled.
|
||||
case Opcode::S_CBRANCH_CDBGSYS:
|
||||
case Opcode::S_CBRANCH_CDBGSYS_OR_USER: return false;
|
||||
case Opcode::S_CBRANCH_CDBGUSER:
|
||||
case Opcode::S_CBRANCH_CDBGSYS_OR_USER:
|
||||
case Opcode::S_CBRANCH_CDBGSYS_AND_USER: return false;
|
||||
case Opcode::S_CBRANCH_SCC0:
|
||||
case Opcode::S_CBRANCH_SCC1:
|
||||
case Opcode::S_CBRANCH_VCCZ:
|
||||
@@ -575,7 +577,9 @@ std::string InstructionToString(const Instruction& inst) {
|
||||
case Opcode::S_CBRANCH_EXECZ:
|
||||
case Opcode::S_CBRANCH_EXECNZ:
|
||||
case Opcode::S_CBRANCH_CDBGSYS:
|
||||
case Opcode::S_CBRANCH_CDBGUSER:
|
||||
case Opcode::S_CBRANCH_CDBGSYS_OR_USER:
|
||||
case Opcode::S_CBRANCH_CDBGSYS_AND_USER:
|
||||
return WithUnsupportedReason(inst, fmt::format("0x{:08x}: {} 0x{:08x}", inst.pc,
|
||||
magic_enum::enum_name(inst.opcode),
|
||||
inst.branch_target));
|
||||
|
||||
@@ -714,7 +714,9 @@ enum class Opcode {
|
||||
S_CBRANCH_EXECZ,
|
||||
S_CBRANCH_EXECNZ,
|
||||
S_CBRANCH_CDBGSYS,
|
||||
S_CBRANCH_CDBGUSER,
|
||||
S_CBRANCH_CDBGSYS_OR_USER,
|
||||
S_CBRANCH_CDBGSYS_AND_USER,
|
||||
S_SENDMSG,
|
||||
S_GETREG_B32,
|
||||
S_SETREG_B32,
|
||||
|
||||
@@ -279,7 +279,9 @@ void Translator::EmitScalar(const Decoder::Instruction& inst) {
|
||||
case O::S_CBRANCH_EXECZ:
|
||||
case O::S_CBRANCH_EXECNZ:
|
||||
case O::S_CBRANCH_CDBGSYS:
|
||||
case O::S_CBRANCH_CDBGUSER:
|
||||
case O::S_CBRANCH_CDBGSYS_OR_USER:
|
||||
case O::S_CBRANCH_CDBGSYS_AND_USER:
|
||||
case O::S_ENDPGM: return;
|
||||
default: return FailMissingTranslation(inst);
|
||||
}
|
||||
|
||||
@@ -1945,14 +1945,18 @@ void TestSopkCompareImmediateExtension() {
|
||||
|
||||
void TestDisabledDebugBranches() {
|
||||
using namespace ShaderRecompiler;
|
||||
// Both debug branches fall through when conditional shader debugging is disabled.
|
||||
// Debug branches fall through when conditional shader debugging is disabled.
|
||||
// Retain the post-ENDPGM helper displacement from PPSA08709 and exercise the
|
||||
// OR_USER variant encountered in PPSA03671 with the same body.
|
||||
for (const auto opcode : {Decoder::Opcode::S_CBRANCH_CDBGSYS,
|
||||
Decoder::Opcode::S_CBRANCH_CDBGSYS_OR_USER}) {
|
||||
const std::pair<uint32_t, Decoder::Opcode> branches[] = {
|
||||
{0x17, Decoder::Opcode::S_CBRANCH_CDBGSYS},
|
||||
{0x18, Decoder::Opcode::S_CBRANCH_CDBGUSER},
|
||||
{0x19, Decoder::Opcode::S_CBRANCH_CDBGSYS_OR_USER},
|
||||
{0x1a, Decoder::Opcode::S_CBRANCH_CDBGSYS_AND_USER}};
|
||||
for (const auto [encoding, opcode] : branches) {
|
||||
std::array<uint32_t, 274> shader;
|
||||
shader.fill(EncodeSopp(0x00));
|
||||
shader[0] = EncodeSopp(opcode == Decoder::Opcode::S_CBRANCH_CDBGSYS ? 0x17 : 0x19, 0x10f);
|
||||
shader[0] = EncodeSopp(encoding, 0x10f);
|
||||
shader[1] = EncodeVop1(0x01, 1, 129);
|
||||
shader[2] = EncodeMubuf0(0x1c, 0, false);
|
||||
shader[3] = EncodeMubuf1(1, 0, 0);
|
||||
@@ -1962,6 +1966,7 @@ void TestDisabledDebugBranches() {
|
||||
Decoder::Program decoded;
|
||||
Decoder::DecodeProgram(shader, decoded);
|
||||
Check(decoded.instructions.front().opcode == opcode &&
|
||||
decoded.instructions.front().opcode_id == encoding &&
|
||||
decoded.instructions.front().branch_target == 0x440u &&
|
||||
decoded.instructions.back().pc == 0x43cu &&
|
||||
decoded.instructions.back().opcode == Decoder::Opcode::S_ENDPGM,
|
||||
|
||||
Reference in New Issue
Block a user