diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index 01f0ba9c..a1311632 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -56,7 +56,7 @@ public: void Init(); void Destroy(); - void CopyFromRDRAM( u32 address); + void CopyFromRDRAM( u32 _address, bool _bUseAlpha); private: struct PBOBinder { @@ -706,9 +706,9 @@ void RDRAMtoFrameBuffer::Destroy() glDeleteBuffers(1, &m_PBO); } -void RDRAMtoFrameBuffer::CopyFromRDRAM( u32 address) +void RDRAMtoFrameBuffer::CopyFromRDRAM( u32 _address, bool _bUseAlpha) { - FrameBuffer *current = FrameBuffer_FindBuffer(address); + FrameBuffer *current = FrameBuffer_FindBuffer(_address); if (current == NULL || current->size < G_IM_SIZ_16b) return; @@ -723,7 +723,7 @@ void RDRAMtoFrameBuffer::CopyFromRDRAM( u32 address) if (ptr == NULL) return; - u8 * image = RDRAM + address; + u8 * image = RDRAM + _address; u32 * dst = (u32*)ptr; u32 empty = 0; @@ -731,7 +731,7 @@ void RDRAMtoFrameBuffer::CopyFromRDRAM( u32 address) if (current->size == G_IM_SIZ_16b) { u16 * src = (u16*)image; u16 col; - const u32 bound = (RDRAMSize + 1 - address) >> 1; + const u32 bound = (RDRAMSize + 1 - _address) >> 1; for (u32 y = 0; y < height; y++) { for (u32 x = 0; x < width; x++) @@ -753,7 +753,7 @@ void RDRAMtoFrameBuffer::CopyFromRDRAM( u32 address) // 32 bit u32 * src = (u32*)image; u32 col; - const u32 bound = (RDRAMSize + 1 - address) >> 2; + const u32 bound = (RDRAMSize + 1 - _address) >> 2; for (u32 y=0; y < height; y++) { for (u32 x=0; x < width; x++) @@ -797,7 +797,10 @@ void RDRAMtoFrameBuffer::CopyFromRDRAM( u32 address) glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); - Combiner_SetCombine( EncodeCombineMode( 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0 ) ); + if (_bUseAlpha) + Combiner_SetCombine( EncodeCombineMode( 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0 ) ); + else + Combiner_SetCombine( EncodeCombineMode( 0, 0, 0, TEXEL0, 0, 0, 0, 1, 0, 0, 0, TEXEL0, 0, 0, 0, 1 ) ); glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); //glDisable( GL_ALPHA_TEST ); @@ -844,7 +847,7 @@ void RDRAMtoFrameBuffer::CopyFromRDRAM( u32 address) #endif } -void FrameBuffer_CopyFromRDRAM( u32 address ) +void FrameBuffer_CopyFromRDRAM( u32 address, bool bUseAlpha ) { - g_RDRAMtoFB.CopyFromRDRAM(address); + g_RDRAMtoFB.CopyFromRDRAM(address, bUseAlpha); } diff --git a/FrameBuffer.h b/FrameBuffer.h index d98635dc..58207251 100644 --- a/FrameBuffer.h +++ b/FrameBuffer.h @@ -36,7 +36,7 @@ void FrameBuffer_SaveBuffer( u32 address, u16 format, u16 size, u16 width, u16 h void FrameBuffer_RenderBuffer( u32 address ); void FrameBuffer_RemoveBuffer( u32 address ); void FrameBuffer_CopyToRDRAM( u32 address, bool bSync ); -void FrameBuffer_CopyFromRDRAM( u32 address ); +void FrameBuffer_CopyFromRDRAM( u32 address, bool bUseAlpha ); FrameBuffer *FrameBuffer_FindBuffer( u32 address ); void FrameBuffer_ActivateBufferTexture( s16 t, FrameBuffer *buffer ); void FrameBuffer_ActivateBufferTextureBG( s16 t, FrameBuffer *buffer ); diff --git a/VI.cpp b/VI.cpp index 4b0c42bd..4b203819 100644 --- a/VI.cpp +++ b/VI.cpp @@ -35,6 +35,7 @@ void VI_UpdateSize() void VI_UpdateScreen() { + static u32 uNumCurFrameIsShown = 0; glFinish(); if (OGL.captureScreen) { @@ -43,7 +44,7 @@ void VI_UpdateScreen() } if (OGL.frameBufferTextures) { - const bool bCFB = (gSP.changed&CHANGED_CPU_FB_WRITE) != 0; + const bool bCFB = (gSP.changed&CHANGED_CPU_FB_WRITE) == CHANGED_CPU_FB_WRITE; const bool bNeedUpdate = bCFB ? true : (*REG.VI_ORIGIN != VI.lastOrigin) && gDP.colorImage.changed; if (bNeedUpdate) { @@ -56,17 +57,22 @@ void VI_UpdateScreen() FrameBuffer_SaveBuffer( *REG.VI_ORIGIN, G_IM_FMT_RGBA, size, *REG.VI_WIDTH, VI.height ); } if (g_bCopyFromRDRAM || bCFB) - FrameBuffer_CopyFromRDRAM( *REG.VI_ORIGIN ); + FrameBuffer_CopyFromRDRAM( *REG.VI_ORIGIN, g_bCopyFromRDRAM && !bCFB ); if (g_bCopyToRDRAM && !bCFB) FrameBuffer_CopyToRDRAM( *REG.VI_ORIGIN, false ); FrameBuffer_RenderBuffer( *REG.VI_ORIGIN ); gDP.colorImage.changed = FALSE; VI.lastOrigin = *REG.VI_ORIGIN; + uNumCurFrameIsShown = 0;; #ifdef DEBUG while (Debug.paused && !Debug.step); Debug.step = FALSE; #endif + } else { + uNumCurFrameIsShown++; + if (uNumCurFrameIsShown > 4) + gSP.changed |= CHANGED_CPU_FB_WRITE; } } else {