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

Force CFB mode if current frame is shown more than 4 times in succession (<15 fps)

This commit is contained in:
Sergey Lipskiy 2013-09-15 21:40:16 +07:00
parent d6a3b265a5
commit fb0ba864d1
3 changed files with 21 additions and 12 deletions

View File

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

View File

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

10
VI.cpp
View File

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