From 7ca64374ea8af1cb5b473d290075b736023bb74c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 21 Sep 2013 10:32:09 -0700 Subject: [PATCH] Return 24-bit floats in sceGeGetMtx(). --- Core/HLE/sceGe.cpp | 31 ++++++++++++++------------- GPU/Null/NullGpu.cpp | 50 ++++++++++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 31 deletions(-) diff --git a/Core/HLE/sceGe.cpp b/Core/HLE/sceGe.cpp index 68750bda17..b7386eba6a 100644 --- a/Core/HLE/sceGe.cpp +++ b/Core/HLE/sceGe.cpp @@ -508,8 +508,13 @@ u32 sceGeRestoreContext(u32 ctxAddr) return 0; } -int sceGeGetMtx(int type, u32 matrixPtr) -{ +void __GeCopyMatrix(u32 matrixPtr, float *mtx, u32 size) { + for (u32 i = 0; i < size / sizeof(float); ++i) { + Memory::Write_U32(toFloat24(mtx[i]), matrixPtr + i * sizeof(float)); + } +} + +int sceGeGetMtx(int type, u32 matrixPtr) { if (!Memory::IsValidAddress(matrixPtr)) { ERROR_LOG(SCEGE, "sceGeGetMtx(%d, %08x) - bad matrix ptr", type, matrixPtr); return -1; @@ -527,20 +532,20 @@ int sceGeGetMtx(int type, u32 matrixPtr) case GE_MTX_BONE7: { int n = type - GE_MTX_BONE0; - Memory::Memcpy(matrixPtr, gstate.boneMatrix + n * 12, 12 * sizeof(float)); + __GeCopyMatrix(matrixPtr, gstate.boneMatrix + n * 12, 12 * sizeof(float)); } break; case GE_MTX_TEXGEN: - Memory::Memcpy(matrixPtr, gstate.tgenMatrix, 12 * sizeof(float)); + __GeCopyMatrix(matrixPtr, gstate.tgenMatrix, 12 * sizeof(float)); break; case GE_MTX_WORLD: - Memory::Memcpy(matrixPtr, gstate.worldMatrix, 12 * sizeof(float)); + __GeCopyMatrix(matrixPtr, gstate.worldMatrix, 12 * sizeof(float)); break; case GE_MTX_VIEW: - Memory::Memcpy(matrixPtr, gstate.viewMatrix, 12 * sizeof(float)); + __GeCopyMatrix(matrixPtr, gstate.viewMatrix, 12 * sizeof(float)); break; case GE_MTX_PROJECTION: - Memory::Memcpy(matrixPtr, gstate.projMatrix, 16 * sizeof(float)); + __GeCopyMatrix(matrixPtr, gstate.projMatrix, 16 * sizeof(float)); break; default: return SCE_KERNEL_ERROR_INVALID_INDEX; @@ -548,8 +553,7 @@ int sceGeGetMtx(int type, u32 matrixPtr) return 0; } -u32 sceGeGetCmd(int cmd) -{ +u32 sceGeGetCmd(int cmd) { INFO_LOG(SCEGE, "sceGeGetCmd(%i)", cmd); if (cmd >= 0 && cmd < ARRAY_SIZE(gstate.cmdmem)) { return gstate.cmdmem[cmd]; // Does not mask away the high bits. @@ -558,18 +562,15 @@ u32 sceGeGetCmd(int cmd) } } -int sceGeGetStack(int index, u32 stackPtr) -{ +int sceGeGetStack(int index, u32 stackPtr) { WARN_LOG_REPORT(SCEGE, "sceGeGetStack(%i, %08x)", index, stackPtr); return gpu->GetStack(index, stackPtr); } -u32 sceGeEdramSetAddrTranslation(int new_size) -{ +u32 sceGeEdramSetAddrTranslation(int new_size) { bool outsideRange = new_size != 0 && (new_size < 0x200 || new_size > 0x1000); bool notPowerOfTwo = (new_size & (new_size - 1)) != 0; - if (outsideRange || notPowerOfTwo) - { + if (outsideRange || notPowerOfTwo) { WARN_LOG(SCEGE, "sceGeEdramSetAddrTranslation(%i): invalid value", new_size); return SCE_KERNEL_ERROR_INVALID_VALUE; } diff --git a/GPU/Null/NullGpu.cpp b/GPU/Null/NullGpu.cpp index 46d246b0ea..bd8455b827 100644 --- a/GPU/Null/NullGpu.cpp +++ b/GPU/Null/NullGpu.cpp @@ -589,53 +589,71 @@ void NullGPU::ExecuteOp(u32 op, u32 diff) break; case GE_CMD_WORLDMATRIXNUMBER: - DEBUG_LOG(G3D,"DL World matrix # %i", data); gstate.worldmtxnum = data&0xF; break; case GE_CMD_WORLDMATRIXDATA: - DEBUG_LOG(G3D,"DL World matrix data # %f", getFloat24(data)); - gstate.worldMatrix[gstate.worldmtxnum++] = getFloat24(data); + { + int num = gstate.worldmtxnum & 0xF; + if (num < 12) { + gstate.worldMatrix[num] = getFloat24(data); + } + gstate.worldmtxnum = (++num) & 0xF; + } break; case GE_CMD_VIEWMATRIXNUMBER: - DEBUG_LOG(G3D,"DL VIEW matrix # %i", data); gstate.viewmtxnum = data&0xF; break; case GE_CMD_VIEWMATRIXDATA: - DEBUG_LOG(G3D,"DL VIEW matrix data # %f", getFloat24(data)); - gstate.viewMatrix[gstate.viewmtxnum++] = getFloat24(data); + { + int num = gstate.viewmtxnum & 0xF; + if (num < 12) { + gstate.viewMatrix[num] = getFloat24(data); + } + gstate.viewmtxnum = (++num) & 0xF; + } break; case GE_CMD_PROJMATRIXNUMBER: - DEBUG_LOG(G3D,"DL PROJECTION matrix # %i", data); gstate.projmtxnum = data&0xF; break; case GE_CMD_PROJMATRIXDATA: - DEBUG_LOG(G3D,"DL PROJECTION matrix data # %f", getFloat24(data)); - gstate.projMatrix[gstate.projmtxnum++] = getFloat24(data); + { + int num = gstate.projmtxnum & 0xF; + gstate.projMatrix[num] = getFloat24(data); + gstate.projmtxnum = (++num) & 0xF; + } break; case GE_CMD_TGENMATRIXNUMBER: - DEBUG_LOG(G3D,"DL TGEN matrix # %i", data); gstate.texmtxnum = data&0xF; break; case GE_CMD_TGENMATRIXDATA: - DEBUG_LOG(G3D,"DL TGEN matrix data # %f", getFloat24(data)); - gstate.tgenMatrix[gstate.texmtxnum++] = getFloat24(data); + { + int num = gstate.texmtxnum & 0xF; + if (num < 12) { + gstate.tgenMatrix[num] = getFloat24(data); + } + gstate.texmtxnum = (++num) & 0xF; + } break; case GE_CMD_BONEMATRIXNUMBER: - DEBUG_LOG(G3D,"DL BONE matrix #%i", data); - gstate.boneMatrixNumber = data; + gstate.boneMatrixNumber = data & 0x7F; break; case GE_CMD_BONEMATRIXDATA: - DEBUG_LOG(G3D,"DL BONE matrix data #%i %f", gstate.boneMatrixNumber, getFloat24(data)); - gstate.boneMatrix[gstate.boneMatrixNumber++] = getFloat24(data); + { + int num = gstate.boneMatrixNumber & 0x7F; + if (num < 96) { + gstate.boneMatrix[num] = getFloat24(data); + } + gstate.boneMatrixNumber = (++num) & 0x7F; + } break; default: