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();