mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Return 24-bit floats in sceGeGetMtx().
This commit is contained in:
parent
ecd5869b88
commit
7ca64374ea
2 changed files with 50 additions and 31 deletions
|
@ -508,8 +508,13 @@ u32 sceGeRestoreContext(u32 ctxAddr)
|
||||||
return 0;
|
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)) {
|
if (!Memory::IsValidAddress(matrixPtr)) {
|
||||||
ERROR_LOG(SCEGE, "sceGeGetMtx(%d, %08x) - bad matrix ptr", type, matrixPtr);
|
ERROR_LOG(SCEGE, "sceGeGetMtx(%d, %08x) - bad matrix ptr", type, matrixPtr);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -527,20 +532,20 @@ int sceGeGetMtx(int type, u32 matrixPtr)
|
||||||
case GE_MTX_BONE7:
|
case GE_MTX_BONE7:
|
||||||
{
|
{
|
||||||
int n = type - GE_MTX_BONE0;
|
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;
|
break;
|
||||||
case GE_MTX_TEXGEN:
|
case GE_MTX_TEXGEN:
|
||||||
Memory::Memcpy(matrixPtr, gstate.tgenMatrix, 12 * sizeof(float));
|
__GeCopyMatrix(matrixPtr, gstate.tgenMatrix, 12 * sizeof(float));
|
||||||
break;
|
break;
|
||||||
case GE_MTX_WORLD:
|
case GE_MTX_WORLD:
|
||||||
Memory::Memcpy(matrixPtr, gstate.worldMatrix, 12 * sizeof(float));
|
__GeCopyMatrix(matrixPtr, gstate.worldMatrix, 12 * sizeof(float));
|
||||||
break;
|
break;
|
||||||
case GE_MTX_VIEW:
|
case GE_MTX_VIEW:
|
||||||
Memory::Memcpy(matrixPtr, gstate.viewMatrix, 12 * sizeof(float));
|
__GeCopyMatrix(matrixPtr, gstate.viewMatrix, 12 * sizeof(float));
|
||||||
break;
|
break;
|
||||||
case GE_MTX_PROJECTION:
|
case GE_MTX_PROJECTION:
|
||||||
Memory::Memcpy(matrixPtr, gstate.projMatrix, 16 * sizeof(float));
|
__GeCopyMatrix(matrixPtr, gstate.projMatrix, 16 * sizeof(float));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SCE_KERNEL_ERROR_INVALID_INDEX;
|
return SCE_KERNEL_ERROR_INVALID_INDEX;
|
||||||
|
@ -548,8 +553,7 @@ int sceGeGetMtx(int type, u32 matrixPtr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 sceGeGetCmd(int cmd)
|
u32 sceGeGetCmd(int cmd) {
|
||||||
{
|
|
||||||
INFO_LOG(SCEGE, "sceGeGetCmd(%i)", cmd);
|
INFO_LOG(SCEGE, "sceGeGetCmd(%i)", cmd);
|
||||||
if (cmd >= 0 && cmd < ARRAY_SIZE(gstate.cmdmem)) {
|
if (cmd >= 0 && cmd < ARRAY_SIZE(gstate.cmdmem)) {
|
||||||
return gstate.cmdmem[cmd]; // Does not mask away the high bits.
|
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);
|
WARN_LOG_REPORT(SCEGE, "sceGeGetStack(%i, %08x)", index, stackPtr);
|
||||||
return gpu->GetStack(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 outsideRange = new_size != 0 && (new_size < 0x200 || new_size > 0x1000);
|
||||||
bool notPowerOfTwo = (new_size & (new_size - 1)) != 0;
|
bool notPowerOfTwo = (new_size & (new_size - 1)) != 0;
|
||||||
if (outsideRange || notPowerOfTwo)
|
if (outsideRange || notPowerOfTwo) {
|
||||||
{
|
|
||||||
WARN_LOG(SCEGE, "sceGeEdramSetAddrTranslation(%i): invalid value", new_size);
|
WARN_LOG(SCEGE, "sceGeEdramSetAddrTranslation(%i): invalid value", new_size);
|
||||||
return SCE_KERNEL_ERROR_INVALID_VALUE;
|
return SCE_KERNEL_ERROR_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -589,53 +589,71 @@ void NullGPU::ExecuteOp(u32 op, u32 diff)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GE_CMD_WORLDMATRIXNUMBER:
|
case GE_CMD_WORLDMATRIXNUMBER:
|
||||||
DEBUG_LOG(G3D,"DL World matrix # %i", data);
|
|
||||||
gstate.worldmtxnum = data&0xF;
|
gstate.worldmtxnum = data&0xF;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GE_CMD_WORLDMATRIXDATA:
|
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;
|
break;
|
||||||
|
|
||||||
case GE_CMD_VIEWMATRIXNUMBER:
|
case GE_CMD_VIEWMATRIXNUMBER:
|
||||||
DEBUG_LOG(G3D,"DL VIEW matrix # %i", data);
|
|
||||||
gstate.viewmtxnum = data&0xF;
|
gstate.viewmtxnum = data&0xF;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GE_CMD_VIEWMATRIXDATA:
|
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;
|
break;
|
||||||
|
|
||||||
case GE_CMD_PROJMATRIXNUMBER:
|
case GE_CMD_PROJMATRIXNUMBER:
|
||||||
DEBUG_LOG(G3D,"DL PROJECTION matrix # %i", data);
|
|
||||||
gstate.projmtxnum = data&0xF;
|
gstate.projmtxnum = data&0xF;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GE_CMD_PROJMATRIXDATA:
|
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;
|
break;
|
||||||
|
|
||||||
case GE_CMD_TGENMATRIXNUMBER:
|
case GE_CMD_TGENMATRIXNUMBER:
|
||||||
DEBUG_LOG(G3D,"DL TGEN matrix # %i", data);
|
|
||||||
gstate.texmtxnum = data&0xF;
|
gstate.texmtxnum = data&0xF;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GE_CMD_TGENMATRIXDATA:
|
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;
|
break;
|
||||||
|
|
||||||
case GE_CMD_BONEMATRIXNUMBER:
|
case GE_CMD_BONEMATRIXNUMBER:
|
||||||
DEBUG_LOG(G3D,"DL BONE matrix #%i", data);
|
gstate.boneMatrixNumber = data & 0x7F;
|
||||||
gstate.boneMatrixNumber = data;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GE_CMD_BONEMATRIXDATA:
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Reference in a new issue