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

Fix issues with FrameBufferToRDRAM::copyToRDRAM

This commit is contained in:
Sergey Lipskiy 2016-02-03 01:36:58 +06:00
parent cd0cd82c74
commit dcf32d0c5d

View File

@ -29,7 +29,8 @@ public:
m_pTexture(nullptr), m_pTexture(nullptr),
m_pCurFrameBuffer(nullptr), m_pCurFrameBuffer(nullptr),
m_curIndex(-1), m_curIndex(-1),
m_frameCount(-1) m_frameCount(-1),
m_startAddress(-1)
{ {
m_PBO[0] = m_PBO[1] = m_PBO[2] = 0; m_PBO[0] = m_PBO[1] = m_PBO[2] = 0;
} }
@ -48,7 +49,7 @@ private:
u32 raw; u32 raw;
}; };
bool _prepareCopy(u32 _address); bool _prepareCopy(u32 _startAddress);
void _copy(u32 _startAddress, u32 _endAddress, bool _sync); void _copy(u32 _startAddress, u32 _endAddress, bool _sync);
// Convert pixel from video memory to N64 buffer format. // Convert pixel from video memory to N64 buffer format.
@ -61,6 +62,7 @@ private:
FrameBuffer * m_pCurFrameBuffer; FrameBuffer * m_pCurFrameBuffer;
u32 m_curIndex; u32 m_curIndex;
u32 m_frameCount; u32 m_frameCount;
u32 m_startAddress;
GLuint m_PBO[3]; GLuint m_PBO[3];
}; };
@ -1067,11 +1069,11 @@ void FrameBufferToRDRAM::Destroy() {
m_PBO[0] = m_PBO[1] = m_PBO[2] = 0; m_PBO[0] = m_PBO[1] = m_PBO[2] = 0;
} }
bool FrameBufferToRDRAM::_prepareCopy(u32 _address) bool FrameBufferToRDRAM::_prepareCopy(u32 _startAddress)
{ {
const u32 curFrame = video().getBuffersSwapCount(); const u32 curFrame = video().getBuffersSwapCount();
FrameBuffer * pBuffer = frameBufferList().findBuffer(_address); FrameBuffer * pBuffer = frameBufferList().findBuffer(_startAddress);
if (m_frameCount == curFrame && pBuffer == m_pCurFrameBuffer) if (m_frameCount == curFrame && pBuffer == m_pCurFrameBuffer && m_startAddress != _startAddress)
return true; return true;
if (VI.width == 0 || frameBufferList().getCurrent() == NULL) if (VI.width == 0 || frameBufferList().getCurrent() == NULL)
@ -1086,7 +1088,7 @@ bool FrameBufferToRDRAM::_prepareCopy(u32 _address)
return false; return false;
const u32 stride = m_pCurFrameBuffer->m_width << m_pCurFrameBuffer->m_size >> 1; const u32 stride = m_pCurFrameBuffer->m_width << m_pCurFrameBuffer->m_size >> 1;
const u32 height = _cutHeight(_address, m_pCurFrameBuffer->m_height, stride); const u32 height = _cutHeight(_startAddress, m_pCurFrameBuffer->m_height, stride);
if (height == 0) if (height == 0)
return false; return false;
@ -1095,7 +1097,6 @@ bool FrameBufferToRDRAM::_prepareCopy(u32 _address)
return false; return false;
} }
_address = m_pCurFrameBuffer->m_startAddress;
if (config.video.multisampling != 0) { if (config.video.multisampling != 0) {
m_pCurFrameBuffer->resolveMultisampledTexture(); m_pCurFrameBuffer->resolveMultisampledTexture();
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_pCurFrameBuffer->m_resolveFBO); glBindFramebuffer(GL_READ_FRAMEBUFFER, m_pCurFrameBuffer->m_resolveFBO);
@ -1116,6 +1117,7 @@ bool FrameBufferToRDRAM::_prepareCopy(u32 _address)
} }
m_frameCount = curFrame; m_frameCount = curFrame;
m_startAddress = _startAddress;
return true; return true;
} }
@ -1255,7 +1257,8 @@ void FrameBufferToRDRAM::copyToRDRAM(u32 _address, bool _sync)
{ {
if (!_prepareCopy(_address)) if (!_prepareCopy(_address))
return; return;
_copy(m_pCurFrameBuffer->m_startAddress, m_pCurFrameBuffer->m_endAddress + 1, _sync); const u32 numBytes = (m_pCurFrameBuffer->m_width*m_pCurFrameBuffer->m_height) << m_pCurFrameBuffer->m_size >> 1;
_copy(m_pCurFrameBuffer->m_startAddress, m_pCurFrameBuffer->m_startAddress + numBytes, _sync);
} }
void FrameBufferToRDRAM::copyChunkToRDRAM(u32 _address) void FrameBufferToRDRAM::copyChunkToRDRAM(u32 _address)