1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Don't call gDPFillRDRAM for frame buffers created in VI_UpdateScreen(),

because VI_ORIGIN is not correct address of frame buffer start.
This commit is contained in:
Sergey Lipskiy 2014-09-28 13:09:03 +07:00
parent 4a568c984d
commit 2454f70568
4 changed files with 9 additions and 7 deletions

View File

@ -125,7 +125,7 @@ FrameBuffer::FrameBuffer() : m_cleared(false), m_pLoadTile(NULL), m_pDepthBuffer
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_scaleX(_other.m_scaleX), m_scaleY(_other.m_scaleY), m_cleared(_other.m_cleared), m_cfb(_other.m_cfb),
m_FBO(_other.m_FBO), m_pTexture(_other.m_pTexture), m_pLoadTile(_other.m_pLoadTile), m_pDepthBuffer(_other.m_pDepthBuffer)
{
_other.m_FBO = 0;
@ -170,7 +170,7 @@ FrameBuffer * FrameBufferList::findTmpBuffer(u32 _address)
return NULL;
}
void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _width, u16 _height )
void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _width, u16 _height, bool _cfb)
{
if (_SHIFTR(*REG.VI_H_START, 0, 10) == 0) // H width is zero. Don't save
return;
@ -178,7 +178,7 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt
m_drawBuffer = GL_FRAMEBUFFER;
if (m_pCurrent != NULL && gDP.colorImage.height > 1) {
m_pCurrent->m_endAddress = min(RDRAMSize, m_pCurrent->m_startAddress + (((m_pCurrent->m_width * gDP.colorImage.height) << m_pCurrent->m_size >> 1) - 1));
if (!config.frameBufferEmulation.copyToRDRAM && !m_pCurrent->m_cleared)
if (!config.frameBufferEmulation.copyToRDRAM && !m_pCurrent->m_cfb && !m_pCurrent->m_cleared)
gDPFillRDRAM(m_pCurrent->m_startAddress, 0, 0, m_pCurrent->m_width, gDP.colorImage.height, m_pCurrent->m_width, m_pCurrent->m_size, m_pCurrent->m_fillcolor);
}
@ -220,6 +220,7 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt
buffer.m_scaleX = ogl.getScaleX();
buffer.m_scaleY = ogl.getScaleY();
buffer.m_fillcolor = 0;
buffer.m_cfb = _cfb;
buffer.m_pTexture->width = (u32)(buffer.m_width * video().getScaleX());
buffer.m_pTexture->height = (u32)(buffer.m_height * video().getScaleY());

View File

@ -18,6 +18,7 @@ struct FrameBuffer
u32 m_size, m_width, m_height, m_fillcolor;
float m_scaleX, m_scaleY;
bool m_cleared;
bool m_cfb;
GLuint m_FBO;
gDPTile *m_pLoadTile;
@ -30,8 +31,8 @@ class FrameBufferList
public:
void init();
void destroy();
void saveBuffer( u32 _address, u16 _format, u16 _size, u16 _width, u16 _height );
void removeBuffer( u32 _address );
void saveBuffer(u32 _address, u16 _format, u16 _size, u16 _width, u16 _height, bool _cfb);
void removeBuffer(u32 _address);
void attachDepthBuffer();
FrameBuffer * findBuffer(u32 _address);
FrameBuffer * findTmpBuffer(u32 _address);

2
VI.cpp
View File

@ -69,7 +69,7 @@ void VI_UpdateScreen()
ogl.updateScale();
const u32 size = *REG.VI_STATUS & 3;
if (VI.height > 0 && size > G_IM_SIZ_8b && _SHIFTR( *REG.VI_H_START, 0, 10 ) > 0)
frameBufferList().saveBuffer(*REG.VI_ORIGIN, G_IM_FMT_RGBA, size, VI.width, VI.height);
frameBufferList().saveBuffer(*REG.VI_ORIGIN, G_IM_FMT_RGBA, size, VI.width, VI.height, true);
}
if ((((*REG.VI_STATUS)&3) > 0) && (config.frameBufferEmulation.copyFromRDRAM || bCFB)) {
VI_UpdateSize();

View File

@ -276,7 +276,7 @@ void gDPSetColorImage( u32 format, u32 size, u32 width, u32 address )
if (config.frameBufferEmulation.enable) // && address != gDP.depthImageAddress)
{
//if (gDP.colorImage.changed)
frameBufferList().saveBuffer(address, (u16)format, (u16)size, (u16)width, height);
frameBufferList().saveBuffer(address, (u16)format, (u16)size, (u16)width, height, false);
gDP.colorImage.height = 1;
//OGL_ClearDepthBuffer();