amdgpu: Report GPU perf counter in GPU cycles. (#3557)

This commit is contained in:
squidbus
2025-09-08 19:17:35 -07:00
committed by GitHub
parent b5e2503418
commit e38876b5b2

View File

@@ -5,8 +5,10 @@
#include <cstring> #include <cstring>
#include "common/bit_field.h" #include "common/bit_field.h"
#include "common/rdtsc.h"
#include "common/types.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 "core/platform.h"
#include "video_core/amdgpu/pm4_opcodes.h" #include "video_core/amdgpu/pm4_opcodes.h"
@@ -343,6 +345,16 @@ static u64 GetGpuClock64() {
return static_cast<u64>(ticks); return static_cast<u64>(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 // VGT_EVENT_INITIATOR.EVENT_TYPE
enum class EventType : u32 { enum class EventType : u32 {
SampleStreamoutStats1 = 1, SampleStreamoutStats1 = 1,
@@ -473,7 +485,7 @@ struct PM4CmdEventWriteEop {
break; break;
} }
case DataSelect::PerfCounter: { case DataSelect::PerfCounter: {
write_mem(address, Common::FencedRDTSC(), sizeof(u64)); write_mem(address, GetGpuPerfCounter(), sizeof(u64));
break; break;
} }
default: { default: {
@@ -937,7 +949,7 @@ struct PM4CmdReleaseMem {
break; break;
} }
case DataSelect::PerfCounter: { case DataSelect::PerfCounter: {
*Address<u64>() = Common::FencedRDTSC(); *Address<u64>() = GetGpuPerfCounter();
break; break;
} }
default: { default: {