From a3d702a4dd2ee3ea1a8ef7c2b2df44c981980dd3 Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Sun, 19 Oct 2014 00:11:39 +0700 Subject: [PATCH] Fix detection of frame buffers address space intersection. Fixed problem of growing frame buffers number. --- FrameBuffer.cpp | 12 +++++++----- FrameBuffer.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index 90968656..9239c3bb 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -155,10 +155,11 @@ void FrameBufferList::destroy() { m_drawBuffer = GL_BACK; } -FrameBuffer * FrameBufferList::findBuffer(u32 _address) +FrameBuffer * FrameBufferList::findBuffer(u32 _startAddress, u32 _endAddress) { for (FrameBuffers::iterator iter = m_list.begin(); iter != m_list.end(); ++iter) - if (iter->m_startAddress <= _address && iter->m_endAddress >= _address) + if ((iter->m_startAddress <= _startAddress && iter->m_endAddress >= _startAddress) || + (_startAddress < iter->m_startAddress && _endAddress > iter->m_startAddress)) return &(*iter); return NULL; } @@ -183,8 +184,9 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt 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); } + const u32 endAddress = _address + ((_width * _height << _size >> 1) - 1); if (m_pCurrent == NULL || m_pCurrent->m_startAddress != _address) - m_pCurrent = findBuffer(_address); + m_pCurrent = findBuffer(_address, endAddress); if (m_pCurrent != NULL) { if ((m_pCurrent->m_startAddress != _address) || (m_pCurrent->m_width != _width) || @@ -214,7 +216,7 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt FrameBuffer & buffer = m_list.front(); buffer.m_startAddress = _address; - buffer.m_endAddress = _address + ((_width * _height << _size >> 1) - 1); + buffer.m_endAddress = endAddress; buffer.m_width = _width; buffer.m_height = _height; buffer.m_size = _size; @@ -337,7 +339,7 @@ void FrameBufferList::renderBuffer(u32 _address) if (VI.width == 0) // H width is zero. Don't draw return; - FrameBuffer *pBuffer = findBuffer(_address); + FrameBuffer *pBuffer = findBuffer(_address, 0); if (pBuffer == NULL) return; diff --git a/FrameBuffer.h b/FrameBuffer.h index f9207337..6beacf2c 100644 --- a/FrameBuffer.h +++ b/FrameBuffer.h @@ -34,7 +34,7 @@ public: 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 * findBuffer(u32 _startAddress, u32 _endAddress = 0); FrameBuffer * findTmpBuffer(u32 _address); FrameBuffer * getCurrent() const {return m_pCurrent;} void renderBuffer(u32 _address);