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

FBWrite draft implementation.

This commit is contained in:
Sergey Lipskiy 2016-02-03 00:52:29 +06:00
parent 646a88139c
commit 857ae8a360
3 changed files with 54 additions and 3 deletions

View File

@ -101,14 +101,38 @@ private:
class RDRAMtoFrameBuffer
{
public:
RDRAMtoFrameBuffer() : m_pTexture(NULL), m_PBO(0) {}
RDRAMtoFrameBuffer()
: m_uly(0)
, m_lry(0)
, m_stride(0)
, m_pCurBuffer(nullptr)
, m_pTexture(nullptr)
, m_PBO(0) {
}
void Init();
void Destroy();
void CopyFromRDRAM( u32 _address, bool _bUseAlpha);
void AddAddress(u32 _address);
void CopyFromRDRAM(u32 _address, bool _bUseAlpha);
private:
class Cleaner {
public:
Cleaner(RDRAMtoFrameBuffer * _p) : m_p(_p) {}
~Cleaner() {
m_p->m_uly = 0;
m_p->m_lry = 0;
m_p->m_stride = 0;
m_p->m_pCurBuffer = nullptr;
}
private:
RDRAMtoFrameBuffer * m_p;
};
u32 m_uly, m_lry;
u32 m_stride;
FrameBuffer * m_pCurBuffer;
CachedTexture * m_pTexture;
#ifndef GLES2
GLuint m_PBO;
@ -1521,6 +1545,24 @@ void RDRAMtoFrameBuffer::Destroy()
#endif
}
void RDRAMtoFrameBuffer::AddAddress(u32 _address)
{
if (m_pCurBuffer == nullptr) {
m_pCurBuffer = frameBufferList().findBuffer(_address);
if (m_pCurBuffer == nullptr)
return;
m_stride = m_pCurBuffer->m_width << m_pCurBuffer->m_size >> 1;
m_uly = m_lry = (_address - m_pCurBuffer->m_startAddress) / m_stride;
return;
}
const u32 y = (_address - m_pCurBuffer->m_startAddress) / m_stride;
if (y < m_uly)
m_uly = y;
else if (y > m_lry)
m_lry = y;
}
void RDRAMtoFrameBuffer::CopyFromRDRAM( u32 _address, bool _bUseAlpha)
{
FrameBuffer *pBuffer = frameBufferList().findBuffer(_address);
@ -1657,3 +1699,8 @@ void FrameBuffer_CopyFromRDRAM( u32 address, bool bUseAlpha )
{
g_RDRAMtoFB.CopyFromRDRAM(address, bUseAlpha);
}
void FrameBuffer_AddAddress(u32 address)
{
g_RDRAMtoFB.AddAddress(address);
}

View File

@ -121,7 +121,8 @@ void FrameBuffer_Destroy();
void FrameBuffer_CopyToRDRAM( u32 _address , bool _sync );
void FrameBuffer_CopyChunkToRDRAM(u32 _address);
void FrameBuffer_CopyFromRDRAM(u32 address, bool bUseAlpha);
bool FrameBuffer_CopyDepthBuffer( u32 address );
void FrameBuffer_AddAddress(u32 address);
bool FrameBuffer_CopyDepthBuffer(u32 address);
bool FrameBuffer_CopyDepthBufferChunk(u32 address);
void FrameBuffer_ActivateBufferTexture(s16 t, FrameBuffer *pBuffer);
void FrameBuffer_ActivateBufferTextureBG(s16 t, FrameBuffer *pBuffer);

View File

@ -9,7 +9,10 @@
void FrameBufferWrite(u32 addr, u32 size)
{
// TODO: remove debug print
debugPrint("FBWrite addr=%08lx size=%u\n", addr, size);
FrameBuffer_AddAddress(RSP_SegmentToPhysical(addr));
}
void FrameBufferWriteList(FrameBufferModifyEntry *plist, u32 size)