From e38876b5b2e8f71a926a3eb5c9cda5b321482ac6 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:17:35 -0700 Subject: [PATCH] amdgpu: Report GPU perf counter in GPU cycles. (#3557) --- src/video_core/amdgpu/pm4_cmds.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index b7d058f1a..d6bb9748c 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -5,8 +5,10 @@ #include #include "common/bit_field.h" -#include "common/rdtsc.h" #include "common/types.h" +#include "common/uint128.h" +#include "core/libraries/gnmdriver/gnmdriver.h" +#include "core/libraries/kernel/time.h" #include "core/platform.h" #include "video_core/amdgpu/pm4_opcodes.h" @@ -343,6 +345,16 @@ static u64 GetGpuClock64() { return static_cast(ticks); } +static u64 GetGpuPerfCounter() { + const auto cpu_freq = Libraries::Kernel::sceKernelGetTscFrequency(); + const auto gpu_freq = Libraries::GnmDriver::sceGnmGetGpuCoreClockFrequency(); + + const auto cpu_cycles = Libraries::Kernel::sceKernelReadTsc(); + const auto gpu_cycles = Common::MultiplyAndDivide64(cpu_cycles, gpu_freq, cpu_freq); + + return gpu_cycles; +} + // VGT_EVENT_INITIATOR.EVENT_TYPE enum class EventType : u32 { SampleStreamoutStats1 = 1, @@ -473,7 +485,7 @@ struct PM4CmdEventWriteEop { break; } case DataSelect::PerfCounter: { - write_mem(address, Common::FencedRDTSC(), sizeof(u64)); + write_mem(address, GetGpuPerfCounter(), sizeof(u64)); break; } default: { @@ -937,7 +949,7 @@ struct PM4CmdReleaseMem { break; } case DataSelect::PerfCounter: { - *Address() = Common::FencedRDTSC(); + *Address() = GetGpuPerfCounter(); break; } default: {