mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-06 00:40:11 +00:00
RSX: Let backend customize semaphore_*_release
This commit is contained in:
parent
426c69710c
commit
fc40b0ed6b
@ -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<std::chrono::system_clock> 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<std::chrono::system_clock> waitPoint = std::chrono::system_clock::now();
|
||||
long long elapsedTime = std::chrono::duration_cast<std::chrono::seconds>(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
|
||||
|
@ -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();
|
||||
|
@ -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<u32, rsx_method_impl_t> 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)
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user