mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Use accessors better for block transfers.
This commit is contained in:
parent
6227fe0754
commit
0a217a1254
5 changed files with 58 additions and 71 deletions
|
@ -1300,22 +1300,22 @@ void GLES_GPU::DoBlockTransfer() {
|
|||
//
|
||||
// etc....
|
||||
|
||||
u32 srcBasePtr = (gstate.transfersrc & 0xFFFFF0) | ((gstate.transfersrcw & 0xFF0000) << 8);
|
||||
u32 srcStride = gstate.transfersrcw & 0x3F8;
|
||||
u32 srcBasePtr = gstate.getTransferSrcAddress();
|
||||
u32 srcStride = gstate.getTransferSrcStride();
|
||||
|
||||
u32 dstBasePtr = (gstate.transferdst & 0xFFFFF0) | ((gstate.transferdstw & 0xFF0000) << 8);
|
||||
u32 dstStride = gstate.transferdstw & 0x3F8;
|
||||
u32 dstBasePtr = gstate.getTransferDstAddress();
|
||||
u32 dstStride = gstate.getTransferDstStride();
|
||||
|
||||
int srcX = gstate.transfersrcpos & 0x3FF;
|
||||
int srcY = (gstate.transfersrcpos >> 10) & 0x3FF;
|
||||
int srcX = gstate.getTransferSrcX();
|
||||
int srcY = gstate.getTransferSrcY();
|
||||
|
||||
int dstX = gstate.transferdstpos & 0x3FF;
|
||||
int dstY = (gstate.transferdstpos >> 10) & 0x3FF;
|
||||
int dstX = gstate.getTransferDstX();
|
||||
int dstY = gstate.getTransferDstY();
|
||||
|
||||
int width = (gstate.transfersize & 0x3FF) + 1;
|
||||
int height = ((gstate.transfersize >> 10) & 0x3FF) + 1;
|
||||
int width = gstate.getTransferWidth();
|
||||
int height = gstate.getTransferHeight();
|
||||
|
||||
int bpp = (gstate.transferstart & 1) ? 4 : 2;
|
||||
int bpp = gstate.getTransferBpp();
|
||||
|
||||
DEBUG_LOG(G3D, "Block transfer: %08x/%x -> %08x/%x, %ix%ix%i (%i,%i)->(%i,%i)", srcBasePtr, srcStride, dstBasePtr, dstStride, width, height, bpp, srcX, srcY, dstX, dstY);
|
||||
|
||||
|
|
|
@ -356,6 +356,19 @@ struct GPUgstate
|
|||
|
||||
GEPatchPrimType getPatchPrimitiveType() const { return static_cast<GEPatchPrimType>(patchprimitive & 3); }
|
||||
|
||||
// Transfers
|
||||
u32 getTransferSrcAddress() const { return (transfersrc & 0xFFFFF0) | ((transfersrcw & 0xFF0000) << 8); }
|
||||
u32 getTransferSrcStride() const { return transfersrcw & 0x3F8; }
|
||||
int getTransferSrcX() const { return (transfersrcpos >> 0) & 0x3FF; }
|
||||
int getTransferSrcY() const { return (transfersrcpos >> 10) & 0x3FF; }
|
||||
u32 getTransferDstAddress() const { return (transferdst & 0xFFFFF0) | ((transferdstw & 0xFF0000) << 8); }
|
||||
u32 getTransferDstStride() const { return transferdstw & 0x3F8; }
|
||||
int getTransferDstX() const { return (transferdstpos >> 0) & 0x3FF; }
|
||||
int getTransferDstY() const { return (transferdstpos >> 10) & 0x3FF; }
|
||||
int getTransferWidth() const { return ((transfersize >> 0) & 0x3FF) + 1; }
|
||||
int getTransferHeight() const { return ((transfersize >> 10) & 0x3FF) + 1; }
|
||||
int getTransferBpp() const { return (transferstart & 1) ? 4 : 2; }
|
||||
|
||||
// Real data in the context ends here
|
||||
};
|
||||
|
||||
|
|
|
@ -437,7 +437,10 @@ void GeDisassembleOp(u32 pc, u32 op, u32 prev, char *buffer) {
|
|||
|
||||
case GE_CMD_TRANSFERSRC:
|
||||
{
|
||||
sprintf(buffer, "Block transfer src: %06x", data);
|
||||
if (data & 0xF)
|
||||
sprintf(buffer, "Block transfer src: %06x (extra: %x)", data & ~0xF, data & 0xF);
|
||||
else
|
||||
sprintf(buffer, "Block transfer src: %06x", data);
|
||||
// Nothing to do, the next one prints
|
||||
}
|
||||
break;
|
||||
|
@ -445,7 +448,7 @@ void GeDisassembleOp(u32 pc, u32 op, u32 prev, char *buffer) {
|
|||
case GE_CMD_TRANSFERSRCW:
|
||||
{
|
||||
u32 xferSrc = (gstate.transfersrc & 0x00FFFFFF) | ((data & 0xFF0000) << 8);
|
||||
u32 xferSrcW = gstate.transfersrcw & 1023;
|
||||
u32 xferSrcW = data & 0x3FF;
|
||||
if (data & ~0xFF03FF)
|
||||
sprintf(buffer, "Block transfer src: %08x W: %i (extra %x)", xferSrc, xferSrcW, data);
|
||||
else
|
||||
|
@ -456,14 +459,17 @@ void GeDisassembleOp(u32 pc, u32 op, u32 prev, char *buffer) {
|
|||
case GE_CMD_TRANSFERDST:
|
||||
{
|
||||
// Nothing to do, the next one prints
|
||||
sprintf(buffer, "Block transfer dst: %06x", data);
|
||||
if (data & 0xF)
|
||||
sprintf(buffer, "Block transfer dst: %06x (extra: %x)", data & ~0xF, data & 0xF);
|
||||
else
|
||||
sprintf(buffer, "Block transfer dst: %06x", data);
|
||||
}
|
||||
break;
|
||||
|
||||
case GE_CMD_TRANSFERDSTW:
|
||||
{
|
||||
u32 xferDst = (gstate.transferdst & 0x00FFFFFF) | ((data & 0xFF0000) << 8);
|
||||
u32 xferDstW = gstate.transferdstw & 1023;
|
||||
u32 xferDstW = data & 0x3FF;
|
||||
if (data & ~0xFF03FF)
|
||||
sprintf(buffer, "Block transfer dest: %08x W: %i (extra %x)", xferDst, xferDstW, data);
|
||||
else
|
||||
|
@ -505,10 +511,10 @@ void GeDisassembleOp(u32 pc, u32 op, u32 prev, char *buffer) {
|
|||
}
|
||||
|
||||
case GE_CMD_TRANSFERSTART: // Orphis calls this TRXKICK
|
||||
if (data)
|
||||
sprintf(buffer, "Block transfer start: %x", data);
|
||||
if (data & ~1)
|
||||
sprintf(buffer, "Block transfer start: %d (extra %x)", data & 1, data & ~1);
|
||||
else
|
||||
sprintf(buffer, "Block transfer start");
|
||||
sprintf(buffer, "Block transfer start: %d", data);
|
||||
break;
|
||||
|
||||
case GE_CMD_TEXSIZE0:
|
||||
|
|
|
@ -282,8 +282,8 @@ void NullGPU::ExecuteOp(u32 op, u32 diff)
|
|||
|
||||
case GE_CMD_TRANSFERSRCW:
|
||||
{
|
||||
u32 xferSrc = gstate.transfersrc | ((data&0xFF0000)<<8);
|
||||
u32 xferSrcW = gstate.transfersrcw & 1023;
|
||||
u32 xferSrc = (gstate.transfersrc & 0x00FFFFFF) | ((data & 0xFF0000) << 8);
|
||||
u32 xferSrcW = data & 0x3FF;
|
||||
DEBUG_LOG(G3D,"Block Transfer Src: %08x W: %i", xferSrc, xferSrcW);
|
||||
break;
|
||||
}
|
||||
|
@ -291,8 +291,8 @@ void NullGPU::ExecuteOp(u32 op, u32 diff)
|
|||
|
||||
case GE_CMD_TRANSFERDSTW:
|
||||
{
|
||||
u32 xferDst= gstate.transferdst | ((data&0xFF0000)<<8);
|
||||
u32 xferDstW = gstate.transferdstw & 1023;
|
||||
u32 xferDst = (gstate.transferdst & 0x00FFFFFF) | ((data & 0xFF0000) << 8);
|
||||
u32 xferDstW = data & 0x3FF;
|
||||
DEBUG_LOG(G3D,"Block Transfer Dest: %08x W: %i", xferDst, xferDstW);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -549,67 +549,36 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff)
|
|||
}
|
||||
break;
|
||||
|
||||
//case GE_CMD_TRANSFERSRC:
|
||||
|
||||
// Don't need to do anything, just state for transferstart.
|
||||
case GE_CMD_TRANSFERSRC:
|
||||
case GE_CMD_TRANSFERSRCW:
|
||||
{
|
||||
u32 xferSrc = gstate.transfersrc | ((data&0xFF0000)<<8);
|
||||
u32 xferSrcW = gstate.transfersrcw & 1023;
|
||||
DEBUG_LOG(G3D,"Block Transfer Src: %08x W: %i", xferSrc, xferSrcW);
|
||||
break;
|
||||
}
|
||||
// case GE_CMD_TRANSFERDST:
|
||||
|
||||
case GE_CMD_TRANSFERDST:
|
||||
case GE_CMD_TRANSFERDSTW:
|
||||
{
|
||||
u32 xferDst= gstate.transferdst | ((data&0xFF0000)<<8);
|
||||
u32 xferDstW = gstate.transferdstw & 1023;
|
||||
DEBUG_LOG(G3D,"Block Transfer Dest: %08x W: %i", xferDst, xferDstW);
|
||||
break;
|
||||
}
|
||||
|
||||
case GE_CMD_TRANSFERSRCPOS:
|
||||
{
|
||||
u32 x = (data & 1023)+1;
|
||||
u32 y = ((data>>10) & 1023)+1;
|
||||
DEBUG_LOG(G3D, "DL Block Transfer Src Rect TL: %i, %i", x, y);
|
||||
break;
|
||||
}
|
||||
|
||||
case GE_CMD_TRANSFERDSTPOS:
|
||||
{
|
||||
u32 x = (data & 1023)+1;
|
||||
u32 y = ((data>>10) & 1023)+1;
|
||||
DEBUG_LOG(G3D, "DL Block Transfer Dest Rect TL: %i, %i", x, y);
|
||||
break;
|
||||
}
|
||||
|
||||
case GE_CMD_TRANSFERSIZE:
|
||||
{
|
||||
u32 w = (data & 1023)+1;
|
||||
u32 h = ((data>>10) & 1023)+1;
|
||||
DEBUG_LOG(G3D, "DL Block Transfer Rect Size: %i x %i", w, h);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case GE_CMD_TRANSFERSTART:
|
||||
{
|
||||
u32 srcBasePtr = (gstate.transfersrc & 0xFFFFF0) | ((gstate.transfersrcw & 0xFF0000) << 8);
|
||||
u32 srcStride = gstate.transfersrcw & 0x3F8;
|
||||
u32 srcBasePtr = gstate.getTransferSrcAddress();
|
||||
u32 srcStride = gstate.getTransferSrcStride();
|
||||
|
||||
u32 dstBasePtr = (gstate.transferdst & 0xFFFFF0) | ((gstate.transferdstw & 0xFF0000) << 8);
|
||||
u32 dstStride = gstate.transferdstw & 0x3F8;
|
||||
u32 dstBasePtr = gstate.getTransferDstAddress();
|
||||
u32 dstStride = gstate.getTransferDstStride();
|
||||
|
||||
int srcX = gstate.transfersrcpos & 0x3FF;
|
||||
int srcY = (gstate.transfersrcpos >> 10) & 0x3FF;
|
||||
int srcX = gstate.getTransferSrcX();
|
||||
int srcY = gstate.getTransferSrcY();
|
||||
|
||||
int dstX = gstate.transferdstpos & 0x3FF;
|
||||
int dstY = (gstate.transferdstpos >> 10) & 0x3FF;
|
||||
int dstX = gstate.getTransferDstX();
|
||||
int dstY = gstate.getTransferDstY();
|
||||
|
||||
int width = (gstate.transfersize & 0x3FF) + 1;
|
||||
int height = ((gstate.transfersize >> 10) & 0x3FF) + 1;
|
||||
int width = gstate.getTransferWidth();
|
||||
int height = gstate.getTransferHeight();
|
||||
|
||||
int bpp = (gstate.transferstart & 1) ? 4 : 2;
|
||||
int bpp = gstate.getTransferBpp();
|
||||
|
||||
DEBUG_LOG(G3D, "Block transfer: %08x/%x -> %08x/%x, %ix%ix%i (%i,%i)->(%i,%i)", srcBasePtr, srcStride, dstBasePtr, dstStride, width, height, bpp, srcX, srcY, dstX, dstY);
|
||||
|
||||
for (int y = 0; y < height; y++) {
|
||||
const u8 *src = Memory::GetPointer(srcBasePtr + ((y + srcY) * srcStride + srcX) * bpp);
|
||||
|
@ -617,7 +586,6 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff)
|
|||
memcpy(dst, src, width * bpp);
|
||||
}
|
||||
|
||||
DEBUG_LOG(G3D, "DL Texture Transfer Start: PixFormat %i", data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue