mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-21 03:55:32 +00:00
RSX: fixed scissor
This commit is contained in:
parent
0fe32fa0d3
commit
8b9a46bb39
5 changed files with 75 additions and 56 deletions
|
@ -441,6 +441,19 @@ bool GLGSRender::LoadProgram()
|
|||
return true;
|
||||
}
|
||||
|
||||
void GLGSRender::WriteBuffers()
|
||||
{
|
||||
if (Ini.GSDumpDepthBuffer.GetValue())
|
||||
{
|
||||
WriteDepthBuffer();
|
||||
}
|
||||
|
||||
if (Ini.GSDumpColorBuffers.GetValue())
|
||||
{
|
||||
WriteColorBuffers();
|
||||
}
|
||||
}
|
||||
|
||||
void GLGSRender::WriteDepthBuffer()
|
||||
{
|
||||
if (!m_set_context_dma_z)
|
||||
|
@ -705,16 +718,8 @@ void GLGSRender::OnReset()
|
|||
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)
|
||||
{
|
||||
LOG_WARNING(RSX, "New FBO (%dx%d)", RSXThread::m_width, RSXThread::m_height);
|
||||
|
@ -795,11 +800,6 @@ void GLGSRender::ExecCMD()
|
|||
|
||||
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 };
|
||||
|
||||
switch(m_surface_colour_target)
|
||||
|
@ -831,6 +831,13 @@ void GLGSRender::ExecCMD()
|
|||
LOG_ERROR(RSX, "Bad surface colour target: %d", m_surface_colour_target);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GLGSRender::ExecCMD(u32 cmd)
|
||||
{
|
||||
assert(cmd == NV4097_CLEAR_SURFACE);
|
||||
|
||||
InitDrawBuffers();
|
||||
|
||||
if(m_set_color_mask)
|
||||
{
|
||||
|
@ -838,50 +845,56 @@ void GLGSRender::ExecCMD()
|
|||
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)
|
||||
{
|
||||
glScissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h);
|
||||
checkForGlError("glScissor");
|
||||
}
|
||||
|
||||
if(m_clear_surface_mask)
|
||||
|
||||
GLbitfield f = 0;
|
||||
|
||||
if (m_clear_surface_mask & 0x1)
|
||||
{
|
||||
GLbitfield f = 0;
|
||||
glClearDepth(m_clear_surface_z / (float)0xffffff);
|
||||
|
||||
if (m_clear_surface_mask & 0x1)
|
||||
{
|
||||
glClearDepth(m_clear_surface_z / (float)0xffffff);
|
||||
|
||||
f |= GL_DEPTH_BUFFER_BIT;
|
||||
}
|
||||
|
||||
if (m_clear_surface_mask & 0x2)
|
||||
{
|
||||
glClearStencil(m_clear_surface_s);
|
||||
|
||||
f |= GL_STENCIL_BUFFER_BIT;
|
||||
}
|
||||
|
||||
if (m_clear_surface_mask & 0xF0)
|
||||
{
|
||||
glClearColor(
|
||||
m_clear_surface_color_r / 255.0f,
|
||||
m_clear_surface_color_g / 255.0f,
|
||||
m_clear_surface_color_b / 255.0f,
|
||||
m_clear_surface_color_a / 255.0f);
|
||||
|
||||
f |= GL_COLOR_BUFFER_BIT;
|
||||
}
|
||||
|
||||
glClear(f);
|
||||
f |= GL_DEPTH_BUFFER_BIT;
|
||||
}
|
||||
|
||||
if (m_clear_surface_mask & 0x2)
|
||||
{
|
||||
glClearStencil(m_clear_surface_s);
|
||||
|
||||
f |= GL_STENCIL_BUFFER_BIT;
|
||||
}
|
||||
|
||||
if (m_clear_surface_mask & 0xF0)
|
||||
{
|
||||
glClearColor(
|
||||
m_clear_surface_color_r / 255.0f,
|
||||
m_clear_surface_color_g / 255.0f,
|
||||
m_clear_surface_color_b / 255.0f,
|
||||
m_clear_surface_color_a / 255.0f);
|
||||
|
||||
f |= GL_COLOR_BUFFER_BIT;
|
||||
}
|
||||
|
||||
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_alpha_test, GL_ALPHA_TEST);
|
||||
Enable(m_set_depth_bounds_test, GL_DEPTH_BOUNDS_TEST_EXT);
|
||||
|
@ -1168,11 +1181,8 @@ void GLGSRender::ExecCMD()
|
|||
checkForGlError("glDrawArrays");
|
||||
DisableVertexData();
|
||||
}
|
||||
|
||||
if (Ini.GSDumpColorBuffers.GetValue())
|
||||
{
|
||||
WriteColorBuffers();
|
||||
}
|
||||
|
||||
WriteBuffers();
|
||||
}
|
||||
|
||||
void GLGSRender::Flip()
|
||||
|
|
|
@ -846,6 +846,7 @@ private:
|
|||
void Enable(bool enable, const u32 cap);
|
||||
virtual void Close();
|
||||
bool LoadProgram();
|
||||
void WriteBuffers();
|
||||
void WriteDepthBuffer();
|
||||
void WriteColorBuffers();
|
||||
void WriteColourBufferA();
|
||||
|
@ -854,12 +855,14 @@ private:
|
|||
void WriteColourBufferD();
|
||||
|
||||
void DrawObjects();
|
||||
void InitDrawBuffers();
|
||||
|
||||
protected:
|
||||
virtual void OnInit();
|
||||
virtual void OnInitThread();
|
||||
virtual void OnExitThread();
|
||||
virtual void OnReset();
|
||||
virtual void ExecCMD(u32 cmd);
|
||||
virtual void ExecCMD();
|
||||
virtual void Flip();
|
||||
};
|
||||
|
|
|
@ -30,7 +30,11 @@ private:
|
|||
virtual void OnReset()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
virtual void ExecCMD(u32 cmd)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void ExecCMD()
|
||||
{
|
||||
}
|
||||
|
|
|
@ -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 & 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;
|
||||
|
||||
|
|
|
@ -615,6 +615,7 @@ protected:
|
|||
virtual void OnExitThread() = 0;
|
||||
virtual void OnReset() = 0;
|
||||
virtual void ExecCMD() = 0;
|
||||
virtual void ExecCMD(u32 cmd) = 0;
|
||||
virtual void Flip() = 0;
|
||||
|
||||
void LoadVertexData(u32 first, u32 count)
|
||||
|
|
Loading…
Add table
Reference in a new issue