mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +00:00
Fix frame buffer content check in CheckForFrameBufferTexture.
Frame buffer area is cleared in FrameBufferList::saveBuffer. If scissor does not equal to frame buffer size, clear is incorrect. Solution: clear frame buffer area without scissoring. Fixed background in Dr.Mario
This commit is contained in:
parent
cd0ec661ba
commit
6f40fa430b
|
@ -295,7 +295,7 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt
|
|||
if (m_pCurrent != NULL && gDP.colorImage.height > 0) {
|
||||
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_cfb && !m_pCurrent->m_cleared && gDP.colorImage.height > 1)
|
||||
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);
|
||||
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, false);
|
||||
}
|
||||
|
||||
const u32 endAddress = _address + ((_width * (_height - 1)) << _size >> 1) - 1;
|
||||
|
|
12
gDP.cpp
12
gDP.cpp
|
@ -844,7 +844,7 @@ void gDPSetScissor( u32 mode, f32 ulx, f32 uly, f32 lrx, f32 lry )
|
|||
}
|
||||
|
||||
const bool g_bDepthClearOnly = false;
|
||||
void gDPFillRDRAM(u32 address, s32 ulx, s32 uly, s32 lrx, s32 lry, u32 width, u32 size, u32 color )
|
||||
void gDPFillRDRAM(u32 address, s32 ulx, s32 uly, s32 lrx, s32 lry, u32 width, u32 size, u32 color, bool scissor)
|
||||
{
|
||||
if (g_bDepthClearOnly && color != DEPTH_CLEAR_COLOR)
|
||||
return;
|
||||
|
@ -853,10 +853,12 @@ void gDPFillRDRAM(u32 address, s32 ulx, s32 uly, s32 lrx, s32 lry, u32 width, u3
|
|||
fbList.getCurrent()->m_cleared = true;
|
||||
fbList.getCurrent()->m_fillcolor = color;
|
||||
}
|
||||
ulx = min(max((float)ulx, gDP.scissor.ulx), gDP.scissor.lrx);
|
||||
lrx = min(max((float)lrx, gDP.scissor.ulx), gDP.scissor.lrx);
|
||||
uly = min(max((float)uly, gDP.scissor.uly), gDP.scissor.lry);
|
||||
lry = min(max((float)lry, gDP.scissor.uly), gDP.scissor.lry);
|
||||
if (scissor) {
|
||||
ulx = min(max((float)ulx, gDP.scissor.ulx), gDP.scissor.lrx);
|
||||
lrx = min(max((float)lrx, gDP.scissor.ulx), gDP.scissor.lrx);
|
||||
uly = min(max((float)uly, gDP.scissor.uly), gDP.scissor.lry);
|
||||
lry = min(max((float)lry, gDP.scissor.uly), gDP.scissor.lry);
|
||||
}
|
||||
const u32 stride = width << size >> 1;
|
||||
const u32 lowerBound = address + lry*stride;
|
||||
if (lowerBound > RDRAMSize)
|
||||
|
|
2
gDP.h
2
gDP.h
|
@ -305,7 +305,7 @@ void gDPTriShadeZ( u32 w0, u32 w1 );
|
|||
void gDPTriTxtrZ( u32 w0, u32 w1 );
|
||||
void gDPTriShadeTxtrZ( u32 w0, u32 w1 );
|
||||
|
||||
void gDPFillRDRAM( u32 address, s32 ulx, s32 uly, s32 lrx, s32 lry, u32 width, u32 size, u32 color );
|
||||
void gDPFillRDRAM( u32 address, s32 ulx, s32 uly, s32 lrx, s32 lry, u32 width, u32 size, u32 color, bool scissor=true );
|
||||
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user