From c7b00d666fcbd7a826bbe8a96d4e9e6ecd11736c Mon Sep 17 00:00:00 2001 From: nmzik Date: Fri, 17 Jul 2026 14:20:16 +0200 Subject: [PATCH] Split render header (new namespace PM4 call sites) --- src/graphics/guest_gpu/graphicsRun.cpp | 51 +++++++++--------- src/graphics/host_gpu/renderer/render.h | 57 -------------------- src/graphics/host_gpu/renderer/sync.cpp | 55 ++++++++++---------- src/graphics/host_gpu/renderer/sync.h | 69 +++++++++++++++++++++++++ src/libs/agc.cpp | 5 +- tests/ShaderRecompilerComputeTests.cpp | 15 +++--- 6 files changed, 134 insertions(+), 118 deletions(-) create mode 100644 src/graphics/host_gpu/renderer/sync.h diff --git a/src/graphics/guest_gpu/graphicsRun.cpp b/src/graphics/guest_gpu/graphicsRun.cpp index 286528157..8b9ebedf0 100644 --- a/src/graphics/guest_gpu/graphicsRun.cpp +++ b/src/graphics/guest_gpu/graphicsRun.cpp @@ -15,6 +15,7 @@ #include "graphics/host_gpu/objects/label.h" #include "graphics/host_gpu/renderer/render.h" #include "graphics/host_gpu/renderer/renderContext.h" +#include "graphics/host_gpu/renderer/sync.h" #include "graphics/presentation/displayBuffer.h" #include "graphics/presentation/videoOut.h" #include "graphics/presentation/window.h" @@ -449,7 +450,7 @@ void CommandProcessor::Reset() { Common::LockGuard lock(m_mutex); - GraphicsRenderDeleteBuffers(); + Sync::DeleteBuffers(); m_sh_ctx.Reset(); m_ucfg.Reset(); @@ -660,7 +661,7 @@ void CommandProcessor::WriteReferenceClock(uint64_t dst_address, uint32_t num_by EXIT("invalid reference-clock copy, dst=0x%016" PRIx64 " size=%u\n", dst_address, num_bytes); } - const auto value = GraphicsRenderReadReferenceClock(); + const auto value = Sync::ReadReferenceClock(); std::memcpy(reinterpret_cast(dst_address), &value, num_bytes); LOGF("\t copy_data reference clock: dst=0x%016" PRIx64 " value=0x%016" PRIx64 " size=%u\n", dst_address, value, num_bytes); @@ -826,7 +827,7 @@ void GraphicsRing::ThreadBatchRun(void* data) { ring->m_constant_job.Wait(); cp->BufferFlush(); if (buf.trigger_agc_interrupt_on_done) { - GraphicsRenderTriggerEopEvent(0); + Sync::TriggerEopEvent(0); } } } @@ -907,7 +908,7 @@ void ComputeRing::ThreadRun(void* data) { cp->BufferFlush(); if (trigger_agc_interrupt_on_done) { - GraphicsRenderTriggerAgcUserInterrupt(); + Sync::TriggerAgcUserInterrupt(); } } cp->RunUnlock(); @@ -1526,7 +1527,7 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr case 0x00: case 0x03: with_interrupt = false; break; case 0x01: - GraphicsRenderTriggerEopEventAtEndOfPipe(CurrentBuffer(), interrupt_context_id); + Sync::TriggerEopEventAtEndOfPipe(CurrentBuffer(), interrupt_context_id); return; case 0x02: with_interrupt = true; break; default: EXIT("unknown interrupt_selector\n"); @@ -1539,16 +1540,16 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr if (with_interrupt) { if (with_writeback) { - GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack32( + Sync::WriteAtEndOfPipeWithInterruptWriteBack32( m_submit_id, CurrentBuffer(), dst, data, interrupt_context_id); } else { - GraphicsRenderWriteAtEndOfPipeWithInterrupt32(m_submit_id, CurrentBuffer(), dst, + Sync::WriteAtEndOfPipeWithInterrupt32(m_submit_id, CurrentBuffer(), dst, data, interrupt_context_id); } } else if (with_writeback) { - GraphicsRenderWriteAtEndOfPipeWithWriteBack32(m_submit_id, CurrentBuffer(), dst, data); + Sync::WriteAtEndOfPipeWithWriteBack32(m_submit_id, CurrentBuffer(), dst, data); } else { - GraphicsRenderWriteAtEndOfPipe32(m_submit_id, CurrentBuffer(), dst, data); + Sync::WriteAtEndOfPipe32(m_submit_id, CurrentBuffer(), dst, data); } }; @@ -1558,8 +1559,8 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr if (eop_event_type == 0x2f && cache_action == 0x00 && event_index == 0x06) { auto* dst = static_cast(dst_gpu_addr); SynchronizeGpu(); - GraphicsRenderReadGds(dst, value & 0xffffu, value >> 16u); - GraphicsRenderWriteAtEndOfPipeGds32(m_submit_id, CurrentBuffer(), dst, + Sync::ReadGds(dst, value & 0xffffu, value >> 16u); + Sync::WriteAtEndOfPipeGds32(m_submit_id, CurrentBuffer(), dst, value & 0xffffu, value >> 16u); return; } @@ -1584,17 +1585,17 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr if (with_interrupt) { if (with_writeback) { - GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack64( + Sync::WriteAtEndOfPipeWithInterruptWriteBack64( m_submit_id, CurrentBuffer(), dst, value, interrupt_context_id); } else { - GraphicsRenderWriteAtEndOfPipeWithInterrupt64( + Sync::WriteAtEndOfPipeWithInterrupt64( m_submit_id, CurrentBuffer(), dst, value, interrupt_context_id); } } else if (with_writeback) { - GraphicsRenderWriteAtEndOfPipeWithWriteBack64(m_submit_id, CurrentBuffer(), + Sync::WriteAtEndOfPipeWithWriteBack64(m_submit_id, CurrentBuffer(), dst, value); } else { - GraphicsRenderWriteAtEndOfPipe64(m_submit_id, CurrentBuffer(), dst, value); + Sync::WriteAtEndOfPipe64(m_submit_id, CurrentBuffer(), dst, value); } }; @@ -1661,14 +1662,14 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr break; case 0x04: if constexpr (sizeof(T) == sizeof(uint64_t)) { - const auto clock = GraphicsRenderReadReferenceClock(); + const auto clock = Sync::ReadReferenceClock(); std::memcpy(dst_gpu_addr, &clock, sizeof(clock)); switch (cache_action) { case 0x00: if (((eop_event_type == 0x04 && event_index == 0x05) || (eop_event_type == 0x28 && event_index == 0x00)) && !with_interrupt) { - GraphicsRenderWriteAtEndOfPipeClockCounter( + Sync::WriteAtEndOfPipeClockCounter( m_submit_id, CurrentBuffer(), static_cast(dst_gpu_addr), clock); return; @@ -1679,7 +1680,7 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr (event_index == 0x00 || event_index == 0x05)) || (eop_event_type == 0x28 && event_index == 0x00)) && !with_interrupt) { - GraphicsRenderWriteAtEndOfPipeClockCounterWithWriteBack( + Sync::WriteAtEndOfPipeClockCounterWithWriteBack( m_submit_id, CurrentBuffer(), static_cast(dst_gpu_addr), clock); return; @@ -1730,7 +1731,7 @@ void CommandProcessor::TriggerEopEventAtEndOfPipe(uint32_t interrupt_context_id) CheckBuffer(); - GraphicsRenderTriggerEopEventAtEndOfPipe(CurrentBuffer(), interrupt_context_id); + Sync::TriggerEopEventAtEndOfPipe(CurrentBuffer(), interrupt_context_id); } void CommandProcessor::RenderTextureBarrier(uint64_t vaddr, uint64_t size) { @@ -1813,9 +1814,9 @@ void CommandProcessor::Flip() { } auto* command = CurrentBuffer(); - auto request = GraphicsRenderPrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, + auto request = Sync::PrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, m_flip.flip_mode, m_flip.flip_arg); - GraphicsRenderWriteAtEndOfPipeOnlyFlip(m_submit_id, command, m_flip.handle, m_flip.index, + Sync::WriteAtEndOfPipeOnlyFlip(m_submit_id, command, m_flip.handle, m_flip.index, m_flip.flip_mode, m_flip.flip_arg, request); m_scheduler.Flush(); } @@ -1834,9 +1835,9 @@ void CommandProcessor::Flip(void* dst_gpu_addr, uint32_t value) { std::memcpy(dst_gpu_addr, &value, sizeof(value)); auto* command = CurrentBuffer(); - auto request = GraphicsRenderPrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, + auto request = Sync::PrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, m_flip.flip_mode, m_flip.flip_arg); - GraphicsRenderWriteAtEndOfPipeWithFlip32( + Sync::WriteAtEndOfPipeWithFlip32( m_submit_id, command, static_cast(dst_gpu_addr), value, m_flip.handle, m_flip.index, m_flip.flip_mode, m_flip.flip_arg, request); m_scheduler.Flush(); @@ -1862,9 +1863,9 @@ void CommandProcessor::FlipWithInterrupt(uint32_t eop_event_type, uint32_t cache } std::memcpy(dst_gpu_addr, &value, sizeof(value)); auto* command = CurrentBuffer(); - auto request = GraphicsRenderPrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, + auto request = Sync::PrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, m_flip.flip_mode, m_flip.flip_arg); - GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip32( + Sync::WriteAtEndOfPipeWithInterruptWriteBackFlip32( m_submit_id, command, static_cast(dst_gpu_addr), value, m_flip.handle, m_flip.index, m_flip.flip_mode, m_flip.flip_arg, request); m_scheduler.Flush(); diff --git a/src/graphics/host_gpu/renderer/render.h b/src/graphics/host_gpu/renderer/render.h index 813307109..f67fb22df 100644 --- a/src/graphics/host_gpu/renderer/render.h +++ b/src/graphics/host_gpu/renderer/render.h @@ -4,7 +4,6 @@ #include "common/abi.h" #include "common/common.h" #include "graphics/host_gpu/renderer/streamBuffer.h" -#include "kernel/eventQueue.h" #include #include @@ -144,10 +143,6 @@ void RenderDispatchDirect(uint64_t submit_id, CommandBuffer* buffer, HW::Context void GraphicsRenderInit(); void GraphicsRenderCreateContext(); -[[nodiscard]] bool GraphicsScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency, - uint64_t* value); -[[nodiscard]] uint64_t GraphicsRenderReadReferenceClock(); - [[nodiscard]] bool ResolveComputeImageClear(const ShaderComputeInputInfo& input, uint32_t group_x, uint32_t group_y, uint32_t group_z, uint32_t mode, ShaderBufferResource* descriptor, @@ -155,61 +150,9 @@ void GraphicsRenderCreateContext(); [[nodiscard]] bool ResolveHtileClearTarget(const HW::DepthRenderTarget& target, uint64_t descriptor_size, HtileClearTarget* resolved); -void GraphicsRenderWriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer, - uint64_t* dst_gpu_addr, uint64_t value); -void GraphicsRenderWriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffer* buffer, - uint64_t* dst_gpu_addr, uint64_t value); -void GraphicsRenderWriteAtEndOfPipeClockCounterWithWriteBack(uint64_t submit_id, - CommandBuffer* buffer, - uint64_t* dst_gpu_addr, - uint64_t value); -void GraphicsRenderWriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer, - uint32_t* dst_gpu_addr, uint32_t value); -void GraphicsRenderWriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buffer, - uint32_t* dst_gpu_addr, uint32_t dw_offset, - uint32_t dw_num); -uint64_t GraphicsRenderPrepareDisplayBufferFlip(CommandBuffer* buffer, int handle, int index, - int flip_mode, int64_t flip_arg); -void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip32( - uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, int handle, - int index, int flip_mode, int64_t flip_arg, uint64_t request_id); -void GraphicsRenderWriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* buffer, - uint32_t* dst_gpu_addr, uint32_t value, int handle, - int index, int flip_mode, int64_t flip_arg, - uint64_t request_id); -void GraphicsRenderWriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* buffer, int handle, - int index, int flip_mode, int64_t flip_arg, - uint64_t request_id); -void GraphicsRenderWriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBuffer* buffer, - uint64_t* dst_gpu_addr, uint64_t value); -void GraphicsRenderWriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBuffer* buffer, - uint32_t* dst_gpu_addr, uint32_t value); -void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submit_id, - CommandBuffer* buffer, - uint64_t* dst_gpu_addr, uint64_t value, - uint32_t context_id = 0); -void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submit_id, - CommandBuffer* buffer, - uint32_t* dst_gpu_addr, uint32_t value, - uint32_t context_id = 0); -void GraphicsRenderWriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBuffer* buffer, - uint64_t* dst_gpu_addr, uint64_t value, - uint32_t context_id = 0); -void GraphicsRenderWriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBuffer* buffer, - uint32_t* dst_gpu_addr, uint32_t value, - uint32_t context_id = 0); void GraphicsRenderMemoryBarrier(CommandBuffer* buffer); void GraphicsRenderTextureBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size); void GraphicsRenderDepthStencilBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size); -void GraphicsRenderDeleteBuffers(); -void GraphicsRenderTriggerEopEventAtEndOfPipe(CommandBuffer* buffer, uint32_t context_id); - -int GraphicsRenderAddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata); -int GraphicsRenderDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id); -void GraphicsRenderTriggerAgcUserInterrupt(); -void GraphicsRenderTriggerEopEvent(uint32_t context_id); - -void GraphicsRenderReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size); } // namespace Libs::Graphics diff --git a/src/graphics/host_gpu/renderer/sync.cpp b/src/graphics/host_gpu/renderer/sync.cpp index 500030c9c..3d7e607b8 100644 --- a/src/graphics/host_gpu/renderer/sync.cpp +++ b/src/graphics/host_gpu/renderer/sync.cpp @@ -7,6 +7,7 @@ #include "graphics/host_gpu/renderer/bufferCache.h" #include "graphics/host_gpu/renderer/render.h" #include "graphics/host_gpu/renderer/renderContext.h" +#include "graphics/host_gpu/renderer/sync.h" #include "graphics/presentation/displayBuffer.h" #include "kernel/eventQueue.h" #include "kernel/pthread.h" @@ -14,13 +15,13 @@ #include -namespace Libs::Graphics { +namespace Libs::Graphics::Sync { constexpr int GRAPHICS_EVENT_QUEUED_GRAPHICS_INTERRUPT = 0x00; constexpr int GRAPHICS_EVENT_EOP = 0x40; constexpr uint64_t GRAPHICS_REFERENCE_CLOCK_FREQUENCY = 100000000; -bool GraphicsScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency, uint64_t* value) { +bool ScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency, uint64_t* value) { if (host_frequency == 0 || value == nullptr) { return false; } @@ -42,11 +43,11 @@ bool GraphicsScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency, u return true; } -uint64_t GraphicsRenderReadReferenceClock() { +uint64_t ReadReferenceClock() { const auto host_frequency = LibKernel::KernelGetTscFrequency(); const auto host_ticks = LibKernel::KernelReadTsc(); uint64_t value = 0; - if (!GraphicsScaleReferenceClock(host_ticks, host_frequency, &value)) { + if (!ScaleReferenceClock(host_ticks, host_frequency, &value)) { EXIT("cannot scale host clock, ticks=0x%016" PRIx64 " frequency=%" PRIu64 "\n", host_ticks, host_frequency); } @@ -69,19 +70,19 @@ static bool CompleteDisplayBufferFlip(const uint64_t* args) { return true; } -void GraphicsRenderTriggerAgcUserInterrupt() { +void TriggerAgcUserInterrupt() { auto tsc = LibKernel::KernelReadTsc(); auto result = LibKernel::EventQueue::KernelTriggerUserEventForAll(AGC_USER_INTERRUPT_EVENT, reinterpret_cast(tsc)); EXIT_NOT_IMPLEMENTED(result != OK && result != LibKernel::KERNEL_ERROR_ENOENT); } -void GraphicsRenderTriggerEopEvent(uint32_t context_id) { +void TriggerEopEvent(uint32_t context_id) { EXIT_IF(g_render_ctx == nullptr); g_render_ctx->TriggerEopEvent(context_id); } -void GraphicsRenderWriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value) { EXIT_IF(g_render_ctx == nullptr); EXIT_IF(dst_gpu_addr == nullptr); @@ -92,7 +93,7 @@ void GraphicsRenderWriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer, 0, 0, reinterpret_cast(dst_gpu_addr)); } -void GraphicsRenderWriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t dw_offset, uint32_t dw_num) { EXIT_IF(g_render_ctx == nullptr); @@ -104,7 +105,7 @@ void GraphicsRenderWriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buff dw_offset, dw_num, 0, 0, reinterpret_cast(dst_gpu_addr)); } -void GraphicsRenderWriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value) { EXIT_IF(g_render_ctx == nullptr); EXIT_IF(dst_gpu_addr == nullptr); @@ -116,7 +117,7 @@ void GraphicsRenderWriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer, reinterpret_cast(dst_gpu_addr)); } -void GraphicsRenderWriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value) { EXIT_IF(g_render_ctx == nullptr); EXIT_IF(dst_gpu_addr == nullptr); @@ -131,7 +132,7 @@ void GraphicsRenderWriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffe reinterpret_cast(dst_gpu_addr), value); } -void GraphicsRenderWriteAtEndOfPipeClockCounterWithWriteBack(uint64_t submit_id, +void WriteAtEndOfPipeClockCounterWithWriteBack(uint64_t submit_id, CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value) { @@ -148,7 +149,7 @@ void GraphicsRenderWriteAtEndOfPipeClockCounterWithWriteBack(uint64_t subm reinterpret_cast(dst_gpu_addr), value); } -void GraphicsRenderWriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value) { EXIT_IF(g_render_ctx == nullptr); EXIT_IF(dst_gpu_addr == nullptr); @@ -160,7 +161,7 @@ void GraphicsRenderWriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBu reinterpret_cast(dst_gpu_addr)); } -void GraphicsRenderWriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value) { EXIT_IF(g_render_ctx == nullptr); EXIT_IF(dst_gpu_addr == nullptr); @@ -171,7 +172,7 @@ void GraphicsRenderWriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBu value, 0, 0, reinterpret_cast(dst_gpu_addr)); } -void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submit_id, +void WriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submit_id, CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value, uint32_t context_id) { @@ -196,7 +197,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submi args); } -void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submit_id, +void WriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, uint32_t context_id) { @@ -219,7 +220,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submi args); } -void GraphicsRenderWriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value, uint32_t context_id) { EXIT_IF(g_render_ctx == nullptr); @@ -243,7 +244,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBu args); } -void GraphicsRenderWriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, uint32_t context_id) { EXIT_IF(g_render_ctx == nullptr); @@ -265,7 +266,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBu args); } -uint64_t GraphicsRenderPrepareDisplayBufferFlip(CommandBuffer* buffer, int handle, int index, +uint64_t PrepareDisplayBufferFlip(CommandBuffer* buffer, int handle, int index, int flip_mode, int64_t flip_arg) { for (;;) { uint64_t request_id = 0; @@ -284,7 +285,7 @@ uint64_t GraphicsRenderPrepareDisplayBufferFlip(CommandBuffer* buffer, int handl } } -void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip32( +void WriteAtEndOfPipeWithInterruptWriteBackFlip32( uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, int handle, int index, int flip_mode, int64_t flip_arg, uint64_t request_id) { EXIT_IF(g_render_ctx == nullptr); @@ -306,7 +307,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip32( args); } -void GraphicsRenderWriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* buffer, +void WriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, int handle, int index, int flip_mode, int64_t flip_arg, uint64_t request_id) { @@ -322,7 +323,7 @@ void GraphicsRenderWriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* SubmitLabel(buffer, CompleteDisplayBufferFlip, nullptr, args); } -void GraphicsRenderWriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* buffer, int handle, +void WriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* buffer, int handle, int index, int flip_mode, int64_t flip_arg, uint64_t request_id) { EXIT_IF(g_render_ctx == nullptr); @@ -337,7 +338,7 @@ void GraphicsRenderWriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* b SubmitLabel(buffer, CompleteDisplayBufferFlip, nullptr, args); } -void GraphicsRenderTriggerEopEventAtEndOfPipe(CommandBuffer* buffer, uint32_t context_id) { +void TriggerEopEventAtEndOfPipe(CommandBuffer* buffer, uint32_t context_id) { EXIT_IF(g_render_ctx == nullptr); EXIT_IF(buffer == nullptr); EXIT_IF(buffer->IsInvalid()); @@ -387,7 +388,7 @@ static void EopEventTriggerFunc(LibKernel::EventQueue::KernelEqueueEvent* event, } } -int GraphicsRenderAddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata) { +int AddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata) { EXIT_IF(g_render_ctx == nullptr); LibKernel::EventQueue::KernelEqueueEvent event; @@ -411,7 +412,7 @@ int GraphicsRenderAddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, voi return result; } -int GraphicsRenderDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id) { +int DeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id) { EXIT_IF(g_render_ctx == nullptr); int result = LibKernel::EventQueue::KernelDeleteEvent( @@ -420,15 +421,15 @@ int GraphicsRenderDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id) return result; } -void GraphicsRenderReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size) { +void ReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size) { EXIT_IF(g_render_ctx == nullptr); g_render_ctx->GetGdsBuffer()->Read(g_render_ctx->GetGraphicCtx(), dst, dw_offset, dw_size); } -void GraphicsRenderDeleteBuffers() { +void DeleteBuffers() { EXIT_IF(g_render_ctx == nullptr); g_render_ctx->GetBufferCache()->DeleteAll(g_render_ctx->GetGraphicCtx()); } -} // namespace Libs::Graphics +} // namespace Libs::Graphics::Sync diff --git a/src/graphics/host_gpu/renderer/sync.h b/src/graphics/host_gpu/renderer/sync.h new file mode 100644 index 000000000..25286af2c --- /dev/null +++ b/src/graphics/host_gpu/renderer/sync.h @@ -0,0 +1,69 @@ +#ifndef EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_SYNC_H_ +#define EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_SYNC_H_ + +#include "kernel/eventQueue.h" + +#include + +namespace Libs::Graphics { + +class CommandBuffer; + +namespace Sync { + +[[nodiscard]] bool ScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency, + uint64_t* value); +[[nodiscard]] uint64_t ReadReferenceClock(); + +void TriggerAgcUserInterrupt(); +void TriggerEopEvent(uint32_t context_id); +void TriggerEopEventAtEndOfPipe(CommandBuffer* buffer, uint32_t context_id); + +void WriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, + uint32_t value); +void WriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer, uint64_t* dst_gpu_addr, + uint64_t value); +void WriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, + uint32_t dw_offset, uint32_t dw_num); +void WriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffer* buffer, + uint64_t* dst_gpu_addr, uint64_t value); +void WriteAtEndOfPipeClockCounterWithWriteBack(uint64_t submit_id, CommandBuffer* buffer, + uint64_t* dst_gpu_addr, uint64_t value); +void WriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBuffer* buffer, + uint32_t* dst_gpu_addr, uint32_t value); +void WriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBuffer* buffer, + uint64_t* dst_gpu_addr, uint64_t value); +void WriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBuffer* buffer, + uint32_t* dst_gpu_addr, uint32_t value, + uint32_t context_id = 0); +void WriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBuffer* buffer, + uint64_t* dst_gpu_addr, uint64_t value, + uint32_t context_id = 0); +void WriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submit_id, CommandBuffer* buffer, + uint32_t* dst_gpu_addr, uint32_t value, + uint32_t context_id = 0); +void WriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submit_id, CommandBuffer* buffer, + uint64_t* dst_gpu_addr, uint64_t value, + uint32_t context_id = 0); + +[[nodiscard]] uint64_t PrepareDisplayBufferFlip(CommandBuffer* buffer, int handle, int index, + int flip_mode, int64_t flip_arg); +void WriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* buffer, int handle, int index, + int flip_mode, int64_t flip_arg, uint64_t request_id); +void WriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* buffer, + uint32_t* dst_gpu_addr, uint32_t value, int handle, int index, + int flip_mode, int64_t flip_arg, uint64_t request_id); +void WriteAtEndOfPipeWithInterruptWriteBackFlip32(uint64_t submit_id, CommandBuffer* buffer, + uint32_t* dst_gpu_addr, uint32_t value, + int handle, int index, int flip_mode, + int64_t flip_arg, uint64_t request_id); + +int AddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata); +int DeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id); +void ReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size); +void DeleteBuffers(); + +} // namespace Sync +} // namespace Libs::Graphics + +#endif // EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_SYNC_H_ diff --git a/src/libs/agc.cpp b/src/libs/agc.cpp index d695952fd..e37ae3771 100644 --- a/src/libs/agc.cpp +++ b/src/libs/agc.cpp @@ -13,6 +13,7 @@ #include "graphics/guest_gpu/tile.h" #include "graphics/host_gpu/objects/label.h" #include "graphics/host_gpu/renderer/render.h" +#include "graphics/host_gpu/renderer/sync.h" #include "graphics/presentation/renderDoc.h" #include "graphics/presentation/videoOut.h" #include "graphics/presentation/window.h" @@ -4004,7 +4005,7 @@ int KYTY_SYSV_ABI GraphicsDriverAddEqEvent(LibKernel::EventQueue::KernelEqueue e return LibKernel::KERNEL_ERROR_EBADF; } - return GraphicsRenderAddEqEvent(eq, id, udata); + return Sync::AddEqEvent(eq, id, udata); } int KYTY_SYSV_ABI GraphicsDriverDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id) { @@ -4014,7 +4015,7 @@ int KYTY_SYSV_ABI GraphicsDriverDeleteEqEvent(LibKernel::EventQueue::KernelEqueu return LibKernel::KERNEL_ERROR_EBADF; } - return GraphicsRenderDeleteEqEvent(eq, id); + return Sync::DeleteEqEvent(eq, id); } int KYTY_SYSV_ABI GraphicsDriverGetEqEventType(const LibKernel::EventQueue::KernelEvent* ev) { diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index 693ca37fc..1a15e7c28 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -15,6 +15,7 @@ #include "graphics/host_gpu/renderer/image.h" #include "graphics/host_gpu/renderer/imageView.h" #include "graphics/host_gpu/renderer/render.h" +#include "graphics/host_gpu/renderer/sync.h" #include "graphics/host_gpu/renderer/renderDraw.h" #include "graphics/host_gpu/renderer/renderTarget.h" #include "graphics/host_gpu/renderer/renderVertex.h" @@ -11944,24 +11945,24 @@ void CheckEmbeddedFetchLaneSpill() { void CheckReferenceClockScale() { uint64_t value = 0; Require("ReferenceClockScale", "zero", - GraphicsScaleReferenceClock(0, 3000000000ull, &value) && value == 0, + Sync::ScaleReferenceClock(0, 3000000000ull, &value) && value == 0, "zero host tick did not produce a zero GPU clock"); Require("ReferenceClockScale", "fractional second", - GraphicsScaleReferenceClock(1500000000ull, 3000000000ull, &value) && + Sync::ScaleReferenceClock(1500000000ull, 3000000000ull, &value) && value == 50000000ull, "host half-second did not scale to 50,000,000 ticks"); Require("ReferenceClockScale", "whole and fractional", - GraphicsScaleReferenceClock(3750000000ull, 3000000000ull, &value) && + Sync::ScaleReferenceClock(3750000000ull, 3000000000ull, &value) && value == 125000000ull, "host 1.25 seconds did not scale to 125,000,000 ticks"); Require("ReferenceClockScale", "monotonic floor", - GraphicsScaleReferenceClock(3750000001ull, 3000000000ull, &value) && + Sync::ScaleReferenceClock(3750000001ull, 3000000000ull, &value) && value == 125000000ull, "sub-reference-tick increment did not use a monotonic floor"); Require("ReferenceClockScale", "guards", - !GraphicsScaleReferenceClock(1, 0, &value) && - !GraphicsScaleReferenceClock(1, 1, nullptr) && - !GraphicsScaleReferenceClock(UINT64_MAX, 1, &value), + !Sync::ScaleReferenceClock(1, 0, &value) && + !Sync::ScaleReferenceClock(1, 1, nullptr) && + !Sync::ScaleReferenceClock(UINT64_MAX, 1, &value), "invalid frequency, destination, or overflow was accepted"); std::printf("[host] %-32s ok\n", "ReferenceClockScale"); }