mirror of
https://github.com/libretro/Play-.git
synced 2025-03-05 01:38:42 +00:00
Made read transfer handlers more generic.
This commit is contained in:
parent
f18c0a9d40
commit
212c50c3fb
@ -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;
|
||||
|
@ -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&);
|
||||
|
Loading…
x
Reference in New Issue
Block a user