RSX/GL/Null: Move semaphore handling to backend

This commit is contained in:
vlj 2015-05-26 18:35:56 +02:00
parent 01bb63b1a6
commit 288581cb43
5 changed files with 74 additions and 22 deletions

View file

@ -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;

View file

@ -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;
}; };

View file

@ -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
{
}
}; };

View file

@ -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) u32 value = ARGS(0);
{ value = (value & 0xff00ff00) | ((value & 0xff) << 16) | ((value >> 16) & 0xff);
m_set_semaphore_offset = false; semaphorePGRAPHBackendRelease(m_PGRAPH_semaphore_offset, value);
u32 value = ARGS(0);
value = (value & 0xff00ff00) | ((value & 0xff) << 16) | ((value >> 16) & 0xff);
vm::write32(m_label_addr + m_semaphore_offset, value);
}
break; break;
} }

View file

@ -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)