From 6680577146e7957ece8d3190c4c957f4bd5ffd70 Mon Sep 17 00:00:00 2001 From: rogerman Date: Mon, 20 Nov 2017 10:58:27 -0800 Subject: [PATCH] Render 3D: Handle RenderFinish() more consistently. Fixes 3D flushing issues when running single-threaded SoftRasterizer. --- desmume/src/OGLRender.cpp | 54 ++++++++++++++++++++++----------------- desmume/src/rasterize.cpp | 51 +++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 47 deletions(-) diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp index 96ae5a38f..18829d5e4 100755 --- a/desmume/src/OGLRender.cpp +++ b/desmume/src/OGLRender.cpp @@ -4717,28 +4717,32 @@ Render3DError OpenGLRenderer_1_2::Reset() Render3DError OpenGLRenderer_1_2::RenderFinish() { - if (!this->_renderNeedsFinish || !this->_pixelReadNeedsFinish) + if (!this->_renderNeedsFinish) { return OGLERROR_NOERR; } - if(!BEGINGL()) + if (this->_pixelReadNeedsFinish) { - return OGLERROR_BEGINGL_FAILED; + this->_pixelReadNeedsFinish = false; + + if(!BEGINGL()) + { + return OGLERROR_BEGINGL_FAILED; + } + + if (this->isPBOSupported) + { + this->_mappedFramebuffer = (FragmentColor *__restrict)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); + } + else + { + glReadPixels(0, 0, this->_framebufferWidth, this->_framebufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, this->_framebufferColor); + } + + ENDGL(); } - if (this->isPBOSupported) - { - this->_mappedFramebuffer = (FragmentColor *__restrict)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); - } - else - { - glReadPixels(0, 0, this->_framebufferWidth, this->_framebufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, this->_framebufferColor); - } - - ENDGL(); - - this->_pixelReadNeedsFinish = false; this->_renderNeedsFlushMain = true; this->_renderNeedsFlush16 = true; @@ -5036,21 +5040,25 @@ Render3DError OpenGLRenderer_2_0::SetupTexture(const POLY &thePoly, size_t polyR Render3DError OpenGLRenderer_2_1::RenderFinish() { - if (!this->_renderNeedsFinish || !this->_pixelReadNeedsFinish) + if (!this->_renderNeedsFinish) { return OGLERROR_NOERR; } - if(!BEGINGL()) + if (this->_pixelReadNeedsFinish) { - return OGLERROR_BEGINGL_FAILED; + this->_pixelReadNeedsFinish = false; + + if(!BEGINGL()) + { + return OGLERROR_BEGINGL_FAILED; + } + + this->_mappedFramebuffer = (FragmentColor *__restrict)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); + + ENDGL(); } - this->_mappedFramebuffer = (FragmentColor *__restrict)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); - - ENDGL(); - - this->_pixelReadNeedsFinish = false; this->_renderNeedsFlushMain = true; this->_renderNeedsFlush16 = true; diff --git a/desmume/src/rasterize.cpp b/desmume/src/rasterize.cpp index 5f30eaffd..58bb223c8 100644 --- a/desmume/src/rasterize.cpp +++ b/desmume/src/rasterize.cpp @@ -2226,39 +2226,42 @@ Render3DError SoftRasterizerRenderer::EndRender(const u64 frameCount) Render3DError SoftRasterizerRenderer::RenderFinish() { - if (!this->_renderNeedsFinish || !this->_renderGeometryNeedsFinish) + if (!this->_renderNeedsFinish) { return RENDER3DERROR_NOERR; } - // Allow for the geometry rendering to finish. - this->_renderGeometryNeedsFinish = false; - for (size_t i = 0; i < rasterizerCores; i++) + if (this->_renderGeometryNeedsFinish) { - rasterizerUnitTask[i].finish(); - } - - // Now that geometry rendering is finished on all threads, check the texture cache. - texCache.Evict(); - - // Do multithreaded post-processing. - if (this->_enableEdgeMark || this->_enableFog) - { - for (size_t i = 0; i < rasterizerCores; i++) - { - this->postprocessParam[i].enableEdgeMarking = this->_enableEdgeMark; - this->postprocessParam[i].enableFog = this->_enableFog; - this->postprocessParam[i].fogColor = this->currentRenderState->fogColor; - this->postprocessParam[i].fogAlphaOnly = this->currentRenderState->enableFogAlphaOnly; - - rasterizerUnitTask[i].execute(&SoftRasterizer_RunRenderEdgeMarkAndFog, &this->postprocessParam[i]); - } - - // Allow for post-processing to finish. + // Allow for the geometry rendering to finish. + this->_renderGeometryNeedsFinish = false; for (size_t i = 0; i < rasterizerCores; i++) { rasterizerUnitTask[i].finish(); } + + // Now that geometry rendering is finished on all threads, check the texture cache. + texCache.Evict(); + + // Do multithreaded post-processing. + if (this->_enableEdgeMark || this->_enableFog) + { + for (size_t i = 0; i < rasterizerCores; i++) + { + this->postprocessParam[i].enableEdgeMarking = this->_enableEdgeMark; + this->postprocessParam[i].enableFog = this->_enableFog; + this->postprocessParam[i].fogColor = this->currentRenderState->fogColor; + this->postprocessParam[i].fogAlphaOnly = this->currentRenderState->enableFogAlphaOnly; + + rasterizerUnitTask[i].execute(&SoftRasterizer_RunRenderEdgeMarkAndFog, &this->postprocessParam[i]); + } + + // Allow for post-processing to finish. + for (size_t i = 0; i < rasterizerCores; i++) + { + rasterizerUnitTask[i].finish(); + } + } } this->_renderNeedsFlushMain = true;