fix a serious bug which crippled 3d engine loading from savestates. this should be ported to release branch. also add some missing dma state to savestate.
This commit is contained in:
parent
09229a159e
commit
2578a0a291
|
@ -99,7 +99,13 @@ static float normalTable[1024];
|
||||||
#define fix10_2float(v) (((float)((s32)(v))) / (float)(1<<9))
|
#define fix10_2float(v) (((float)((s32)(v))) / (float)(1<<9))
|
||||||
|
|
||||||
// Matrix stack handling
|
// Matrix stack handling
|
||||||
static CACHE_ALIGN MatrixStack mtxStack[4];
|
static CACHE_ALIGN MatrixStack mtxStack[4] = {
|
||||||
|
MatrixStack(1), // Projection stack
|
||||||
|
MatrixStack(31), // Coordinate stack
|
||||||
|
MatrixStack(31), // Directional stack
|
||||||
|
MatrixStack(1), // Texture stack
|
||||||
|
};
|
||||||
|
|
||||||
static CACHE_ALIGN float mtxCurrent [4][16];
|
static CACHE_ALIGN float mtxCurrent [4][16];
|
||||||
static CACHE_ALIGN float mtxTemporal[16];
|
static CACHE_ALIGN float mtxTemporal[16];
|
||||||
static u32 mode = 0;
|
static u32 mode = 0;
|
||||||
|
@ -252,11 +258,6 @@ void gfx3d_reset()
|
||||||
listTwiddle = 1;
|
listTwiddle = 1;
|
||||||
twiddleLists();
|
twiddleLists();
|
||||||
|
|
||||||
MatrixStackSetMaxSize(&mtxStack[0], 1); // Projection stack
|
|
||||||
MatrixStackSetMaxSize(&mtxStack[1], 31); // Coordinate stack
|
|
||||||
MatrixStackSetMaxSize(&mtxStack[2], 31); // Directional stack
|
|
||||||
MatrixStackSetMaxSize(&mtxStack[3], 1); // Texture stack
|
|
||||||
|
|
||||||
MatrixInit (mtxCurrent[0]);
|
MatrixInit (mtxCurrent[0]);
|
||||||
MatrixInit (mtxCurrent[1]);
|
MatrixInit (mtxCurrent[1]);
|
||||||
MatrixInit (mtxCurrent[2]);
|
MatrixInit (mtxCurrent[2]);
|
||||||
|
@ -910,6 +911,9 @@ void gfx3d_glNormal(unsigned long v)
|
||||||
normalTable[(v>>10)&1023],
|
normalTable[(v>>10)&1023],
|
||||||
normalTable[(v>>20)&1023]};
|
normalTable[(v>>20)&1023]};
|
||||||
|
|
||||||
|
//use the current normal transform matrix
|
||||||
|
MatrixMultVec3x3 (mtxCurrent[2], normal);
|
||||||
|
|
||||||
if (texCoordinateTransform == 2)
|
if (texCoordinateTransform == 2)
|
||||||
{
|
{
|
||||||
last_s =( (normal[0] *mtxCurrent[3][0] + normal[1] *mtxCurrent[3][4] +
|
last_s =( (normal[0] *mtxCurrent[3][0] + normal[1] *mtxCurrent[3][4] +
|
||||||
|
@ -918,8 +922,6 @@ void gfx3d_glNormal(unsigned long v)
|
||||||
normal[2] *mtxCurrent[3][9]) + _t);
|
normal[2] *mtxCurrent[3][9]) + _t);
|
||||||
}
|
}
|
||||||
|
|
||||||
//use the current normal transform matrix
|
|
||||||
MatrixMultVec3x3 (mtxCurrent[2], normal);
|
|
||||||
|
|
||||||
//apply lighting model
|
//apply lighting model
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
|
|
||||||
void MatrixInit (float *matrix)
|
void MatrixInit (float *matrix)
|
||||||
{
|
{
|
||||||
memset (matrix, 0, sizeof(float)*16);
|
memset (matrix, 0, sizeof(float)*16);
|
||||||
|
@ -161,13 +162,6 @@ int MATRIXFASTCALL MatrixCompare (const float* matrixDST, const float* matrixSRC
|
||||||
return memcmp((void*)matrixDST, matrixSRC, sizeof(float)*16);
|
return memcmp((void*)matrixDST, matrixSRC, sizeof(float)*16);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MatrixStackInit (MatrixStack *stack)
|
|
||||||
{
|
|
||||||
stack->matrix = NULL;
|
|
||||||
stack->position = 0;
|
|
||||||
stack->size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MatrixStackSetMaxSize (MatrixStack *stack, int size)
|
void MatrixStackSetMaxSize (MatrixStack *stack, int size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -188,6 +182,11 @@ void MatrixStackSetMaxSize (MatrixStack *stack, int size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MatrixStack::MatrixStack(int size)
|
||||||
|
{
|
||||||
|
MatrixStackSetMaxSize(this,size);
|
||||||
|
}
|
||||||
|
|
||||||
void MatrixStackSetStackPosition (MatrixStack *stack, int pos)
|
void MatrixStackSetStackPosition (MatrixStack *stack, int pos)
|
||||||
{
|
{
|
||||||
stack->position += pos;
|
stack->position += pos;
|
||||||
|
|
|
@ -25,12 +25,13 @@
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
typedef struct MatrixStack
|
struct MatrixStack
|
||||||
{
|
{
|
||||||
|
MatrixStack(int size);
|
||||||
float *matrix;
|
float *matrix;
|
||||||
int position;
|
int position;
|
||||||
int size;
|
int size;
|
||||||
} MatrixStack;
|
};
|
||||||
|
|
||||||
void MatrixInit (float *matrix);
|
void MatrixInit (float *matrix);
|
||||||
|
|
||||||
|
|
|
@ -163,6 +163,9 @@ SFORMAT SF_NDS[]={
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern u32 DMASrc[2][4];
|
||||||
|
extern u32 DMADst[2][4];
|
||||||
|
|
||||||
SFORMAT SF_MMU[]={
|
SFORMAT SF_MMU[]={
|
||||||
{ "M7BI", 1, 0x4000, MMU.ARM7_BIOS},
|
{ "M7BI", 1, 0x4000, MMU.ARM7_BIOS},
|
||||||
{ "M7ER", 1, 0x10000, MMU.ARM7_ERAM},
|
{ "M7ER", 1, 0x10000, MMU.ARM7_ERAM},
|
||||||
|
@ -184,10 +187,13 @@ SFORMAT SF_MMU[]={
|
||||||
{ "MIME", 4, 2, MMU.reg_IME},
|
{ "MIME", 4, 2, MMU.reg_IME},
|
||||||
{ "MIE_", 4, 2, MMU.reg_IE},
|
{ "MIE_", 4, 2, MMU.reg_IE},
|
||||||
{ "MIF_", 4, 2, MMU.reg_IF},
|
{ "MIF_", 4, 2, MMU.reg_IF},
|
||||||
|
|
||||||
{ "MDST", 4, 8, MMU.DMAStartTime},
|
{ "MDST", 4, 8, MMU.DMAStartTime},
|
||||||
{ "MDCY", 4, 8, MMU.DMACycle},
|
{ "MDCY", 4, 8, MMU.DMACycle},
|
||||||
{ "MDCR", 4, 8, MMU.DMACrt},
|
{ "MDCR", 4, 8, MMU.DMACrt},
|
||||||
{ "MDMA", 4, 8, MMU.DMAing},
|
{ "MDMA", 4, 8, MMU.DMAing},
|
||||||
|
{ "MDSR", 4, 8, DMASrc},
|
||||||
|
{ "MDDS", 4, 8, DMADst},
|
||||||
|
|
||||||
{ "MDV1", 4, 1, &MMU.divRunning},
|
{ "MDV1", 4, 1, &MMU.divRunning},
|
||||||
{ "MDV2", 8, 1, &MMU.divResult},
|
{ "MDV2", 8, 1, &MMU.divResult},
|
||||||
|
|
Loading…
Reference in New Issue