From 8e9a4944dbbb4a22d149bb989faf32db0a979766 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Mon, 10 Feb 2020 10:32:51 -0400 Subject: [PATCH] GPU: Implement GPU Clock correctly. --- src/video_core/engines/maxwell_3d.cpp | 3 ++- src/video_core/gpu.cpp | 14 +++++++++++++- src/video_core/gpu.h | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 2a58557952..a7e1dee040 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -9,6 +9,7 @@ #include "core/core_timing.h" #include "video_core/engines/maxwell_3d.h" #include "video_core/engines/shader_type.h" +#include "video_core/gpu.h" #include "video_core/memory_manager.h" #include "video_core/rasterizer_interface.h" #include "video_core/textures/texture.h" @@ -533,7 +534,7 @@ void Maxwell3D::StampQueryResult(u64 payload, bool long_query) { LongQueryResult query_result{}; query_result.value = payload; // TODO(Subv): Generate a real GPU timestamp and write it here instead of CoreTiming - query_result.timestamp = system.CoreTiming().GetTicks(); + query_result.timestamp = system.GPU().GetTicks(); memory_manager.WriteBlock(sequence_address, &query_result, sizeof(query_result)); } else { memory_manager.Write(sequence_address, static_cast(payload)); diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 062ca83b81..4aca39faf1 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -6,6 +6,7 @@ #include "common/microprofile.h" #include "core/core.h" #include "core/core_timing.h" +#include "core/core_timing_util.h" #include "core/memory.h" #include "video_core/engines/fermi_2d.h" #include "video_core/engines/kepler_compute.h" @@ -122,6 +123,17 @@ bool GPU::CancelSyncptInterrupt(const u32 syncpoint_id, const u32 value) { return true; } +// This values were reversed engineered by fincs from NVN +// The gpu clock is reported in units of 385/625 nanoseconds +constexpr u64 gpu_ticks_num = 384; +constexpr u64 gpu_ticks_den = 625; + +u64 GPU::GetTicks() const { + const u64 cpu_ticks = system.CoreTiming().GetTicks(); + const u64 nanoseconds = Core::Timing::CyclesToNs(cpu_ticks).count(); + return (nanoseconds * gpu_ticks_num) / gpu_ticks_den; +} + void GPU::FlushCommands() { renderer.Rasterizer().FlushCommands(); } @@ -340,7 +352,7 @@ void GPU::ProcessSemaphoreTriggerMethod() { block.sequence = regs.semaphore_sequence; // TODO(Kmather73): Generate a real GPU timestamp and write it here instead of // CoreTiming - block.timestamp = system.CoreTiming().GetTicks(); + block.timestamp = GetTicks(); memory_manager->WriteBlock(regs.semaphore_address.SemaphoreAddress(), &block, sizeof(block)); } else { diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index b648317bbe..07727210c1 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h @@ -192,6 +192,8 @@ public: bool CancelSyncptInterrupt(u32 syncpoint_id, u32 value); + u64 GetTicks() const; + std::unique_lock LockSync() { return std::unique_lock{sync_mutex}; }