From 8ddbc0a9abf88fca3f2e3e57f1cd79ea121c81a3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 14 Sep 2013 14:07:53 -0700 Subject: [PATCH] Don't allow boneMatrixNumber to go outside bounds. Just from the GLES code. Fixes the Monster Hunter 3rd demo crash, but not sure why it's trying to use crazy numbers in the first place... --- GPU/Software/SoftGpu.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index cd0bdf6e9d..d6314fe60b 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -857,18 +857,30 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) break; case GE_CMD_TGENMATRIXDATA: - DEBUG_LOG(G3D,"DL TGEN matrix data # %f", getFloat24(data)); - gstate.tgenMatrix[gstate.texmtxnum++] = getFloat24(data); + { + DEBUG_LOG(G3D,"DL TGEN matrix data # %f", 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); + { + DEBUG_LOG(G3D,"DL BONE matrix data #%i %f", gstate.boneMatrixNumber, getFloat24(data)); + int num = gstate.boneMatrixNumber & 0x7F; + if (num < 96) { + gstate.boneMatrix[num] = getFloat24(data); + } + gstate.boneMatrixNumber = (++num) & 0x7F; + } break; default: