mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-16 03:38:38 +12:00
RSX/GL/Null: Move semaphore handling to backend
This commit is contained in:
parent
01bb63b1a6
commit
288581cb43
5 changed files with 74 additions and 22 deletions
|
@ -2143,6 +2143,21 @@ void GLGSRender::Flip()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLGSRender::semaphorePGRAPHTextureReadRelease(u32 offset, u32 value)
|
||||||
|
{
|
||||||
|
vm::write32(m_label_addr + offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLGSRender::semaphorePGRAPHBackendRelease(u32 offset, u32 value)
|
||||||
|
{
|
||||||
|
vm::write32(m_label_addr + offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLGSRender::semaphorePFIFOAcquire(u32 offset, u32 value)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
u32 LinearToSwizzleAddress(u32 x, u32 y, u32 z, u32 log2_width, u32 log2_height, u32 log2_depth)
|
u32 LinearToSwizzleAddress(u32 x, u32 y, u32 z, u32 log2_width, u32 log2_height, u32 log2_depth)
|
||||||
{
|
{
|
||||||
u32 offset = 0;
|
u32 offset = 0;
|
||||||
|
|
|
@ -197,4 +197,8 @@ protected:
|
||||||
virtual void ExecCMD(u32 cmd);
|
virtual void ExecCMD(u32 cmd);
|
||||||
virtual void ExecCMD();
|
virtual void ExecCMD();
|
||||||
virtual void Flip();
|
virtual void Flip();
|
||||||
|
|
||||||
|
virtual void semaphorePGRAPHTextureReadRelease(u32 offset, u32 value) override;
|
||||||
|
virtual void semaphorePGRAPHBackendRelease(u32 offset, u32 value) override;
|
||||||
|
virtual void semaphorePFIFOAcquire(u32 offset, u32 value) override;
|
||||||
};
|
};
|
||||||
|
|
|
@ -46,4 +46,16 @@ private:
|
||||||
virtual void Close()
|
virtual void Close()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void semaphorePGRAPHTextureReadRelease(u32 offset, u32 value) override
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void semaphorePGRAPHBackendRelease(u32 offset, u32 value) override
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void semaphorePFIFOAcquire(u32 offset, u32 value) override
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
|
@ -201,43 +201,40 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
|
||||||
}
|
}
|
||||||
|
|
||||||
case NV4097_SET_SEMAPHORE_OFFSET:
|
case NV4097_SET_SEMAPHORE_OFFSET:
|
||||||
|
{
|
||||||
|
m_PGRAPH_semaphore_offset = ARGS(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case NV406E_SEMAPHORE_OFFSET:
|
case NV406E_SEMAPHORE_OFFSET:
|
||||||
{
|
{
|
||||||
m_set_semaphore_offset = true;
|
m_PFIFO_semaphore_offset = ARGS(0);
|
||||||
m_semaphore_offset = ARGS(0);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case NV406E_SEMAPHORE_ACQUIRE:
|
case NV406E_SEMAPHORE_ACQUIRE:
|
||||||
{
|
{
|
||||||
if (ARGS(0))
|
semaphorePFIFOAcquire(m_PFIFO_semaphore_offset, ARGS(0));
|
||||||
{
|
|
||||||
LOG_WARNING(RSX, "TODO: NV406E_SEMAPHORE_ACQUIRE: 0x%x", ARGS(0));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case NV406E_SEMAPHORE_RELEASE:
|
case NV406E_SEMAPHORE_RELEASE:
|
||||||
|
{
|
||||||
|
m_PFIFO_semaphore_release_value = ARGS(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case NV4097_TEXTURE_READ_SEMAPHORE_RELEASE:
|
case NV4097_TEXTURE_READ_SEMAPHORE_RELEASE:
|
||||||
{
|
{
|
||||||
if (m_set_semaphore_offset)
|
semaphorePGRAPHTextureReadRelease(m_PGRAPH_semaphore_offset, ARGS(0));
|
||||||
{
|
|
||||||
m_set_semaphore_offset = false;
|
|
||||||
vm::write32(m_label_addr + m_semaphore_offset, ARGS(0));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE:
|
case NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE:
|
||||||
{
|
{
|
||||||
if (m_set_semaphore_offset)
|
|
||||||
{
|
|
||||||
m_set_semaphore_offset = false;
|
|
||||||
u32 value = ARGS(0);
|
u32 value = ARGS(0);
|
||||||
value = (value & 0xff00ff00) | ((value & 0xff) << 16) | ((value >> 16) & 0xff);
|
value = (value & 0xff00ff00) | ((value & 0xff) << 16) | ((value >> 16) & 0xff);
|
||||||
|
semaphorePGRAPHBackendRelease(m_PGRAPH_semaphore_offset, value);
|
||||||
vm::write32(m_label_addr + m_semaphore_offset, value);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -343,8 +343,11 @@ public:
|
||||||
s32 m_color_conv_dtdy;
|
s32 m_color_conv_dtdy;
|
||||||
|
|
||||||
// Semaphore
|
// Semaphore
|
||||||
bool m_set_semaphore_offset;
|
// PGRAPH
|
||||||
u32 m_semaphore_offset;
|
u32 m_PGRAPH_semaphore_offset;
|
||||||
|
//PFIFO
|
||||||
|
u32 m_PFIFO_semaphore_offset;
|
||||||
|
u32 m_PFIFO_semaphore_release_value;
|
||||||
|
|
||||||
// Fog
|
// Fog
|
||||||
bool m_set_fog_mode;
|
bool m_set_fog_mode;
|
||||||
|
@ -597,7 +600,6 @@ protected:
|
||||||
m_set_line_width = false;
|
m_set_line_width = false;
|
||||||
m_set_line_smooth = false;
|
m_set_line_smooth = false;
|
||||||
m_set_shade_mode = false;
|
m_set_shade_mode = false;
|
||||||
m_set_semaphore_offset = false;
|
|
||||||
m_set_fog_mode = false;
|
m_set_fog_mode = false;
|
||||||
m_set_fog_params = false;
|
m_set_fog_params = false;
|
||||||
m_set_clip_plane = false;
|
m_set_clip_plane = false;
|
||||||
|
@ -648,6 +650,28 @@ protected:
|
||||||
virtual void ExecCMD(u32 cmd) = 0;
|
virtual void ExecCMD(u32 cmd) = 0;
|
||||||
virtual void Flip() = 0;
|
virtual void Flip() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This member is called when RSXThread parse a TEXTURE_READ_SEMAPHORE_RELEASE
|
||||||
|
* command.
|
||||||
|
* Backend is expected to write value at offset when current draw textures aren't
|
||||||
|
* needed anymore by the GPU and can be modified.
|
||||||
|
*/
|
||||||
|
virtual void semaphorePGRAPHTextureReadRelease(u32 offset, u32 value) = 0;
|
||||||
|
/**
|
||||||
|
* This member is called when RSXThread parse a BACK_END_WRITE_SEMAPHORE_RELEASE
|
||||||
|
* command.
|
||||||
|
* Backend is expected to write value at offset when current draw call has completed
|
||||||
|
* and render surface can be used.
|
||||||
|
*/
|
||||||
|
virtual void semaphorePGRAPHBackendRelease(u32 offset, u32 value) = 0;
|
||||||
|
/**
|
||||||
|
* This member is called when RSXThread parse a SEMAPHORE_ACQUIRE command.
|
||||||
|
* Backend and associated GPU is expected to wait that memory at offset is the same
|
||||||
|
* as value. In particular buffer/texture buffers value can change while backend is
|
||||||
|
* waiting.
|
||||||
|
*/
|
||||||
|
virtual void semaphorePFIFOAcquire(u32 offset, u32 value) = 0;
|
||||||
|
|
||||||
void LoadVertexData(u32 first, u32 count)
|
void LoadVertexData(u32 first, u32 count)
|
||||||
{
|
{
|
||||||
for (u32 i = 0; i < m_vertex_count; ++i)
|
for (u32 i = 0; i < m_vertex_count; ++i)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue