2017-11-12 05:25:12 +00:00
|
|
|
#include <assert.h>
|
2015-11-23 12:36:03 +00:00
|
|
|
#include "FrameBufferInfoAPI.h"
|
|
|
|
#include "FrameBufferInfo.h"
|
2016-02-03 16:18:40 +00:00
|
|
|
#include "Config.h"
|
2017-01-22 13:43:05 +00:00
|
|
|
#include "gSP.h"
|
2015-11-23 12:36:03 +00:00
|
|
|
#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"
|
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
namespace FBInfo {
|
2015-12-05 17:56:41 +00:00
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
FBInfo fbInfo;
|
2016-02-03 16:29:28 +00:00
|
|
|
|
2016-04-23 14:58:29 +00:00
|
|
|
FBInfo::FBInfo()
|
2017-11-12 05:25:12 +00:00
|
|
|
{
|
|
|
|
reset();
|
|
|
|
}
|
2016-04-23 14:58:29 +00:00
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
void FBInfo::reset() {
|
|
|
|
m_supported = false;
|
2017-11-12 05:25:12 +00:00
|
|
|
m_writeBuffers.fill(nullptr);
|
|
|
|
m_readBuffers.fill(nullptr);
|
2016-02-27 05:58:56 +00:00
|
|
|
}
|
|
|
|
|
2017-11-12 05:25:12 +00:00
|
|
|
FBInfo::BufferSearchResult FBInfo::_findBuffer(const BuffersArray& _buffers, const FrameBuffer* _buf) const
|
2016-02-27 05:58:56 +00:00
|
|
|
{
|
2017-11-12 05:25:12 +00:00
|
|
|
u32 i = 0;
|
|
|
|
while (_buffers[i] != nullptr) {
|
|
|
|
if (_buffers[i++] == _buf)
|
|
|
|
return BufferSearchResult(true, i);
|
|
|
|
}
|
|
|
|
assert(i < _buffers.size());
|
|
|
|
return BufferSearchResult(false, i);
|
|
|
|
}
|
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
|
2017-11-12 05:25:12 +00:00
|
|
|
void FBInfo::Write(u32 addr, u32 size)
|
|
|
|
{
|
2016-02-27 05:58:56 +00:00
|
|
|
const u32 address = RSP_SegmentToPhysical(addr);
|
2017-11-12 05:25:12 +00:00
|
|
|
const FrameBuffer* writeBuffer = frameBufferList().findBuffer(address);
|
|
|
|
if (writeBuffer == nullptr)
|
|
|
|
return;
|
|
|
|
const auto findRes = _findBuffer(m_writeBuffers, writeBuffer);
|
|
|
|
if (!findRes.first)
|
|
|
|
m_writeBuffers[findRes.second] = writeBuffer;
|
2016-02-27 05:58:56 +00:00
|
|
|
FrameBuffer_AddAddress(address, size);
|
|
|
|
}
|
2016-02-02 18:52:29 +00:00
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
void FBInfo::WriteList(FrameBufferModifyEntry *plist, u32 size)
|
|
|
|
{
|
2019-04-10 04:29:06 +00:00
|
|
|
LOG(LOG_WARNING, "FBWList size=%u", size);
|
2016-02-27 05:58:56 +00:00
|
|
|
}
|
2015-11-23 12:36:03 +00:00
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
void FBInfo::Read(u32 addr)
|
|
|
|
{
|
|
|
|
const u32 address = RSP_SegmentToPhysical(addr);
|
|
|
|
FrameBuffer * pBuffer = frameBufferList().findBuffer(address);
|
2017-11-12 05:25:12 +00:00
|
|
|
|
|
|
|
if (pBuffer == nullptr || _findBuffer(m_writeBuffers, pBuffer).first)
|
2016-02-27 05:58:56 +00:00
|
|
|
return;
|
2015-11-23 13:27:16 +00:00
|
|
|
|
2017-11-12 05:25:12 +00:00
|
|
|
const auto findRes = _findBuffer(m_readBuffers, pBuffer);
|
2016-02-27 05:58:56 +00:00
|
|
|
if (pBuffer->m_isDepthBuffer) {
|
2016-09-23 05:05:48 +00:00
|
|
|
if (config.frameBufferEmulation.fbInfoReadDepthChunk != 0)
|
|
|
|
FrameBuffer_CopyDepthBufferChunk(address);
|
2017-11-12 05:25:12 +00:00
|
|
|
else if (!findRes.first)
|
2016-09-23 05:05:48 +00:00
|
|
|
FrameBuffer_CopyDepthBuffer(address);
|
2016-06-09 16:43:33 +00:00
|
|
|
} else {
|
2016-02-27 05:58:56 +00:00
|
|
|
if (config.frameBufferEmulation.fbInfoReadColorChunk != 0)
|
|
|
|
FrameBuffer_CopyChunkToRDRAM(address);
|
2017-11-12 05:25:12 +00:00
|
|
|
else if (!findRes.first)
|
2016-02-27 05:58:56 +00:00
|
|
|
FrameBuffer_CopyToRDRAM(address, true);
|
|
|
|
}
|
2016-01-31 11:24:27 +00:00
|
|
|
|
2017-11-12 05:25:12 +00:00
|
|
|
if (!findRes.first)
|
|
|
|
m_readBuffers[findRes.second] = pBuffer;
|
2016-02-03 16:18:40 +00:00
|
|
|
}
|
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
void FBInfo::GetInfo(void *pinfo)
|
|
|
|
{
|
|
|
|
// debugPrint("FBGetInfo\n");
|
|
|
|
FrameBufferInfo * pFBInfo = (FrameBufferInfo*)pinfo;
|
|
|
|
memset(pFBInfo, 0, sizeof(FrameBufferInfo)* 6);
|
2015-11-23 12:36:03 +00:00
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
if (config.frameBufferEmulation.fbInfoDisabled != 0)
|
|
|
|
return;
|
2016-02-03 16:18:40 +00:00
|
|
|
|
2016-02-27 05:58:56 +00:00
|
|
|
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);
|
2016-02-03 16:18:40 +00:00
|
|
|
|
2017-11-12 05:25:12 +00:00
|
|
|
m_writeBuffers.fill(nullptr);
|
|
|
|
m_readBuffers.fill(nullptr);
|
2016-02-27 05:58:56 +00:00
|
|
|
m_supported = true;
|
2015-11-23 12:36:03 +00:00
|
|
|
}
|
2016-06-09 16:43:33 +00:00
|
|
|
}
|