RSX: fixed scissor

This commit is contained in:
DH 2014-07-19 18:39:47 +03:00
parent 0fe32fa0d3
commit 8b9a46bb39
5 changed files with 75 additions and 56 deletions

View file

@ -441,6 +441,19 @@ bool GLGSRender::LoadProgram()
return true; return true;
} }
void GLGSRender::WriteBuffers()
{
if (Ini.GSDumpDepthBuffer.GetValue())
{
WriteDepthBuffer();
}
if (Ini.GSDumpColorBuffers.GetValue())
{
WriteColorBuffers();
}
}
void GLGSRender::WriteDepthBuffer() void GLGSRender::WriteDepthBuffer()
{ {
if (!m_set_context_dma_z) if (!m_set_context_dma_z)
@ -705,16 +718,8 @@ void GLGSRender::OnReset()
m_vao.Delete(); m_vao.Delete();
} }
void GLGSRender::ExecCMD() void GLGSRender::InitDrawBuffers()
{ {
//return;
if(!LoadProgram())
{
LOG_ERROR(RSX, "LoadProgram failed.");
Emu.Pause();
return;
}
if(!m_fbo.IsCreated() || RSXThread::m_width != last_width || RSXThread::m_height != last_height || last_depth_format != m_surface_depth_format) if(!m_fbo.IsCreated() || RSXThread::m_width != last_width || RSXThread::m_height != last_height || last_depth_format != m_surface_depth_format)
{ {
LOG_WARNING(RSX, "New FBO (%dx%d)", RSXThread::m_width, RSXThread::m_height); LOG_WARNING(RSX, "New FBO (%dx%d)", RSXThread::m_width, RSXThread::m_height);
@ -795,11 +800,6 @@ void GLGSRender::ExecCMD()
m_fbo.Bind(); m_fbo.Bind();
if (Ini.GSDumpDepthBuffer.GetValue())
{
WriteDepthBuffer();
}
static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
switch(m_surface_colour_target) switch(m_surface_colour_target)
@ -831,6 +831,13 @@ void GLGSRender::ExecCMD()
LOG_ERROR(RSX, "Bad surface colour target: %d", m_surface_colour_target); LOG_ERROR(RSX, "Bad surface colour target: %d", m_surface_colour_target);
break; break;
} }
}
void GLGSRender::ExecCMD(u32 cmd)
{
assert(cmd == NV4097_CLEAR_SURFACE);
InitDrawBuffers();
if(m_set_color_mask) if(m_set_color_mask)
{ {
@ -838,20 +845,12 @@ void GLGSRender::ExecCMD()
checkForGlError("glColorMask"); checkForGlError("glColorMask");
} }
if(m_set_viewport_horizontal && m_set_viewport_vertical)
{
//glViewport(m_viewport_x, m_viewport_y, m_viewport_w, m_viewport_h);
//checkForGlError("glViewport");
}
if (m_set_scissor_horizontal && m_set_scissor_vertical) if (m_set_scissor_horizontal && m_set_scissor_vertical)
{ {
glScissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h); glScissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h);
checkForGlError("glScissor"); checkForGlError("glScissor");
} }
if(m_clear_surface_mask)
{
GLbitfield f = 0; GLbitfield f = 0;
if (m_clear_surface_mask & 0x1) if (m_clear_surface_mask & 0x1)
@ -880,8 +879,22 @@ void GLGSRender::ExecCMD()
} }
glClear(f); glClear(f);
WriteBuffers();
} }
void GLGSRender::ExecCMD()
{
//return;
if(!LoadProgram())
{
LOG_ERROR(RSX, "LoadProgram failed.");
Emu.Pause();
return;
}
InitDrawBuffers();
Enable(m_set_depth_test, GL_DEPTH_TEST); Enable(m_set_depth_test, GL_DEPTH_TEST);
Enable(m_set_alpha_test, GL_ALPHA_TEST); Enable(m_set_alpha_test, GL_ALPHA_TEST);
Enable(m_set_depth_bounds_test, GL_DEPTH_BOUNDS_TEST_EXT); Enable(m_set_depth_bounds_test, GL_DEPTH_BOUNDS_TEST_EXT);
@ -1169,10 +1182,7 @@ void GLGSRender::ExecCMD()
DisableVertexData(); DisableVertexData();
} }
if (Ini.GSDumpColorBuffers.GetValue()) WriteBuffers();
{
WriteColorBuffers();
}
} }
void GLGSRender::Flip() void GLGSRender::Flip()

View file

@ -846,6 +846,7 @@ private:
void Enable(bool enable, const u32 cap); void Enable(bool enable, const u32 cap);
virtual void Close(); virtual void Close();
bool LoadProgram(); bool LoadProgram();
void WriteBuffers();
void WriteDepthBuffer(); void WriteDepthBuffer();
void WriteColorBuffers(); void WriteColorBuffers();
void WriteColourBufferA(); void WriteColourBufferA();
@ -854,12 +855,14 @@ private:
void WriteColourBufferD(); void WriteColourBufferD();
void DrawObjects(); void DrawObjects();
void InitDrawBuffers();
protected: protected:
virtual void OnInit(); virtual void OnInit();
virtual void OnInitThread(); virtual void OnInitThread();
virtual void OnExitThread(); virtual void OnExitThread();
virtual void OnReset(); virtual void OnReset();
virtual void ExecCMD(u32 cmd);
virtual void ExecCMD(); virtual void ExecCMD();
virtual void Flip(); virtual void Flip();
}; };

View file

@ -31,6 +31,10 @@ private:
{ {
} }
virtual void ExecCMD(u32 cmd)
{
}
virtual void ExecCMD() virtual void ExecCMD()
{ {
} }

View file

@ -822,7 +822,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t args, const u32
if(a0 & 0x40) m_clear_surface_color_b = m_clear_color_b; if(a0 & 0x40) m_clear_surface_color_b = m_clear_color_b;
if(a0 & 0x80) m_clear_surface_color_a = m_clear_color_a; if(a0 & 0x80) m_clear_surface_color_a = m_clear_color_a;
m_clear_surface_mask |= a0; m_clear_surface_mask = a0;
ExecCMD(NV4097_CLEAR_SURFACE);
} }
break; break;

View file

@ -615,6 +615,7 @@ protected:
virtual void OnExitThread() = 0; virtual void OnExitThread() = 0;
virtual void OnReset() = 0; virtual void OnReset() = 0;
virtual void ExecCMD() = 0; virtual void ExecCMD() = 0;
virtual void ExecCMD(u32 cmd) = 0;
virtual void Flip() = 0; virtual void Flip() = 0;
void LoadVertexData(u32 first, u32 count) void LoadVertexData(u32 first, u32 count)