Made read transfer handlers more generic.

This commit is contained in:
Jean-Philip Desjardins 2016-05-18 10:12:39 -04:00
parent f18c0a9d40
commit 212c50c3fb
2 changed files with 41 additions and 25 deletions

View File

@ -80,6 +80,7 @@ CGSHandler::CGSHandler()
for(int i = 0; i < PSM_MAX; i++)
{
m_transferWriteHandlers[i] = &CGSHandler::TransferWriteHandlerInvalid;
m_transferReadHandlers[i] = &CGSHandler::TransferReadHandlerInvalid;
}
m_transferWriteHandlers[PSMCT32] = &CGSHandler::TransferWriteHandlerGeneric<CGsPixelFormats::STORAGEPSMCT32>;
@ -92,6 +93,9 @@ CGSHandler::CGSHandler()
m_transferWriteHandlers[PSMT4HL] = &CGSHandler::TransferWriteHandlerPSMT4H<24, 0x0F000000>;
m_transferWriteHandlers[PSMT4HH] = &CGSHandler::TransferWriteHandlerPSMT4H<28, 0xF0000000>;
m_transferReadHandlers[PSMCT32] = &CGSHandler::TransferReadHandlerGeneric<CGsPixelFormats::STORAGEPSMCT32>;
m_transferReadHandlers[PSMT8] = &CGSHandler::TransferReadHandlerGeneric<CGsPixelFormats::STORAGEPSMT8>;
ResetBase();
m_thread = std::thread([&] () { ThreadProc(); });
@ -573,34 +577,10 @@ void CGSHandler::ReadImageDataImpl(void* ptr, uint32 size)
assert(m_trxCtx.nSize != 0);
assert(m_trxCtx.nSize == size);
auto bltBuf = make_convertible<BITBLTBUF>(m_nReg[GS_REG_BITBLTBUF]);
auto trxReg = make_convertible<TRXREG>(m_nReg[GS_REG_TRXREG]);
auto trxPos = make_convertible<TRXPOS>(m_nReg[GS_REG_TRXPOS]);
assert(trxPos.nDIR == 0);
switch(bltBuf.nSrcPsm)
{
case PSMCT32:
{
CGsPixelFormats::CPixelIndexorPSMCT32 indexor(m_pRAM, bltBuf.GetSrcPtr(), bltBuf.nSrcWidth);
for(uint32 i = 0; i < size / sizeof(uint32); i++)
{
uint32 x = (m_trxCtx.nRRX + trxPos.nSSAX) % 2048;
uint32 y = (m_trxCtx.nRRY + trxPos.nSSAY) % 2048;
auto pixel = indexor.GetPixel(x, y);
reinterpret_cast<uint32*>(ptr)[i] = pixel;
m_trxCtx.nRRX++;
if(m_trxCtx.nRRX == trxReg.nRRW)
{
m_trxCtx.nRRX = 0;
m_trxCtx.nRRY++;
}
}
}
break;
default:
assert(false);
break;
}
((this)->*(m_transferReadHandlers[bltBuf.nSrcPsm]))(ptr, size);
}
void CGSHandler::WriteRegisterMassivelyImpl(MASSIVEWRITE_INFO* massiveWrite)
@ -890,6 +870,37 @@ bool CGSHandler::TransferWriteHandlerPSMT8H(const void* pData, uint32 nLength)
return true;
}
void CGSHandler::TransferReadHandlerInvalid(void*, uint32)
{
assert(0);
}
template <typename Storage>
void CGSHandler::TransferReadHandlerGeneric(void* buffer, uint32 length)
{
auto trxPos = make_convertible<TRXPOS>(m_nReg[GS_REG_TRXPOS]);
auto trxReg = make_convertible<TRXREG>(m_nReg[GS_REG_TRXREG]);
auto trxBuf = make_convertible<BITBLTBUF>(m_nReg[GS_REG_BITBLTBUF]);
uint32 typedLength = length / sizeof(typename Storage::Unit);
auto typedBuffer = reinterpret_cast<typename Storage::Unit*>(buffer);
CGsPixelFormats::CPixelIndexor<Storage> indexor(m_pRAM, trxBuf.GetSrcPtr(), trxBuf.nSrcWidth);
for(uint32 i = 0; i < typedLength; i++)
{
uint32 x = (m_trxCtx.nRRX + trxPos.nSSAX) % 2048;
uint32 y = (m_trxCtx.nRRY + trxPos.nSSAY) % 2048;
auto pixel = indexor.GetPixel(x, y);
typedBuffer[i] = pixel;
m_trxCtx.nRRX++;
if(m_trxCtx.nRRX == trxReg.nRRW)
{
m_trxCtx.nRRX = 0;
m_trxCtx.nRRY++;
}
}
}
void CGSHandler::SetCrt(bool nIsInterlaced, unsigned int nMode, bool nIsFrameMode)
{
m_nCrtMode = nMode;

View File

@ -698,6 +698,7 @@ protected:
};
typedef bool (CGSHandler::*TRANSFERWRITEHANDLER)(const void*, uint32);
typedef void (CGSHandler::*TRANSFERREADHANDLER)(void*, uint32);
void LogWrite(uint8, uint64);
void LogPrivateWrite(uint32);
@ -720,6 +721,7 @@ protected:
void BeginTransfer();
TRANSFERWRITEHANDLER m_transferWriteHandlers[PSM_MAX];
TRANSFERREADHANDLER m_transferReadHandlers[PSM_MAX];
bool TransferWriteHandlerInvalid(const void*, uint32);
template <typename Storage> bool TransferWriteHandlerGeneric(const void*, uint32);
@ -728,6 +730,9 @@ protected:
bool TransferWriteHandlerPSMT8H(const void*, uint32);
template <uint32, uint32> bool TransferWriteHandlerPSMT4H(const void*, uint32);
void TransferReadHandlerInvalid(void*, uint32);
template <typename Storage> void TransferReadHandlerGeneric(void*, uint32);
void SyncCLUT(const TEX0&);
void ReadCLUT4(const TEX0&);
void ReadCLUT8(const TEX0&);