diff --git a/src/xenia/gpu/d3d11/d3d11_graphics_system.cc b/src/xenia/gpu/d3d11/d3d11_graphics_system.cc index 68db9311b..648067976 100644 --- a/src/xenia/gpu/d3d11/d3d11_graphics_system.cc +++ b/src/xenia/gpu/d3d11/d3d11_graphics_system.cc @@ -22,6 +22,7 @@ using namespace xe::gpu::d3d11; namespace { void __stdcall D3D11GraphicsSystemVsyncCallback(D3D11GraphicsSystem* gs, BOOLEAN) { + gs->MarkVblank(); gs->DispatchInterruptCallback(0); } diff --git a/src/xenia/gpu/graphics_system.cc b/src/xenia/gpu/graphics_system.cc index 95837681a..d5e5eb42e 100644 --- a/src/xenia/gpu/graphics_system.cc +++ b/src/xenia/gpu/graphics_system.cc @@ -160,6 +160,10 @@ void GraphicsSystem::WriteRegister(uint32_t r, uint64_t value) { regs->values[r].u32 = (uint32_t)value; } +void GraphicsSystem::MarkVblank() { + worker_->increment_counter(); +} + void GraphicsSystem::DispatchInterruptCallback( uint32_t source, uint32_t cpu) { // Pick a CPU, if needed. We're going to guess 2. Because. diff --git a/src/xenia/gpu/graphics_system.h b/src/xenia/gpu/graphics_system.h index b24ca995a..ae6e6e88d 100644 --- a/src/xenia/gpu/graphics_system.h +++ b/src/xenia/gpu/graphics_system.h @@ -52,6 +52,7 @@ public: virtual uint64_t ReadRegister(uint32_t r); virtual void WriteRegister(uint32_t r, uint64_t value); + void MarkVblank(); void DispatchInterruptCallback(uint32_t source, uint32_t cpu = 0xFFFFFFFF); bool swap_pending() const { return swap_pending_; } void set_swap_pending(bool value) { swap_pending_ = value; } diff --git a/src/xenia/gpu/nop/nop_graphics_system.cc b/src/xenia/gpu/nop/nop_graphics_system.cc index ba34ce898..ed04bd346 100644 --- a/src/xenia/gpu/nop/nop_graphics_system.cc +++ b/src/xenia/gpu/nop/nop_graphics_system.cc @@ -21,6 +21,7 @@ using namespace xe::gpu::nop; namespace { void __stdcall NopGraphicsSystemVsyncCallback(NopGraphicsSystem* gs, BOOLEAN) { + gs->MarkVblank(); gs->DispatchInterruptCallback(0); } diff --git a/src/xenia/gpu/ring_buffer_worker.cc b/src/xenia/gpu/ring_buffer_worker.cc index bbbdd5252..ee0efc556 100644 --- a/src/xenia/gpu/ring_buffer_worker.cc +++ b/src/xenia/gpu/ring_buffer_worker.cc @@ -36,7 +36,8 @@ RingBufferWorker::RingBufferWorker( LARGE_INTEGER perf_counter; QueryPerformanceCounter(&perf_counter); - counter_base_ = perf_counter.QuadPart; + time_base_ = perf_counter.QuadPart; + counter_ = 0; } RingBufferWorker::~RingBufferWorker() { @@ -44,10 +45,10 @@ RingBufferWorker::~RingBufferWorker() { CloseHandle(write_ptr_index_event_); } -uint64_t RingBufferWorker::GetCounter() { +uint64_t RingBufferWorker::QueryTime() { LARGE_INTEGER perf_counter; QueryPerformanceCounter(&perf_counter); - return perf_counter.QuadPart - counter_base_; + return perf_counter.QuadPart - time_base_; } void RingBufferWorker::Initialize(GraphicsDriver* driver, @@ -476,9 +477,8 @@ uint32_t RingBufferWorker::ExecutePacket(PacketArgs& args) { WriteRegister(XE_GPU_REG_VGT_EVENT_INITIATOR, initiator & 0x1F); uint32_t data_value; if ((initiator >> 31) & 0x1) { - // Write counter (GPU clock counter?). - // TODO(benvanik): 64-bit write? - data_value = (uint32_t)GetCounter(); + // Write counter (GPU vblank counter?). + data_value = counter_; } else { // Write value. data_value = value; diff --git a/src/xenia/gpu/ring_buffer_worker.h b/src/xenia/gpu/ring_buffer_worker.h index 14c602970..a4fd9f0f5 100644 --- a/src/xenia/gpu/ring_buffer_worker.h +++ b/src/xenia/gpu/ring_buffer_worker.h @@ -28,7 +28,9 @@ public: xe_memory_ref memory(); - uint64_t GetCounter(); + uint64_t QueryTime(); + uint32_t counter() const { return counter_; } + void increment_counter() { counter_++; } void Initialize(GraphicsDriver* driver, uint32_t ptr, uint32_t page_count); @@ -56,7 +58,8 @@ protected: GraphicsSystem* graphics_system_; GraphicsDriver* driver_; - uint64_t counter_base_; + uint64_t time_base_; + uint32_t counter_; uint32_t primary_buffer_ptr_; uint32_t primary_buffer_size_;