diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index e45c6c0392..4604aa4903 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -298,6 +298,13 @@ bool D3D12GSRender::domethod(u32 cmd, u32 arg) case NV4097_CLEAR_SURFACE: clear_surface(arg); return true; + case NV4097_TEXTURE_READ_SEMAPHORE_RELEASE: + semaphore_PGRAPH_texture_read_release(label_addr + rsx::method_registers[NV4097_SET_SEMAPHORE_OFFSET], arg); + return true; + case NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE: + semaphore_PGRAPH_backend_release(label_addr + rsx::method_registers[NV4097_SET_SEMAPHORE_OFFSET], + (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff)); + return true;; default: return false; } @@ -890,12 +897,12 @@ void copyToCellRamAndRelease(void *dstAddress, ID3D12Resource *res, size_t dstPi res->Release(); } -void D3D12GSRender::semaphorePGRAPHTextureReadRelease(u32 offset, u32 value) +void D3D12GSRender::semaphore_PGRAPH_texture_read_release(u32 offset, u32 value) { - semaphorePGRAPHBackendRelease(offset, value); + semaphore_PGRAPH_backend_release(offset, value); } -void D3D12GSRender::semaphorePGRAPHBackendRelease(u32 offset, u32 value) +void D3D12GSRender::semaphore_PGRAPH_backend_release(u32 offset, u32 value) { // Add all buffer write // Cell can't make any assumption about readyness of color/depth buffer @@ -1156,21 +1163,6 @@ void D3D12GSRender::semaphorePGRAPHBackendRelease(u32 offset, u32 value) } } - vm::ps3::write32(label_addr + offset, value); -} - -void D3D12GSRender::semaphorePFIFOAcquire(u32 offset, u32 value) -{ - const std::chrono::time_point enterWait = std::chrono::system_clock::now(); - while (true) - { - volatile u32 val = vm::ps3::read32(label_addr + offset); - if (val == value) break; - std::chrono::time_point waitPoint = std::chrono::system_clock::now(); - long long elapsedTime = std::chrono::duration_cast(waitPoint - enterWait).count(); - if (elapsedTime > 0) - LOG_ERROR(RSX, "Has wait for more than a second for semaphore acquire"); - std::this_thread::yield(); - } + vm::ps3::write32(offset, value); } #endif diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 751ad50d4d..12957c1485 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -456,9 +456,8 @@ public: D3D12GSRender(); virtual ~D3D12GSRender(); - virtual void semaphorePGRAPHTextureReadRelease(u32 offset, u32 value); - virtual void semaphorePGRAPHBackendRelease(u32 offset, u32 value); - virtual void semaphorePFIFOAcquire(u32 offset, u32 value); + void semaphore_PGRAPH_texture_read_release(u32 offset, u32 value); + void semaphore_PGRAPH_backend_release(u32 offset, u32 value); private: void InitD2DStructures(); diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 3e1b7271f0..2c9d4bb525 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1161,11 +1161,23 @@ void nv4097_clear_surface(u32 arg, GLGSRender* renderer) renderer->draw_fbo.clear((gl::buffers)mask); } +static void nv4097_texture_read_semaphore_release(u32 arg, GLGSRender* render) +{ + vm::ps3::write32(render->label_addr + rsx::method_registers[NV4097_SET_SEMAPHORE_OFFSET], arg); +} + +static void nv4097_backend_write_semaphore_release(u32 arg, GLGSRender* render) +{ + vm::ps3::write32(render->label_addr + rsx::method_registers[NV4097_SET_SEMAPHORE_OFFSET], (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff)); +} + using rsx_method_impl_t = void(*)(u32, GLGSRender*); static const std::unordered_map g_gl_method_tbl = { { NV4097_CLEAR_SURFACE, nv4097_clear_surface }, + { NV4097_TEXTURE_READ_SEMAPHORE_RELEASE, nv4097_texture_read_semaphore_release }, + { NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE, nv4097_backend_write_semaphore_release }, }; bool GLGSRender::domethod(u32 cmd, u32 arg) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index eacc8d4950..a801c8c6e4 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -68,14 +68,13 @@ namespace rsx force_inline void texture_read_semaphore_release(thread* rsx, u32 arg) { //TODO: dma - vm::write32(rsx->label_addr + method_registers[NV4097_SET_SEMAPHORE_OFFSET], arg); + rsx->domethod(NV4097_TEXTURE_READ_SEMAPHORE_RELEASE, arg); } force_inline void back_end_write_semaphore_release(thread* rsx, u32 arg) { //TODO: dma - vm::write32(rsx->label_addr + method_registers[NV4097_SET_SEMAPHORE_OFFSET], - (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff)); + rsx->domethod(NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE, arg); } //fire only when all data passed to rsx cmd buffer