mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +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:
parent
4a568c984d
commit
2454f70568
|
@ -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());
|
||||
|
|
|
@ -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
2
VI.cpp
|
@ -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();
|
||||
|
|
2
gDP.cpp
2
gDP.cpp
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue
Block a user