mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
agc: support one-word NOP reservations and share packet sizing
This commit is contained in:
@@ -689,7 +689,7 @@ void CommandProcessor::ProcessPm4(Pm4Execution& execution) {
|
||||
const auto opcode = (packet_header >> 8u) & 0xffu;
|
||||
EXIT_NOT_IMPLEMENTED(remaining_dw > total_dw);
|
||||
|
||||
if (packet_header == 0x80000000u) {
|
||||
if (packet_header == 0x80000000u || Pm4::PacketSizeDw(packet_header) == 1u) {
|
||||
cursor.offset_dw++;
|
||||
execution.m_made_progress = true;
|
||||
continue;
|
||||
|
||||
@@ -120,15 +120,15 @@ void DumpPm4PacketStream(Common::File* file, const uint32_t* cmd_buffer, uint32_
|
||||
uint32_t len = 0;
|
||||
|
||||
const auto packet_type = static_cast<PacketType>(cmd_id >> 30u);
|
||||
// Type-2 packets are header-only padding; every other packet type requires a body.
|
||||
EXIT_NOT_IMPLEMENTED(dw < 2 && packet_type != PacketType::Type2);
|
||||
EXIT_NOT_IMPLEMENTED(dw < 2 && packet_type != PacketType::Type2 &&
|
||||
PacketSizeDw(cmd_id) != 1u);
|
||||
|
||||
switch (packet_type) {
|
||||
case PacketType::Type3: {
|
||||
const bool sh_gx = (cmd_id & 0x2u) == 0;
|
||||
const uint8_t op = ((cmd_id >> 8u) & 0xffu);
|
||||
const auto r = KYTY_PM4_R(cmd_id);
|
||||
len = ((cmd_id >> 16u) & 0x3fffu) + 1;
|
||||
len = PacketSizeDw(cmd_id) - 1u;
|
||||
|
||||
EXIT_NOT_IMPLEMENTED(len >= dw);
|
||||
|
||||
|
||||
@@ -19,6 +19,10 @@ class File;
|
||||
|
||||
namespace Libs::Graphics::Pm4 {
|
||||
|
||||
constexpr uint32_t PacketSizeDw(uint32_t header) {
|
||||
return (header & 0x3fffff00u) == 0x3fff1000u ? 1u : KYTY_PM4_LEN(header);
|
||||
}
|
||||
|
||||
constexpr uint32_t IT_NOP = 0x10;
|
||||
constexpr uint32_t IT_SET_BASE = 0x11;
|
||||
constexpr uint32_t IT_CLEAR_STATE = 0x12;
|
||||
|
||||
+3
-16
@@ -1730,7 +1730,7 @@ int KYTY_SYSV_ABI AgcDriverRegisterWorkloadStream(uint32_t stream_id, const void
|
||||
}
|
||||
|
||||
uint32_t* KYTY_SYSV_ABI AgcCbNop(CommandBuffer* buf, uint32_t size_in_dwords) {
|
||||
if (buf == nullptr || size_in_dwords < 2) {
|
||||
if (buf == nullptr || size_in_dwords == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -1741,9 +1741,6 @@ uint32_t* KYTY_SYSV_ABI AgcCbNop(CommandBuffer* buf, uint32_t size_in_dwords) {
|
||||
}
|
||||
|
||||
cmd[0] = KYTY_PM4(size_in_dwords, Pm4::IT_NOP, Pm4::R_ZERO);
|
||||
if (size_in_dwords > 1) {
|
||||
memset(cmd + 1, 0, static_cast<size_t>(size_in_dwords - 1) * 4);
|
||||
}
|
||||
|
||||
return cmd;
|
||||
}
|
||||
@@ -3678,12 +3675,7 @@ int KYTY_SYSV_ABI AgcDmaDataPatchSetSrcAddressOrOffsetOrImmediate(
|
||||
}
|
||||
|
||||
uint32_t KYTY_SYSV_ABI AgcGetPacketSize(uint32_t* packet) {
|
||||
const auto cmd_id = packet[0];
|
||||
if ((cmd_id & 0x3fffff00u) == 0x3fff1000u) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return KYTY_PM4_LEN(cmd_id);
|
||||
return Pm4::PacketSizeDw(packet[0]);
|
||||
}
|
||||
|
||||
int KYTY_SYSV_ABI AgcSetPacketPredication(uint32_t* packet, uint32_t predication) {
|
||||
@@ -3725,12 +3717,7 @@ int KYTY_SYSV_ABI AgcSetRangePredication(uint32_t* start, const volatile uint32_
|
||||
const auto cmd_id = packet[0];
|
||||
packet[0] = (cmd_id & ~1u) | predication_bit;
|
||||
|
||||
auto size = KYTY_PM4_LEN(cmd_id);
|
||||
if ((cmd_id & 0x3fffff00u) == 0x3fff1000u) {
|
||||
size = 1;
|
||||
}
|
||||
|
||||
packet_va += size * sizeof(uint32_t);
|
||||
packet_va += Pm4::PacketSizeDw(cmd_id) * sizeof(uint32_t);
|
||||
packet = reinterpret_cast<uint32_t*>(packet_va);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user