diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index 4e3a6e85..58258e30 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -95,7 +95,7 @@ DepthBufferToRDRAM g_dbToRDRAM; #endif RDRAMtoFrameBuffer g_RDRAMtoFB; -FrameBuffer::FrameBuffer() : m_cleared(false), m_isDepthBuffer(false), m_copiedToRDRAM(false), m_pLoadTile(NULL), m_pDepthBuffer(NULL), m_pResolveTexture(NULL), m_resolveFBO(0), m_resolved(false) +FrameBuffer::FrameBuffer() : m_cleared(false), m_changed(false), m_isDepthBuffer(false), m_copiedToRDRAM(false), m_pLoadTile(NULL), m_pDepthBuffer(NULL), m_pResolveTexture(NULL), m_resolveFBO(0), m_resolved(false) { m_pTexture = textureCache().addFrameBufferTexture(); glGenFramebuffers(1, &m_FBO); @@ -104,7 +104,7 @@ FrameBuffer::FrameBuffer() : m_cleared(false), m_isDepthBuffer(false), m_copiedT FrameBuffer::FrameBuffer(FrameBuffer && _other) : m_startAddress(_other.m_startAddress), m_endAddress(_other.m_endAddress), m_size(_other.m_size), m_width(_other.m_width), m_height(_other.m_height), m_fillcolor(_other.m_fillcolor), - m_scaleX(_other.m_scaleX), m_scaleY(_other.m_scaleY), m_cleared(_other.m_cleared), m_cfb(_other.m_cfb), m_isDepthBuffer(_other.m_isDepthBuffer), m_copiedToRDRAM(_other.m_copiedToRDRAM), + m_scaleX(_other.m_scaleX), m_scaleY(_other.m_scaleY), m_cleared(_other.m_cleared), m_changed(_other.m_changed), m_cfb(_other.m_cfb), m_isDepthBuffer(_other.m_isDepthBuffer), m_copiedToRDRAM(_other.m_copiedToRDRAM), m_FBO(_other.m_FBO), m_pLoadTile(_other.m_pLoadTile), m_pTexture(_other.m_pTexture), m_pDepthBuffer(_other.m_pDepthBuffer), m_pResolveTexture(_other.m_pResolveTexture), m_resolveFBO(_other.m_resolveFBO), m_resolved(_other.m_resolved) { @@ -243,6 +243,20 @@ void FrameBufferList::destroy() { m_drawBuffer = GL_BACK; } +void FrameBufferList::setBufferChanged() +{ + gDP.colorImage.changed = TRUE; + if (m_pCurrent != NULL) + m_pCurrent->m_changed = true; +} + +void FrameBufferList::clearBuffersChanged() +{ + gDP.colorImage.changed = FALSE; + for (FrameBuffers::iterator iter = m_list.begin(); iter != m_list.end(); ++iter) + iter->m_changed = false; +} + FrameBuffer * FrameBufferList::findBuffer(u32 _startAddress) { for (FrameBuffers::iterator iter = m_list.begin(); iter != m_list.end(); ++iter) diff --git a/FrameBuffer.h b/FrameBuffer.h index 22484ead..4d184add 100644 --- a/FrameBuffer.h +++ b/FrameBuffer.h @@ -21,6 +21,7 @@ struct FrameBuffer u32 m_size, m_width, m_height, m_fillcolor; float m_scaleX, m_scaleY; bool m_cleared; + bool m_changed; bool m_cfb; bool m_isDepthBuffer; bool m_copiedToRDRAM; @@ -52,6 +53,8 @@ public: FrameBuffer * getCurrent() const {return m_pCurrent;} void renderBuffer(u32 _address); bool isFboMode() const {return m_drawBuffer == GL_FRAMEBUFFER;} + void setBufferChanged(); + void clearBuffersChanged(); static FrameBufferList & get() { diff --git a/OpenGL.cpp b/OpenGL.cpp index 2030d7c7..5ba50328 100644 --- a/OpenGL.cpp +++ b/OpenGL.cpp @@ -804,7 +804,7 @@ void OGLRender::drawLLETriangle(u32 _numVtx) glDrawArrays(GL_TRIANGLE_STRIP, 0, _numVtx); triangles.num = 0; - gDP.colorImage.changed = TRUE; + frameBufferList().setBufferChanged(); gSP.changed |= CHANGED_VIEWPORT | CHANGED_GEOMETRYMODE; #ifdef __TRIBUFFER_OPT diff --git a/VI.cpp b/VI.cpp index 74d6e82a..a0d9abde 100644 --- a/VI.cpp +++ b/VI.cpp @@ -141,7 +141,7 @@ void VI_UpdateScreen() if (uNumCurFrameIsShown > 25) gSP.changed |= CHANGED_CPU_FB_WRITE; } - gDP.colorImage.changed = FALSE; + frameBufferList().clearBuffersChanged(); VI.lastOrigin = *REG.VI_ORIGIN; #ifdef DEBUG while (Debug.paused && !Debug.step); diff --git a/gDP.cpp b/gDP.cpp index a6df782a..a1b86e58 100644 --- a/gDP.cpp +++ b/gDP.cpp @@ -934,7 +934,7 @@ void gDPFillRectangle( s32 ulx, s32 uly, s32 lrx, s32 lry ) } render.drawRect(ulx, uly, lrx, lry, pColor); - gDP.colorImage.changed = TRUE; + frameBufferList().setBufferChanged(); if (gDP.otherMode.cycleType == G_CYC_FILL) { if (lry > (u32)gDP.scissor.lry) gDP.colorImage.height = (u32)max(gDP.colorImage.height, (u32)gDP.scissor.lry); @@ -1019,7 +1019,7 @@ void gDPTextureRectangle( f32 ulx, f32 uly, f32 lrx, f32 lry, s32 tile, f32 s, f gSP.textureTile[0] = textureTileOrg[0]; gSP.textureTile[1] = textureTileOrg[1]; - gDP.colorImage.changed = TRUE; + frameBufferList().setBufferChanged(); if (gDP.colorImage.width < 64) gDP.colorImage.height = (u32)max( (f32)gDP.colorImage.height, lry ); else diff --git a/gSP.cpp b/gSP.cpp index 2030ca1b..86bc3cbd 100644 --- a/gSP.cpp +++ b/gSP.cpp @@ -46,7 +46,7 @@ void gSPTriangle(s32 v0, s32 v1, s32 v2) render.drawTriangles(); } - gDP.colorImage.changed = TRUE; + frameBufferList().setBufferChanged(); gDP.colorImage.height = (u32)max( gDP.colorImage.height, (u32)gDP.scissor.lry ); } @@ -2303,7 +2303,7 @@ void gSPObjSprite(u32 sp) render.drawLLETriangle(4); - gDP.colorImage.changed = TRUE; + frameBufferList().setBufferChanged(); gDP.colorImage.height = (u32)(max( gDP.colorImage.height, (u32)gDP.scissor.lry )); }