shader: recognize remaining disabled debug branches

This commit is contained in:
Mac
2026-10-10 04:31:24 +02:00
committed by nmzik
parent fa56c5eae9
commit 679be25c37
5 changed files with 20 additions and 5 deletions
@@ -116,7 +116,9 @@ constexpr OpcodeMap SOPP_OPCODE_LIST[] = {
{0x12u, Opcode::S_TRAP}, {0x12u, Opcode::S_TRAP},
{0x16u, Opcode::S_TTRACEDATA}, {0x16u, Opcode::S_TTRACEDATA},
{0x17u, Opcode::S_CBRANCH_CDBGSYS}, {0x17u, Opcode::S_CBRANCH_CDBGSYS},
{0x18u, Opcode::S_CBRANCH_CDBGUSER},
{0x19u, Opcode::S_CBRANCH_CDBGSYS_OR_USER}, {0x19u, Opcode::S_CBRANCH_CDBGSYS_OR_USER},
{0x1au, Opcode::S_CBRANCH_CDBGSYS_AND_USER},
{0x20u, Opcode::S_INST_PREFETCH}, {0x20u, Opcode::S_INST_PREFETCH},
{0x23u, Opcode::S_WAITCNT_DEPCTR}, {0x23u, Opcode::S_WAITCNT_DEPCTR},
}; };
@@ -186,7 +186,9 @@ bool IsConditionalBranch(Opcode opcode) {
switch (opcode) { switch (opcode) {
// Conditional shader debugging is disabled. // Conditional shader debugging is disabled.
case Opcode::S_CBRANCH_CDBGSYS: 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_SCC0:
case Opcode::S_CBRANCH_SCC1: case Opcode::S_CBRANCH_SCC1:
case Opcode::S_CBRANCH_VCCZ: case Opcode::S_CBRANCH_VCCZ:
@@ -575,7 +577,9 @@ std::string InstructionToString(const Instruction& inst) {
case Opcode::S_CBRANCH_EXECZ: case Opcode::S_CBRANCH_EXECZ:
case Opcode::S_CBRANCH_EXECNZ: case Opcode::S_CBRANCH_EXECNZ:
case Opcode::S_CBRANCH_CDBGSYS: case Opcode::S_CBRANCH_CDBGSYS:
case Opcode::S_CBRANCH_CDBGUSER:
case Opcode::S_CBRANCH_CDBGSYS_OR_USER: 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, return WithUnsupportedReason(inst, fmt::format("0x{:08x}: {} 0x{:08x}", inst.pc,
magic_enum::enum_name(inst.opcode), magic_enum::enum_name(inst.opcode),
inst.branch_target)); inst.branch_target));
@@ -714,7 +714,9 @@ enum class Opcode {
S_CBRANCH_EXECZ, S_CBRANCH_EXECZ,
S_CBRANCH_EXECNZ, S_CBRANCH_EXECNZ,
S_CBRANCH_CDBGSYS, S_CBRANCH_CDBGSYS,
S_CBRANCH_CDBGUSER,
S_CBRANCH_CDBGSYS_OR_USER, S_CBRANCH_CDBGSYS_OR_USER,
S_CBRANCH_CDBGSYS_AND_USER,
S_SENDMSG, S_SENDMSG,
S_GETREG_B32, S_GETREG_B32,
S_SETREG_B32, S_SETREG_B32,
@@ -279,7 +279,9 @@ void Translator::EmitScalar(const Decoder::Instruction& inst) {
case O::S_CBRANCH_EXECZ: case O::S_CBRANCH_EXECZ:
case O::S_CBRANCH_EXECNZ: case O::S_CBRANCH_EXECNZ:
case O::S_CBRANCH_CDBGSYS: case O::S_CBRANCH_CDBGSYS:
case O::S_CBRANCH_CDBGUSER:
case O::S_CBRANCH_CDBGSYS_OR_USER: case O::S_CBRANCH_CDBGSYS_OR_USER:
case O::S_CBRANCH_CDBGSYS_AND_USER:
case O::S_ENDPGM: return; case O::S_ENDPGM: return;
default: return FailMissingTranslation(inst); default: return FailMissingTranslation(inst);
} }
+9 -4
View File
@@ -1945,14 +1945,18 @@ void TestSopkCompareImmediateExtension() {
void TestDisabledDebugBranches() { void TestDisabledDebugBranches() {
using namespace ShaderRecompiler; 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 // Retain the post-ENDPGM helper displacement from PPSA08709 and exercise the
// OR_USER variant encountered in PPSA03671 with the same body. // OR_USER variant encountered in PPSA03671 with the same body.
for (const auto opcode : {Decoder::Opcode::S_CBRANCH_CDBGSYS, const std::pair<uint32_t, Decoder::Opcode> branches[] = {
Decoder::Opcode::S_CBRANCH_CDBGSYS_OR_USER}) { {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; std::array<uint32_t, 274> shader;
shader.fill(EncodeSopp(0x00)); 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[1] = EncodeVop1(0x01, 1, 129);
shader[2] = EncodeMubuf0(0x1c, 0, false); shader[2] = EncodeMubuf0(0x1c, 0, false);
shader[3] = EncodeMubuf1(1, 0, 0); shader[3] = EncodeMubuf1(1, 0, 0);
@@ -1962,6 +1966,7 @@ void TestDisabledDebugBranches() {
Decoder::Program decoded; Decoder::Program decoded;
Decoder::DecodeProgram(shader, decoded); Decoder::DecodeProgram(shader, decoded);
Check(decoded.instructions.front().opcode == opcode && Check(decoded.instructions.front().opcode == opcode &&
decoded.instructions.front().opcode_id == encoding &&
decoded.instructions.front().branch_target == 0x440u && decoded.instructions.front().branch_target == 0x440u &&
decoded.instructions.back().pc == 0x43cu && decoded.instructions.back().pc == 0x43cu &&
decoded.instructions.back().opcode == Decoder::Opcode::S_ENDPGM, decoded.instructions.back().opcode == Decoder::Opcode::S_ENDPGM,