Improved NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE and NV4097_TEXTURE_READ_SEMAPHORE_RELEASE commands handling

This commit is contained in:
DH 2015-10-13 20:39:36 +03:00
commit 737080274a
4 changed files with 14 additions and 27 deletions

View file

@ -300,12 +300,12 @@ bool D3D12GSRender::domethod(u32 cmd, u32 arg)
clear_surface(arg); clear_surface(arg);
return true; return true;
case NV4097_TEXTURE_READ_SEMAPHORE_RELEASE: case NV4097_TEXTURE_READ_SEMAPHORE_RELEASE:
semaphore_PGRAPH_texture_read_release(label_addr + rsx::method_registers[NV4097_SET_SEMAPHORE_OFFSET], arg); semaphore_PGRAPH_texture_read_release();
return true; return false; //call rsx::thread method implementation
case NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE: case NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE:
semaphore_PGRAPH_backend_release(label_addr + rsx::method_registers[NV4097_SET_SEMAPHORE_OFFSET], semaphore_PGRAPH_backend_release();
(arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff)); return false; //call rsx::thread method implementation
return true;;
default: default:
return false; return false;
} }
@ -898,12 +898,12 @@ void copyToCellRamAndRelease(void *dstAddress, ID3D12Resource *res, size_t dstPi
res->Release(); 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 // Add all buffer write
// Cell can't make any assumption about readyness of color/depth buffer // 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; break;
} }
} }
vm::ps3::write32(offset, value);
} }
#endif #endif

View file

@ -456,8 +456,8 @@ public:
D3D12GSRender(); D3D12GSRender();
virtual ~D3D12GSRender(); virtual ~D3D12GSRender();
void semaphore_PGRAPH_texture_read_release(u32 offset, u32 value); void semaphore_PGRAPH_texture_read_release();
void semaphore_PGRAPH_backend_release(u32 offset, u32 value); void semaphore_PGRAPH_backend_release();
private: private:
void InitD2DStructures(); void InitD2DStructures();

View file

@ -1162,23 +1162,11 @@ void nv4097_clear_surface(u32 arg, GLGSRender* renderer)
renderer->draw_fbo.clear((gl::buffers)mask); 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*); using rsx_method_impl_t = void(*)(u32, GLGSRender*);
static const std::unordered_map<u32, rsx_method_impl_t> g_gl_method_tbl = static const std::unordered_map<u32, rsx_method_impl_t> g_gl_method_tbl =
{ {
{ NV4097_CLEAR_SURFACE, nv4097_clear_surface }, { 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) bool GLGSRender::domethod(u32 cmd, u32 arg)

View file

@ -68,13 +68,14 @@ namespace rsx
force_inline void texture_read_semaphore_release(thread* rsx, u32 arg) force_inline void texture_read_semaphore_release(thread* rsx, u32 arg)
{ {
//TODO: dma //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) force_inline void back_end_write_semaphore_release(thread* rsx, u32 arg)
{ {
//TODO: dma //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 //fire only when all data passed to rsx cmd buffer