mirror of
https://github.com/libretro/ppsspp.git
synced 2025-02-25 19:30:53 +00:00
Return 24-bit floats in sceGeGetMtx().
This commit is contained in:
parent
ecd5869b88
commit
7ca64374ea
@ -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;
|
||||
}
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user