hot-fix: amdgpu: use different indirect dispatch packet on ASC

This commit is contained in:
psucien 2025-01-04 22:23:12 +01:00
parent f2f24bb2cd
commit 7459d9c333
4 changed files with 27 additions and 8 deletions

View file

@ -823,10 +823,10 @@ Liverpool::Task Liverpool::ProcessCompute(std::span<const u32> acb, u32 vqid) {
break;
}
case PM4ItOpcode::DispatchIndirect: {
const auto* dispatch_indirect = reinterpret_cast<const PM4CmdDispatchIndirect*>(header);
const auto* dispatch_indirect =
reinterpret_cast<const PM4CmdDispatchIndirectMec*>(header);
auto& cs_program = GetCsRegs();
const auto offset = dispatch_indirect->data_offset;
const auto ib_address = mapped_queues[vqid].indirect_args_addr;
const auto ib_address = dispatch_indirect->Address<VAddr>();
const auto size = sizeof(PM4CmdDispatchIndirect::GroupDimensions);
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDumpCompute(base_addr, reinterpret_cast<uintptr_t>(header),
@ -835,7 +835,7 @@ Liverpool::Task Liverpool::ProcessCompute(std::span<const u32> acb, u32 vqid) {
if (rasterizer && (cs_program.dispatch_initiator & 1)) {
const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin(fmt::format("acb[{}]:{}:Dispatch", vqid, cmd_address));
rasterizer->DispatchIndirect(ib_address, offset, size);
rasterizer->DispatchIndirect(ib_address, 0, size);
rasterizer->ScopeMarkerEnd();
}
break;

View file

@ -796,6 +796,18 @@ struct PM4CmdDispatchIndirect {
u32 dispatch_initiator; ///< Dispatch Initiator Register
};
struct PM4CmdDispatchIndirectMec {
PM4Type3Header header;
u32 address0;
u32 address1;
u32 dispatch_initiator; ///< Dispatch Initiator Register
template <typename T>
T Address() const {
return reinterpret_cast<T>(address0 | (u64(address1 & 0xffff) << 32u));
}
};
struct DrawIndirectArgs {
u32 vertex_count_per_instance;
u32 instance_count;