1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-06-25 22:09:35 +00:00

FBInfo fixes

This commit is contained in:
Sergey Lipskiy 2017-11-12 12:25:12 +07:00
parent 538674da51
commit 60c092ee23
2 changed files with 41 additions and 25 deletions

View File

@ -1,3 +1,4 @@
#include <assert.h>
#include "FrameBufferInfoAPI.h"
#include "FrameBufferInfo.h"
#include "Config.h"
@ -13,59 +14,68 @@ namespace FBInfo {
FBInfo fbInfo;
FBInfo::FBInfo()
: m_pWriteBuffer(nullptr)
, m_pReadBuffer(nullptr)
, m_supported(false)
{}
{
reset();
}
void FBInfo::reset() {
m_supported = false;
m_pWriteBuffer = m_pReadBuffer = nullptr;
m_writeBuffers.fill(nullptr);
m_readBuffers.fill(nullptr);
}
FBInfo::BufferSearchResult FBInfo::_findBuffer(const BuffersArray& _buffers, const FrameBuffer* _buf) const
{
u32 i = 0;
while (_buffers[i] != nullptr) {
if (_buffers[i++] == _buf)
return BufferSearchResult(true, i);
}
assert(i < _buffers.size());
return BufferSearchResult(false, i);
}
void FBInfo::Write(u32 addr, u32 size)
{
// TODO: remove debug print
//debugPrint("FBWrite addr=%08lx size=%u\n", addr, size);
const u32 address = RSP_SegmentToPhysical(addr);
if (m_pWriteBuffer == nullptr)
m_pWriteBuffer = frameBufferList().findBuffer(address);
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;
FrameBuffer_AddAddress(address, size);
}
void FBInfo::WriteList(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);
const u32 address = RSP_SegmentToPhysical(plist[0].addr);
m_pWriteBuffer = frameBufferList().findBuffer(address);
LOG(LOG_WARNING, "FBWList size=%u\n", size);
}
void FBInfo::Read(u32 addr)
{
// TODO: remove debug print
//debugPrint("FBRead addr=%08lx \n", addr);
const u32 address = RSP_SegmentToPhysical(addr);
FrameBuffer * pBuffer = frameBufferList().findBuffer(address);
if (pBuffer == nullptr || pBuffer == m_pWriteBuffer)
if (pBuffer == nullptr || _findBuffer(m_writeBuffers, pBuffer).first)
return;
const auto findRes = _findBuffer(m_readBuffers, pBuffer);
if (pBuffer->m_isDepthBuffer) {
if (config.frameBufferEmulation.fbInfoReadDepthChunk != 0)
FrameBuffer_CopyDepthBufferChunk(address);
else if (pBuffer != m_pReadBuffer)
else if (!findRes.first)
FrameBuffer_CopyDepthBuffer(address);
} else {
if (config.frameBufferEmulation.fbInfoReadColorChunk != 0)
FrameBuffer_CopyChunkToRDRAM(address);
else if (pBuffer != m_pReadBuffer)
else if (!findRes.first)
FrameBuffer_CopyToRDRAM(address, true);
}
m_pReadBuffer = pBuffer;
if (!findRes.first)
m_readBuffers[findRes.second] = pBuffer;
}
void FBInfo::GetInfo(void *pinfo)
@ -87,7 +97,8 @@ namespace FBInfo {
}
frameBufferList().fillBufferInfo(&pFBInfo[idx], 6 - idx);
m_pWriteBuffer = m_pReadBuffer = nullptr;
m_writeBuffers.fill(nullptr);
m_readBuffers.fill(nullptr);
m_supported = true;
}
}

View File

@ -3,6 +3,7 @@
#include "Platform.h"
#include <array>
#include "Types.h"
#include "PluginAPI.h"
@ -42,8 +43,12 @@ namespace FBInfo {
void reset();
private:
const FrameBuffer * m_pWriteBuffer;
const FrameBuffer * m_pReadBuffer;
using BuffersArray = std::array<const FrameBuffer*, 6>;
using BufferSearchResult = std::pair<bool, u32>;
BufferSearchResult _findBuffer(const BuffersArray& _buffers, const FrameBuffer* _buf) const;
BuffersArray m_writeBuffers;
BuffersArray m_readBuffers;
bool m_supported;
};