From 737080274afa0e16c087d9183c2577dee7b3c595 Mon Sep 17 00:00:00 2001 From: DH Date: Tue, 13 Oct 2015 20:39:36 +0300 Subject: [PATCH] Improved NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE and NV4097_TEXTURE_READ_SEMAPHORE_RELEASE commands handling --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 18 ++++++++---------- rpcs3/Emu/RSX/D3D12/D3D12GSRender.h | 4 ++-- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 14 +------------- rpcs3/Emu/RSX/RSXThread.cpp | 5 +++-- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 0650453862..51fd1cf814 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -300,12 +300,12 @@ bool D3D12GSRender::domethod(u32 cmd, u32 arg) 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; + semaphore_PGRAPH_texture_read_release(); + return false; //call rsx::thread method implementation 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;; + semaphore_PGRAPH_backend_release(); + return false; //call rsx::thread method implementation + default: return false; } @@ -898,12 +898,12 @@ void copyToCellRamAndRelease(void *dstAddress, ID3D12Resource *res, size_t dstPi res->Release(); } -void D3D12GSRender::semaphore_PGRAPH_texture_read_release(u32 offset, u32 value) +void D3D12GSRender::semaphore_PGRAPH_texture_read_release() { - semaphore_PGRAPH_backend_release(offset, value); + semaphore_PGRAPH_backend_release(); } -void D3D12GSRender::semaphore_PGRAPH_backend_release(u32 offset, u32 value) +void D3D12GSRender::semaphore_PGRAPH_backend_release() { // Add all buffer write // Cell can't make any assumption about readyness of color/depth buffer @@ -1163,7 +1163,5 @@ void D3D12GSRender::semaphore_PGRAPH_backend_release(u32 offset, u32 value) break; } } - - vm::ps3::write32(offset, value); } #endif diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 12957c1485..0d1018c419 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -456,8 +456,8 @@ public: D3D12GSRender(); virtual ~D3D12GSRender(); - void semaphore_PGRAPH_texture_read_release(u32 offset, u32 value); - void semaphore_PGRAPH_backend_release(u32 offset, u32 value); + void semaphore_PGRAPH_texture_read_release(); + void semaphore_PGRAPH_backend_release(); private: void InitD2DStructures(); diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 7ccc5b823e..4c5928c4cc 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1162,23 +1162,11 @@ 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 }, + { NV4097_CLEAR_SURFACE, nv4097_clear_surface } }; bool GLGSRender::domethod(u32 cmd, u32 arg) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 3c0b143632..21562f44f2 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -68,13 +68,14 @@ namespace rsx force_inline void texture_read_semaphore_release(thread* rsx, u32 arg) { //TODO: dma - rsx->domethod(NV4097_TEXTURE_READ_SEMAPHORE_RELEASE, arg); + vm::write32(rsx->label_addr + method_registers[NV4097_SET_SEMAPHORE_OFFSET], arg); } force_inline void back_end_write_semaphore_release(thread* rsx, u32 arg) { //TODO: dma - rsx->domethod(NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE, arg); + vm::write32(rsx->label_addr + method_registers[NV4097_SET_SEMAPHORE_OFFSET], + (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff)); } //fire only when all data passed to rsx cmd buffer