From 2a54306e8bea66a0a31ce9124cd91e0d3a46b42c Mon Sep 17 00:00:00 2001 From: nmzik Date: Sun, 30 Aug 2026 23:55:05 +0400 Subject: [PATCH] agc: implement async command buffer jump --- src/libs/agc.cpp | 21 +++++++++++++++++++++ src/libs/agc.h | 2 ++ src/libs/libAgcDriver.cpp | 1 + 3 files changed, 24 insertions(+) diff --git a/src/libs/agc.cpp b/src/libs/agc.cpp index 820e069f0..d58d94a37 100644 --- a/src/libs/agc.cpp +++ b/src/libs/agc.cpp @@ -3241,6 +3241,27 @@ uint32_t KYTY_SYSV_ABI AgcAcbCondExecGetSize() { return AgcDcbCondExecGetSize(); } +uint32_t* KYTY_SYSV_ABI AgcAcbJump(CommandBuffer* buf, uint8_t cache_policy, + const uint32_t* target, uint32_t size_in_dwords) { + if (buf == nullptr) { + return nullptr; + } + + auto* cmd = buf->AllocateDW(4); + if (cmd == nullptr) { + return nullptr; + } + + auto target_address = reinterpret_cast(target); + cmd[0] = KYTY_PM4(4, Pm4::IT_INDIRECT_BUFFER, 0u); + cmd[1] = static_cast(target_address) & ~0x3u; + cmd[2] = static_cast(target_address >> 32u); + cmd[3] = 0x0f900000u | ((static_cast(cache_policy) & 0x3u) << 28u) | + (size_in_dwords & 0xfffffu); + + return cmd; +} + uint32_t KYTY_SYSV_ABI AgcAcbJumpGetSize() { return 0x10u; } diff --git a/src/libs/agc.h b/src/libs/agc.h index 29f471a7c..36f5479fa 100644 --- a/src/libs/agc.h +++ b/src/libs/agc.h @@ -204,6 +204,8 @@ uint32_t KYTY_SYSV_ABI AgcAcbAcquireMemGetSize(); uint32_t* KYTY_SYSV_ABI AgcAcbCondExec(CommandBuffer* buf, const volatile uint32_t* address, uint32_t num_dwords); uint32_t KYTY_SYSV_ABI AgcAcbCondExecGetSize(); +uint32_t* KYTY_SYSV_ABI AgcAcbJump(CommandBuffer* buf, uint8_t cache_policy, + const uint32_t* target, uint32_t size_in_dwords); uint32_t KYTY_SYSV_ABI AgcAcbJumpGetSize(); uint32_t* KYTY_SYSV_ABI AgcAcbWaitRegMem(CommandBuffer* buf, uint8_t size, uint8_t compare_function, uint8_t cache_policy, const volatile void* address, diff --git a/src/libs/libAgcDriver.cpp b/src/libs/libAgcDriver.cpp index 6ee476a43..4689c9301 100644 --- a/src/libs/libAgcDriver.cpp +++ b/src/libs/libAgcDriver.cpp @@ -73,6 +73,7 @@ LIB_DEFINE(InitAgcDriver_1) { LIB_FUNC("ewobAQeMo5k", Gen5::AgcAcbAcquireMemGetSize); LIB_FUNC("qyM2bxYFPAk", Gen5::AgcAcbCondExec); LIB_FUNC("ozKzBP4aki4", Gen5::AgcAcbCondExecGetSize); + LIB_FUNC("e1DFTg+Sd8U", Gen5::AgcAcbJump); LIB_FUNC("b-oySn+G2tE", Gen5::AgcAcbJumpGetSize); LIB_FUNC("htn36gPnBk4", Gen5::AgcAcbWaitRegMem); LIB_FUNC("idlaArvdXEs", Gen5::AgcAcbWaitOnAddressGetSize);