From 6b4ae04f5eee3fb9cd71156d97bdb90cf55c938e Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Thu, 16 Mar 2017 14:56:20 +0700 Subject: [PATCH] Rewrite polygons drawing in N64 depth compare mode. Fixed #1418: Various regressions since PR2.0 with N64 depth compare enabled --- .../OpenGLContext/opengl_BufferedDrawer.cpp | 19 ++++++++++++++----- .../OpenGLContext/opengl_UnbufferedDrawer.cpp | 14 ++++++++++---- src/gSP.cpp | 2 -- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp index d1ca5fda..bda1e8e1 100644 --- a/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp +++ b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp @@ -189,9 +189,6 @@ void BufferedDrawer::_updateTrianglesBuffers(const graphics::Context::DrawTriang void BufferedDrawer::drawTriangles(const graphics::Context::DrawTriangleParameters & _params) { - if (config.frameBufferEmulation.N64DepthCompare != 0) - glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); - _updateTrianglesBuffers(_params); if (config.generalEmulation.enableHWLighting != 0) @@ -202,8 +199,20 @@ void BufferedDrawer::drawTriangles(const graphics::Context::DrawTriangleParamete return; } - glDrawElementsBaseVertex(GLenum(_params.mode), _params.elementsCount, GL_UNSIGNED_BYTE, - (char*)nullptr + m_trisBuffers.ebo.pos - _params.elementsCount, m_trisBuffers.vbo.pos - _params.verticesCount); + if (config.frameBufferEmulation.N64DepthCompare == 0) { + glDrawElementsBaseVertex(GLenum(_params.mode), _params.elementsCount, GL_UNSIGNED_BYTE, + (char*)nullptr + m_trisBuffers.ebo.pos - _params.elementsCount, m_trisBuffers.vbo.pos - _params.verticesCount); + return; + } + + // Draw polygons one by one + const GLint eboStartPos = m_trisBuffers.ebo.pos - _params.elementsCount; + const GLint vboStartPos = m_trisBuffers.vbo.pos - _params.verticesCount; + for (GLint i = 0; i < _params.elementsCount; i += 3) { + glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); + glDrawElementsBaseVertex(GLenum(_params.mode), 3, GL_UNSIGNED_BYTE, + (char*)nullptr + eboStartPos + i, vboStartPos); + } } void BufferedDrawer::drawLine(f32 _width, SPVertex * _vertices) diff --git a/src/Graphics/OpenGLContext/opengl_UnbufferedDrawer.cpp b/src/Graphics/OpenGLContext/opengl_UnbufferedDrawer.cpp index cbfe0853..5ac9c32c 100644 --- a/src/Graphics/OpenGLContext/opengl_UnbufferedDrawer.cpp +++ b/src/Graphics/OpenGLContext/opengl_UnbufferedDrawer.cpp @@ -38,9 +38,6 @@ bool UnbufferedDrawer::_updateAttribPointer(u32 _index, const void * _ptr) void UnbufferedDrawer::drawTriangles(const graphics::Context::DrawTriangleParameters & _params) { - if (config.frameBufferEmulation.N64DepthCompare != 0) - glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); - { m_cachedAttribArray->enableVertexAttribArray(triangleAttrib::position, true); const void * ptr = &_params.vertices->x; @@ -84,7 +81,16 @@ void UnbufferedDrawer::drawTriangles(const graphics::Context::DrawTriangleParame return; } - glDrawElements(GLenum(_params.mode), _params.elementsCount, GL_UNSIGNED_BYTE, _params.elements); + if (config.frameBufferEmulation.N64DepthCompare == 0) { + glDrawElements(GLenum(_params.mode), _params.elementsCount, GL_UNSIGNED_BYTE, _params.elements); + return; + } + + // Draw polygons one by one + for (GLint i = 0; i < _params.elementsCount; i += 3) { + glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); + glDrawElements(GLenum(_params.mode), 3, GL_UNSIGNED_BYTE, (u8*)_params.elements + i); + } } void UnbufferedDrawer::drawRects(const graphics::Context::DrawRectParameters & _params) diff --git a/src/gSP.cpp b/src/gSP.cpp index bfb00b49..25bcbfa7 100644 --- a/src/gSP.cpp +++ b/src/gSP.cpp @@ -60,8 +60,6 @@ void gSPTriangle(s32 v0, s32 v1, s32 v2) if (drawer.isClipped(v0, v1, v2)) return; drawer.addTriangle(v0, v1, v2); - if (config.frameBufferEmulation.N64DepthCompare != 0) - drawer.drawTriangles(); } frameBufferList().setBufferChanged();