amdgpu: additional heuristic for CB extents detection

Found in CUSA00144
This commit is contained in:
psucien 2024-07-14 10:58:55 +02:00
parent f041276b04
commit 8144f835a9
2 changed files with 28 additions and 7 deletions

View File

@ -199,19 +199,12 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
switch (reg_addr) { switch (reg_addr) {
case ContextRegs::CbColor0Base: case ContextRegs::CbColor0Base:
[[fallthrough]];
case ContextRegs::CbColor1Base: case ContextRegs::CbColor1Base:
[[fallthrough]];
case ContextRegs::CbColor2Base: case ContextRegs::CbColor2Base:
[[fallthrough]];
case ContextRegs::CbColor3Base: case ContextRegs::CbColor3Base:
[[fallthrough]];
case ContextRegs::CbColor4Base: case ContextRegs::CbColor4Base:
[[fallthrough]];
case ContextRegs::CbColor5Base: case ContextRegs::CbColor5Base:
[[fallthrough]];
case ContextRegs::CbColor6Base: case ContextRegs::CbColor6Base:
[[fallthrough]];
case ContextRegs::CbColor7Base: { case ContextRegs::CbColor7Base: {
const auto col_buf_id = (reg_addr - ContextRegs::CbColor0Base) / const auto col_buf_id = (reg_addr - ContextRegs::CbColor0Base) /
(ContextRegs::CbColor1Base - ContextRegs::CbColor0Base); (ContextRegs::CbColor1Base - ContextRegs::CbColor0Base);
@ -227,6 +220,26 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
} }
break; break;
} }
case ContextRegs::CbColor0Cmask:
case ContextRegs::CbColor1Cmask:
case ContextRegs::CbColor2Cmask:
case ContextRegs::CbColor3Cmask:
case ContextRegs::CbColor4Cmask:
case ContextRegs::CbColor5Cmask:
case ContextRegs::CbColor6Cmask:
case ContextRegs::CbColor7Cmask: {
const auto col_buf_id = (reg_addr - ContextRegs::CbColor0Cmask) /
(ContextRegs::CbColor1Cmask - ContextRegs::CbColor0Cmask);
ASSERT(col_buf_id < NumColorBuffers);
const auto nop_offset = header->type3.count;
if (nop_offset == 0x04) {
ASSERT_MSG(payload[nop_offset] == 0xc0001000,
"NOP hint is missing in CB setup sequence");
last_cb_extent[col_buf_id].raw = payload[nop_offset + 1];
}
break;
}
case ContextRegs::DbZInfo: { case ContextRegs::DbZInfo: {
if (header->type3.count == 8) { if (header->type3.count == 8) {
ASSERT_MSG(payload[20] == 0xc0001000, ASSERT_MSG(payload[20] == 0xc0001000,

View File

@ -786,6 +786,14 @@ struct Liverpool {
CbColor5Base = 0xA363, CbColor5Base = 0xA363,
CbColor6Base = 0xA372, CbColor6Base = 0xA372,
CbColor7Base = 0xA381, CbColor7Base = 0xA381,
CbColor0Cmask = 0xA31F,
CbColor1Cmask = 0xA32E,
CbColor2Cmask = 0xA33D,
CbColor3Cmask = 0xA34C,
CbColor4Cmask = 0xA35B,
CbColor5Cmask = 0xA36A,
CbColor6Cmask = 0xA379,
CbColor7Cmask = 0xA388,
}; };
struct PolygonOffset { struct PolygonOffset {