2015-11-23 12:36:03 +00:00
|
|
|
#include "FrameBufferInfoAPI.h"
|
|
|
|
#include "FrameBufferInfo.h"
|
|
|
|
#include "OpenGL.h"
|
|
|
|
#include "FrameBuffer.h"
|
|
|
|
#include "DepthBuffer.h"
|
2015-11-23 13:27:16 +00:00
|
|
|
#include "RSP.h"
|
2015-11-23 12:36:03 +00:00
|
|
|
#include "VI.h"
|
|
|
|
#include "Log.h"
|
|
|
|
|
2015-12-05 17:56:41 +00:00
|
|
|
static const FrameBuffer * s_pWriteBuffer = nullptr;
|
|
|
|
|
2015-11-23 12:36:03 +00:00
|
|
|
void FrameBufferWrite(u32 addr, u32 size)
|
|
|
|
{
|
2016-02-02 18:52:29 +00:00
|
|
|
// TODO: remove debug print
|
2015-11-23 12:36:03 +00:00
|
|
|
debugPrint("FBWrite addr=%08lx size=%u\n", addr, size);
|
2016-02-02 18:52:29 +00:00
|
|
|
|
2015-12-05 17:56:41 +00:00
|
|
|
const u32 address = RSP_SegmentToPhysical(addr);
|
|
|
|
s_pWriteBuffer = frameBufferList().findBuffer(address);
|
|
|
|
FrameBuffer_AddAddress(address);
|
2015-11-23 12:36:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void FrameBufferWriteList(FrameBufferModifyEntry *plist, u32 size)
|
|
|
|
{
|
|
|
|
debugPrint("FBWList size=%u\n", size);
|
|
|
|
for (u32 i = 0; i < size; ++i)
|
|
|
|
debugPrint(" plist[%u] addr=%08lx val=%08lx size=%u\n", i, plist[i].addr, plist[i].val, plist[i].size);
|
2015-12-05 17:56:41 +00:00
|
|
|
const u32 address = RSP_SegmentToPhysical(plist[0].addr);
|
|
|
|
s_pWriteBuffer = frameBufferList().findBuffer(address);
|
2015-11-23 12:36:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void FrameBufferRead(u32 addr)
|
|
|
|
{
|
2015-11-23 13:27:16 +00:00
|
|
|
// TODO: remove debug print
|
2015-11-23 12:36:03 +00:00
|
|
|
debugPrint("FBRead addr=%08lx \n", addr);
|
2015-11-23 13:27:16 +00:00
|
|
|
|
|
|
|
const u32 address = RSP_SegmentToPhysical(addr);
|
|
|
|
FrameBuffer * pBuffer = frameBufferList().findBuffer(address);
|
2015-12-05 17:56:41 +00:00
|
|
|
if (pBuffer == nullptr || pBuffer == s_pWriteBuffer)
|
2015-11-23 13:27:16 +00:00
|
|
|
return;
|
|
|
|
if (pBuffer->m_isDepthBuffer)
|
|
|
|
FrameBuffer_CopyDepthBufferChunk(address);
|
|
|
|
else
|
|
|
|
FrameBuffer_CopyChunkToRDRAM(address);
|
2015-11-23 12:36:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void FrameBufferGetInfo(void *pinfo)
|
|
|
|
{
|
|
|
|
FrameBufferInfo * pFBInfo = (FrameBufferInfo*)pinfo;
|
|
|
|
memset(pFBInfo, 0, sizeof(FrameBufferInfo)* 6);
|
|
|
|
u32 idx = 0;
|
|
|
|
DepthBuffer * pDepthBuffer = depthBufferList().getCurrent();
|
|
|
|
if (pDepthBuffer != nullptr) {
|
|
|
|
pFBInfo[idx].addr = pDepthBuffer->m_address;
|
|
|
|
pFBInfo[idx].width = pDepthBuffer->m_width;
|
|
|
|
pFBInfo[idx].height = VI.real_height;
|
|
|
|
pFBInfo[idx++].size = 2;
|
|
|
|
}
|
|
|
|
frameBufferList().fillBufferInfo(&pFBInfo[idx], 6 - idx);
|
2015-12-05 17:56:41 +00:00
|
|
|
|
|
|
|
s_pWriteBuffer = nullptr;
|
2015-11-23 12:36:03 +00:00
|
|
|
}
|