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 offset = 0;

View file

@ -197,4 +197,8 @@ protected:
virtual void ExecCMD(u32 cmd);
virtual void ExecCMD();
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 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:
{
m_PGRAPH_semaphore_offset = ARGS(0);
break;
}
case NV406E_SEMAPHORE_OFFSET:
{
m_set_semaphore_offset = true;
m_semaphore_offset = ARGS(0);
m_PFIFO_semaphore_offset = ARGS(0);
break;
}
case NV406E_SEMAPHORE_ACQUIRE:
{
if (ARGS(0))
{
LOG_WARNING(RSX, "TODO: NV406E_SEMAPHORE_ACQUIRE: 0x%x", ARGS(0));
}
semaphorePFIFOAcquire(m_PFIFO_semaphore_offset, ARGS(0));
break;
}
case NV406E_SEMAPHORE_RELEASE:
{
m_PFIFO_semaphore_release_value = ARGS(0);
break;
}
case NV4097_TEXTURE_READ_SEMAPHORE_RELEASE:
{
if (m_set_semaphore_offset)
{
m_set_semaphore_offset = false;
vm::write32(m_label_addr + m_semaphore_offset, ARGS(0));
}
semaphorePGRAPHTextureReadRelease(m_PGRAPH_semaphore_offset, ARGS(0));
break;
}
case NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE:
{
if (m_set_semaphore_offset)
{
m_set_semaphore_offset = false;
u32 value = ARGS(0);
value = (value & 0xff00ff00) | ((value & 0xff) << 16) | ((value >> 16) & 0xff);
vm::write32(m_label_addr + m_semaphore_offset, value);
}
u32 value = ARGS(0);
value = (value & 0xff00ff00) | ((value & 0xff) << 16) | ((value >> 16) & 0xff);
semaphorePGRAPHBackendRelease(m_PGRAPH_semaphore_offset, value);
break;
}

View file

@ -343,8 +343,11 @@ public:
s32 m_color_conv_dtdy;
// Semaphore
bool m_set_semaphore_offset;
u32 m_semaphore_offset;
// PGRAPH
u32 m_PGRAPH_semaphore_offset;
//PFIFO
u32 m_PFIFO_semaphore_offset;
u32 m_PFIFO_semaphore_release_value;
// Fog
bool m_set_fog_mode;
@ -597,7 +600,6 @@ protected:
m_set_line_width = false;
m_set_line_smooth = false;
m_set_shade_mode = false;
m_set_semaphore_offset = false;
m_set_fog_mode = false;
m_set_fog_params = false;
m_set_clip_plane = false;
@ -648,6 +650,28 @@ protected:
virtual void ExecCMD(u32 cmd) = 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)
{
for (u32 i = 0; i < m_vertex_count; ++i)