mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 22:06:59 +01: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},
|
{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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user