1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-04 10:03:36 +00:00

Rewrite polygons drawing in N64 depth compare mode.

Fixed #1418: Various regressions since PR2.0 with N64 depth compare enabled
This commit is contained in:
Sergey Lipskiy 2017-03-16 14:56:20 +07:00
parent 07a84a9973
commit 6b4ae04f5e
3 changed files with 24 additions and 11 deletions

View File

@ -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)

View File

@ -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)

View File

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