GPU: Implement GPU Clock correctly.

This commit is contained in:
Fernando Sahmkow 2020-02-10 10:32:51 -04:00 committed by FernandoS27
parent 0cb3bcfbb7
commit 8e9a4944db
3 changed files with 17 additions and 2 deletions

View file

@ -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 {