mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
make CopyToRDRAM compatible with auxiliary buffers
This commit is contained in:
parent
1c017ebcb4
commit
d8bc38e26d
|
@ -958,14 +958,18 @@ void FrameBufferToRDRAM::Destroy() {
|
||||||
|
|
||||||
void FrameBufferToRDRAM::CopyToRDRAM(u32 _address)
|
void FrameBufferToRDRAM::CopyToRDRAM(u32 _address)
|
||||||
{
|
{
|
||||||
const u32 numPixels = VI.width * VI.height;
|
if (VI.width == 0 || frameBufferList().getCurrent() == NULL)
|
||||||
if (numPixels == 0 || frameBufferList().getCurrent() == NULL) // Incorrect buffer size or no current buffer. Don't copy
|
|
||||||
return;
|
|
||||||
FrameBuffer *pBuffer = frameBufferList().findBuffer(_address);
|
|
||||||
if (pBuffer == NULL || pBuffer->m_width < VI.width || pBuffer->m_isOBScreen)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((config.generalEmulation.hacks & hack_subscreen) != 0) {
|
FrameBuffer *pBuffer = frameBufferList().findBuffer(_address);
|
||||||
|
if (pBuffer == NULL || pBuffer->m_isOBScreen)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const u32 numPixels = pBuffer->m_width * pBuffer->m_height;
|
||||||
|
if (numPixels == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((config.generalEmulation.hacks & hack_subscreen) != 0 && pBuffer->m_width == VI.width && pBuffer->m_height == VI.height) {
|
||||||
copyWhiteToRDRAM(pBuffer);
|
copyWhiteToRDRAM(pBuffer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -994,38 +998,39 @@ void FrameBufferToRDRAM::CopyToRDRAM(u32 _address)
|
||||||
m_curIndex ^= 1;
|
m_curIndex ^= 1;
|
||||||
const u32 nextIndex = m_bSync ? m_curIndex : m_curIndex^1;
|
const u32 nextIndex = m_bSync ? m_curIndex : m_curIndex^1;
|
||||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, m_aPBO[m_curIndex]);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, m_aPBO[m_curIndex]);
|
||||||
glReadPixels(0, 0, VI.width, VI.height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
glReadPixels(0, 0, pBuffer->m_width, pBuffer->m_height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
||||||
PBOBinder binder(GL_PIXEL_PACK_BUFFER, m_aPBO[nextIndex]);
|
PBOBinder binder(GL_PIXEL_PACK_BUFFER, m_aPBO[nextIndex]);
|
||||||
|
|
||||||
GLubyte* pixelData = (GLubyte*)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, numPixels * 4, GL_MAP_READ_BIT);
|
GLubyte* pixelData = (GLubyte*)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, numPixels * 4, GL_MAP_READ_BIT);
|
||||||
if(pixelData == NULL)
|
if (pixelData == NULL)
|
||||||
return;
|
return;
|
||||||
#else
|
#else
|
||||||
GLubyte* pixelData = (GLubyte* )malloc(numPixels * 4);
|
GLubyte* pixelData = (GLubyte* )malloc(numPixels * 4);
|
||||||
if(pixelData == NULL)
|
if (pixelData == NULL)
|
||||||
return;
|
return;
|
||||||
glReadPixels( 0, 0, VI.width, VI.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelData );
|
glReadPixels(0, 0, VI.width, VI.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
|
||||||
#endif // GLES2
|
#endif // GLES2
|
||||||
|
|
||||||
const u32 stride = pBuffer->m_width << pBuffer->m_size >> 1;
|
const u32 stride = pBuffer->m_width << pBuffer->m_size >> 1;
|
||||||
const u32 height = _cutHeight(_address, VI.height, stride);
|
const u32 height = _cutHeight(_address, pBuffer->m_height, stride);
|
||||||
|
|
||||||
if (pBuffer->m_size == G_IM_SIZ_32b) {
|
if (pBuffer->m_size == G_IM_SIZ_32b) {
|
||||||
u32 *ptr_dst = (u32*)(RDRAM + _address);
|
u32 *ptr_dst = (u32*)(RDRAM + _address);
|
||||||
u32 *ptr_src = (u32*)pixelData;
|
u32 *ptr_src = (u32*)pixelData;
|
||||||
|
|
||||||
for (u32 y = 0; y < height; ++y) {
|
for (u32 y = 0; y < height; ++y) {
|
||||||
for (u32 x = 0; x < VI.width; ++x)
|
for (u32 x = 0; x < pBuffer->m_width; ++x)
|
||||||
ptr_dst[x + y*VI.width] = ptr_src[x + (height - y - 1)*VI.width];
|
ptr_dst[x + y*pBuffer->m_width] = ptr_src[x + (height - y - 1)*pBuffer->m_width];
|
||||||
}
|
}
|
||||||
} else {
|
} else if (pBuffer->m_size == G_IM_SIZ_16b) {
|
||||||
u16 *ptr_dst = (u16*)(RDRAM + _address);
|
u16 *ptr_dst = (u16*)(RDRAM + _address);
|
||||||
u32 * ptr_src = (u32*)pixelData;
|
u32 * ptr_src = (u32*)pixelData;
|
||||||
RGBA c;
|
RGBA c;
|
||||||
|
|
||||||
for (u32 y = 0; y < height; ++y) {
|
for (u32 y = 0; y < height; ++y) {
|
||||||
for (u32 x = 0; x < VI.width; ++x) {
|
for (u32 x = 0; x < pBuffer->m_width; ++x) {
|
||||||
c.raw = ptr_src[x + (height - y - 1)*VI.width];
|
c.raw = ptr_src[x + (height - y - 1)*pBuffer->m_width];
|
||||||
ptr_dst[(x + y*VI.width)^1] = ((c.r>>3)<<11) | ((c.g>>3)<<6) | ((c.b>>3)<<1) | (c.a == 0 ? 0 : 1);
|
ptr_dst[(x + y*pBuffer->m_width) ^ 1] = ((c.r >> 3) << 11) | ((c.g >> 3) << 6) | ((c.b >> 3) << 1) | (c.a == 0 ? 0 : 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user