Merge pull request #9136 from LunaMoo/ProjectionMatrixData

Limit Projection Matrix Data count to <= 16
This commit is contained in:
Henrik Rydgård authored and GitHub committed 2017-01-28 17:04:12 +01:00
commit 14d2bf5989
2 files changed
+9 -7

No files matched your search

+5 -4
View File
@@ -1332,7 +1332,7 @@ void GPUCommon::Execute_ProjMtxNum(u32 op, u32 diff) {
}
const int count = i;
gstate.projmtxnum = (GE_CMD_PROJMATRIXNUMBER << 24) | ((op + count) & 0xF);
gstate.projmtxnum = (GE_CMD_PROJMATRIXNUMBER << 24) | ((op + count) & 0x1F);
// Skip over the loaded data, it's done now.
UpdatePC(currentList->pc, currentList->pc + count * 4);
@@ -1341,15 +1341,16 @@ void GPUCommon::Execute_ProjMtxNum(u32 op, u32 diff) {
void GPUCommon::Execute_ProjMtxData(u32 op, u32 diff) {
// Note: it's uncommon to get here now, see above.
int num = gstate.projmtxnum & 0xF;
int num = gstate.projmtxnum & 0x1F; // NOTE: Changed from 0xF to catch overflows
u32 newVal = op << 8;
if (newVal != ((const u32 *)gstate.projMatrix)[num]) {
if (num < 0x10 && newVal != ((const u32 *)gstate.projMatrix)[num]) {
Flush();
((u32 *)gstate.projMatrix)[num] = newVal;
gstate_c.Dirty(DIRTY_PROJMATRIX);
}
num++;
gstate.projmtxnum = (GE_CMD_PROJMATRIXNUMBER << 24) | (num & 0xF);
if (num <= 16)
gstate.projmtxnum = (GE_CMD_PROJMATRIXNUMBER << 24) | (num & 0xF);
}
void GPUCommon::Execute_TgenMtxNum(u32 op, u32 diff) {
+4 -3
View File
@@ -720,14 +720,15 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) {
break;
case GE_CMD_PROJMATRIXNUMBER:
gstate.projmtxnum = data & 0xF;
gstate.projmtxnum = data & 0x1F;
break;
case GE_CMD_PROJMATRIXDATA:
{
int num = gstate.projmtxnum & 0xF;
int num = gstate.projmtxnum & 0x1F; // NOTE: Changed from 0xF to catch overflows
gstate.projMatrix[num] = getFloat24(data);
gstate.projmtxnum = (++num) & 0xF;
if (num <= 16)
gstate.projmtxnum = (++num) & 0x1F;
}
break;