From f831e60412b6dc84aec98e55149e11f7ca295bc5 Mon Sep 17 00:00:00 2001 From: nmzik Date: Sun, 2 Aug 2026 07:58:17 +0200 Subject: [PATCH] agc: new abis --- src/libs/agc.cpp | 33 +++++++++++++++++++++++---------- src/libs/agc.h | 2 ++ src/libs/libGraphicsDriver.cpp | 2 ++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/libs/agc.cpp b/src/libs/agc.cpp index b8787cf23..8172e08e1 100644 --- a/src/libs/agc.cpp +++ b/src/libs/agc.cpp @@ -1445,7 +1445,7 @@ int KYTY_SYSV_ABI GraphicsWriteDataPatchSetAddressOrOffset(uint32_t* cmd, return OK; } - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } int KYTY_SYSV_ABI GraphicsUnknownJumpPatchSetTarget(uint32_t* cmd, const volatile uint32_t* target, @@ -2478,7 +2478,7 @@ int KYTY_SYSV_ABI GraphicsUnknownIkfdtRIqCE(uint32_t* cmd, uint64_t arg1, auto op = (cmd[0] >> 8u) & 0xffu; if (op != Pm4::IT_INDIRECT_BUFFER) { - return 0x8a6c000c; + return GRAPHICS5_ERROR_INVALID_PACKET; } auto vaddr = reinterpret_cast(target); @@ -2898,6 +2898,10 @@ uint32_t KYTY_SYSV_ABI GraphicsAcbCondExecGetSize() { return GraphicsDcbCondExecGetSize(); } +uint32_t KYTY_SYSV_ABI GraphicsAcbJumpGetSize() { + return 0x10u; +} + uint32_t* KYTY_SYSV_ABI GraphicsAcbWaitRegMem(CommandBuffer* buf, uint8_t size, uint8_t compare_function, uint8_t cache_policy, const volatile void* address, uint64_t reference, @@ -3217,7 +3221,7 @@ int KYTY_SYSV_ABI GraphicsDmaDataPatchSetDstAddressOrOffset(uint32_t* cmd, return OK; } - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } int KYTY_SYSV_ABI GraphicsDmaDataPatchSetSrcAddressOrOffsetOrImmediate( @@ -3231,7 +3235,7 @@ int KYTY_SYSV_ABI GraphicsDmaDataPatchSetSrcAddressOrOffsetOrImmediate( return OK; } - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } uint32_t KYTY_SYSV_ABI GraphicsGetPacketSize(uint32_t* packet) { @@ -3295,6 +3299,15 @@ int KYTY_SYSV_ABI GraphicsSetRangePredication(uint32_t* start, const volatile ui return OK; } +int KYTY_SYSV_ABI GraphicsRewindPatchSetRewindState(uint32_t* cmd, uint8_t state) { + if (((cmd[0] >> 8u) & 0xffu) != Pm4::IT_REWIND) { + return GRAPHICS5_ERROR_INVALID_PACKET; + } + + cmd[1] = (cmd[1] & 0x7fffffffu) | (static_cast(state) << 31u); + return OK; +} + int KYTY_SYSV_ABI GraphicsCondExecPatchSetEnd(uint32_t* cmd, const volatile uint32_t* buffer) { PRINT_NAME(); @@ -3303,23 +3316,23 @@ int KYTY_SYSV_ABI GraphicsCondExecPatchSetEnd(uint32_t* cmd, const volatile uint reinterpret_cast(cmd), reinterpret_cast(buffer)); if (cmd == nullptr || buffer == nullptr) { - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } auto op = (cmd[0] >> 8u) & 0xffu; if (op != Pm4::IT_COND_EXEC) { - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } auto* packet_end = cmd + 5; auto* range_end = const_cast(reinterpret_cast(buffer)); if (range_end < packet_end) { - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } auto num_dwords = static_cast(range_end - packet_end); if (num_dwords > 0x3fffu) { - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } cmd[4] = (cmd[4] & ~0x3fffu) | static_cast(num_dwords); @@ -3335,12 +3348,12 @@ int KYTY_SYSV_ABI GraphicsCondExecPatchSetCommandAddress(uint32_t* reinterpret_cast(cmd), reinterpret_cast(command)); if (cmd == nullptr || command == nullptr) { - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } auto op = (cmd[0] >> 8u) & 0xffu; if (op != Pm4::IT_COND_EXEC || (reinterpret_cast(command) & 0x3u) != 0) { - return static_cast(0x8a6c000cu); + return GRAPHICS5_ERROR_INVALID_PACKET; } auto addr = reinterpret_cast(command); diff --git a/src/libs/agc.h b/src/libs/agc.h index 15f731019..da51411f7 100644 --- a/src/libs/agc.h +++ b/src/libs/agc.h @@ -185,6 +185,7 @@ uint32_t KYTY_SYSV_ABI GraphicsAcbAcquireMemGetSize(); uint32_t* KYTY_SYSV_ABI GraphicsAcbCondExec(CommandBuffer* buf, const volatile uint32_t* address, uint32_t num_dwords); uint32_t KYTY_SYSV_ABI GraphicsAcbCondExecGetSize(); +uint32_t KYTY_SYSV_ABI GraphicsAcbJumpGetSize(); uint32_t* KYTY_SYSV_ABI GraphicsAcbWaitRegMem(CommandBuffer* buf, uint8_t size, uint8_t compare_function, uint8_t cache_policy, const volatile void* address, uint64_t reference, @@ -243,6 +244,7 @@ uint32_t KYTY_SYSV_ABI GraphicsGetPacketSize(uint32_t* packet); int KYTY_SYSV_ABI GraphicsSetPacketPredication(uint32_t* packet, uint32_t predication); int KYTY_SYSV_ABI GraphicsSetRangePredication(uint32_t* start, const volatile uint32_t* end, uint32_t predication); +int KYTY_SYSV_ABI GraphicsRewindPatchSetRewindState(uint32_t* cmd, uint8_t state); int KYTY_SYSV_ABI GraphicsCondExecPatchSetEnd(uint32_t* cmd, const volatile uint32_t* buffer); int KYTY_SYSV_ABI GraphicsCondExecPatchSetCommandAddress(uint32_t* cmd, const volatile uint32_t* command); diff --git a/src/libs/libGraphicsDriver.cpp b/src/libs/libGraphicsDriver.cpp index 01bef748d..7fb56e73b 100644 --- a/src/libs/libGraphicsDriver.cpp +++ b/src/libs/libGraphicsDriver.cpp @@ -208,6 +208,7 @@ LIB_DEFINE(InitGraphicsDriver_1) { LIB_FUNC("ewobAQeMo5k", Gen5::GraphicsAcbAcquireMemGetSize); LIB_FUNC("qyM2bxYFPAk", Gen5::GraphicsAcbCondExec); LIB_FUNC("ozKzBP4aki4", Gen5::GraphicsAcbCondExecGetSize); + LIB_FUNC("b-oySn+G2tE", Gen5::GraphicsAcbJumpGetSize); LIB_FUNC("htn36gPnBk4", Gen5::GraphicsAcbWaitRegMem); LIB_FUNC("-RnpfpxIhec", Gen5::GraphicsAcbDmaData); LIB_FUNC("qzMN2XKGA4k", Gen5::GraphicsAcbCopyData); @@ -283,6 +284,7 @@ LIB_DEFINE(InitGraphicsDriver_1) { LIB_FUNC("YWTKOju587o", Gen5::GraphicsCondExecPatchSetCommandAddress); LIB_FUNC("k-JpyR2dYAM", Gen5::GraphicsCondExecPatchSetEnd); LIB_FUNC("3ZWa3AoyWZQ", Gen5::GraphicsCondExecPatchSetCommandAddress); + LIB_FUNC("ziVA3whp3p4", Gen5::GraphicsRewindPatchSetRewindState); LIB_FUNC("YUeqkyT7mEQ", Gen5::GraphicsDcbSetFlip); }