diff --git a/src/BufferCopy/ColorBufferToRDRAM.cpp b/src/BufferCopy/ColorBufferToRDRAM.cpp index 1102b82f..bfe0e1fc 100644 --- a/src/BufferCopy/ColorBufferToRDRAM.cpp +++ b/src/BufferCopy/ColorBufferToRDRAM.cpp @@ -320,16 +320,16 @@ void ColorBufferToRDRAM::_copy(u32 _startAddress, u32 _endAddress, bool _sync) if (m_pCurFrameBuffer->m_size == G_IM_SIZ_32b) { u32 *ptr_src = (u32*)pPixels; u32 *ptr_dst = (u32*)(RDRAM + _startAddress); - writeToRdram(ptr_src, ptr_dst, &ColorBufferToRDRAM::_RGBAtoRGBA32, 0, 0, width, height, numPixels, _startAddress, m_pCurFrameBuffer->m_startAddress, m_pCurFrameBuffer->m_size); + writeToRdram(ptr_src, ptr_dst, &ColorBufferToRDRAM::_RGBAtoRGBA32, valueTester, 0, width, height, numPixels, _startAddress, m_pCurFrameBuffer->m_startAddress, m_pCurFrameBuffer->m_size); } else if (m_pCurFrameBuffer->m_size == G_IM_SIZ_16b) { u32 *ptr_src = (u32*)pPixels; u16 *ptr_dst = (u16*)(RDRAM + _startAddress); m_blueNoiseIdx++; - writeToRdram(ptr_src, ptr_dst, &ColorBufferToRDRAM::_RGBAtoRGBA16, 0, 1, width, height, numPixels, _startAddress, m_pCurFrameBuffer->m_startAddress, m_pCurFrameBuffer->m_size); + writeToRdram(ptr_src, ptr_dst, &ColorBufferToRDRAM::_RGBAtoRGBA16, valueTester, 1, width, height, numPixels, _startAddress, m_pCurFrameBuffer->m_startAddress, m_pCurFrameBuffer->m_size); } else if (m_pCurFrameBuffer->m_size == G_IM_SIZ_8b) { u8 *ptr_src = (u8*)pPixels; u8 *ptr_dst = RDRAM + _startAddress; - writeToRdram(ptr_src, ptr_dst, &ColorBufferToRDRAM::_RGBAtoR8, 0, 3, width, height, numPixels, _startAddress, m_pCurFrameBuffer->m_startAddress, m_pCurFrameBuffer->m_size); + writeToRdram(ptr_src, ptr_dst, &ColorBufferToRDRAM::_RGBAtoR8, dummyTester, 3, width, height, numPixels, _startAddress, m_pCurFrameBuffer->m_startAddress, m_pCurFrameBuffer->m_size); } m_pCurFrameBuffer->m_copiedToRdram = true; diff --git a/src/BufferCopy/DepthBufferToRDRAM.cpp b/src/BufferCopy/DepthBufferToRDRAM.cpp index 9defc6e0..8cf3913d 100644 --- a/src/BufferCopy/DepthBufferToRDRAM.cpp +++ b/src/BufferCopy/DepthBufferToRDRAM.cpp @@ -255,7 +255,7 @@ bool DepthBufferToRDRAM::_copy(u32 _startAddress, u32 _endAddress) writeToRdram(srcBuf.data(), ptr_dst, &DepthBufferToRDRAM::_FloatToUInt16, - 2.0f, + dummyTester, 1, width, height, diff --git a/src/BufferCopy/WriteToRDRAM.h b/src/BufferCopy/WriteToRDRAM.h index 8e9d2487..745218c2 100644 --- a/src/BufferCopy/WriteToRDRAM.h +++ b/src/BufferCopy/WriteToRDRAM.h @@ -4,8 +4,29 @@ #include "../Types.h" +template +bool valueTester(T _c) +{ + return _c != testValue; +} + +template +bool dummyTester(T _c) +{ + return true; +} + template -void writeToRdram(TSrc* _src, TDst* _dst, TDst(*converter)(TSrc _c, u32 x, u32 y), TSrc _testValue, u32 _xor, u32 _width, u32 _height, u32 _numPixels, u32 _startAddress, u32 _bufferAddress, u32 _bufferSize) +void writeToRdram(TSrc* _src, TDst* _dst, + TDst(*converter)(TSrc _c, u32 x, u32 y), + bool(*tester)(TSrc _c), + u32 _xor, + u32 _width, + u32 _height, + u32 _numPixels, + u32 _startAddress, + u32 _bufferAddress, + u32 _bufferSize) { u32 chunkStart = ((_startAddress - _bufferAddress) >> (_bufferSize - 1)) % _width; if (chunkStart % 2 != 0) { @@ -20,7 +41,7 @@ void writeToRdram(TSrc* _src, TDst* _dst, TDst(*converter)(TSrc _c, u32 x, u32 y if (chunkStart > 0) { for (u32 x = chunkStart; x < _width; ++x) { c = _src[x]; - if (c != _testValue) + if (tester(c)) _dst[numStored ^ _xor] = converter(c, x, y); ++numStored; } @@ -32,7 +53,7 @@ void writeToRdram(TSrc* _src, TDst* _dst, TDst(*converter)(TSrc _c, u32 x, u32 y for (; y < _height; ++y) { for (u32 x = 0; x < _width && numStored < _numPixels; ++x) { c = _src[x + y *_width]; - if (c != _testValue) + if (tester(c)) _dst[(x + dsty*_width) ^ _xor] = converter(c, x, y); ++numStored; }