From 0a217a12541fb3d7ed1e0b0fbfc92a2355a46053 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 24 Aug 2013 10:41:45 -0700 Subject: [PATCH] Use accessors better for block transfers. --- GPU/GLES/GLES_GPU.cpp | 22 +++++++------- GPU/GPUState.h | 13 ++++++++ GPU/GeDisasm.cpp | 20 +++++++----- GPU/Null/NullGpu.cpp | 8 ++--- GPU/Software/SoftGpu.cpp | 66 +++++++++++----------------------------- 5 files changed, 58 insertions(+), 71 deletions(-) diff --git a/GPU/GLES/GLES_GPU.cpp b/GPU/GLES/GLES_GPU.cpp index b685d410fb..82cd951b2d 100644 --- a/GPU/GLES/GLES_GPU.cpp +++ b/GPU/GLES/GLES_GPU.cpp @@ -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); diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 4d5cee44d1..377f0638e4 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -356,6 +356,19 @@ struct GPUgstate GEPatchPrimType getPatchPrimitiveType() const { return static_cast(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 }; diff --git a/GPU/GeDisasm.cpp b/GPU/GeDisasm.cpp index e7e34f7864..8c4b92aeeb 100644 --- a/GPU/GeDisasm.cpp +++ b/GPU/GeDisasm.cpp @@ -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: diff --git a/GPU/Null/NullGpu.cpp b/GPU/Null/NullGpu.cpp index 3543ad37b1..14761a89ea 100644 --- a/GPU/Null/NullGpu.cpp +++ b/GPU/Null/NullGpu.cpp @@ -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; } diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index a3ff3945d5..972066b455 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -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; }