(gles2n64) Code formatting cleanups

This commit is contained in:
twinaphex committed 2014-02-01 20:56:07 +01:00
1 parent 984d686085
commit f8437d35f1
40 files changed
+5506 -5621

No files matched your search

+30 -30
View File
@@ -30,46 +30,46 @@ static void MultMatrix_default( float m0[4][4], float m1[4][4],
static void TransformVectorNormalize_default(float vec[3], float mtx[4][4])
{
float len;
float len;
vec[0] = mtx[0][0] * vec[0]
+ mtx[1][0] * vec[1]
+ mtx[2][0] * vec[2];
vec[1] = mtx[0][1] * vec[0]
+ mtx[1][1] * vec[1]
+ mtx[2][1] * vec[2];
vec[2] = mtx[0][2] * vec[0]
+ mtx[1][2] * vec[1]
+ mtx[2][2] * vec[2];
len = vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2];
if (len != 0.0)
{
len = sqrtf(len);
vec[0] /= len;
vec[1] /= len;
vec[2] /= len;
}
vec[0] = mtx[0][0] * vec[0]
+ mtx[1][0] * vec[1]
+ mtx[2][0] * vec[2];
vec[1] = mtx[0][1] * vec[0]
+ mtx[1][1] * vec[1]
+ mtx[2][1] * vec[2];
vec[2] = mtx[0][2] * vec[0]
+ mtx[1][2] * vec[1]
+ mtx[2][2] * vec[2];
len = vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2];
if (len != 0.0)
{
len = sqrtf(len);
vec[0] /= len;
vec[1] /= len;
vec[2] /= len;
}
}
static void Normalize_default(float v[3])
{
float len;
float len;
len = (float)(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
if (len != 0.0)
{
len = (float)sqrt( len );
v[0] /= (float)len;
v[1] /= (float)len;
v[2] /= (float)len;
}
len = (float)(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
if (len != 0.0)
{
len = (float)sqrt( len );
v[0] /= (float)len;
v[1] /= (float)len;
v[2] /= (float)len;
}
}
static float DotProduct_default( float v0[3], float v1[3] )
{
float dot;
dot = v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2];
return dot;
float dot;
dot = v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2];
return dot;
}
+101 -101
View File
@@ -2,132 +2,132 @@
static void MultMatrix_neon( float m0[4][4], float m1[4][4], float dest[4][4])
{
__asm(
"vld1.32 {d0, d1}, [%1]! \n\t" //q0 = m1
"vld1.32 {d2, d3}, [%1]! \n\t" //q1 = m1+4
"vld1.32 {d4, d5}, [%1]! \n\t" //q2 = m1+8
"vld1.32 {d6, d7}, [%1] \n\t" //q3 = m1+12
"vld1.32 {d16, d17}, [%0]! \n\t" //q8 = m0
"vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m0+4
"vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m0+8
"vld1.32 {d22, d23}, [%0] \n\t" //q11 = m0+12
__asm(
"vld1.32 {d0, d1}, [%1]! \n\t" //q0 = m1
"vld1.32 {d2, d3}, [%1]! \n\t" //q1 = m1+4
"vld1.32 {d4, d5}, [%1]! \n\t" //q2 = m1+8
"vld1.32 {d6, d7}, [%1] \n\t" //q3 = m1+12
"vld1.32 {d16, d17}, [%0]! \n\t" //q8 = m0
"vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m0+4
"vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m0+8
"vld1.32 {d22, d23}, [%0] \n\t" //q11 = m0+12
"vmul.f32 q12, q8, d0[0] \n\t" //q12 = q8 * d0[0]
"vmul.f32 q13, q8, d2[0] \n\t" //q13 = q8 * d2[0]
"vmul.f32 q14, q8, d4[0] \n\t" //q14 = q8 * d4[0]
"vmul.f32 q15, q8, d6[0] \n\t" //q15 = q8 * d6[0]
"vmla.f32 q12, q9, d0[1] \n\t" //q12 = q9 * d0[1]
"vmla.f32 q13, q9, d2[1] \n\t" //q13 = q9 * d2[1]
"vmla.f32 q14, q9, d4[1] \n\t" //q14 = q9 * d4[1]
"vmla.f32 q15, q9, d6[1] \n\t" //q15 = q9 * d6[1]
"vmla.f32 q12, q10, d1[0] \n\t" //q12 = q10 * d0[0]
"vmla.f32 q13, q10, d3[0] \n\t" //q13 = q10 * d2[0]
"vmla.f32 q14, q10, d5[0] \n\t" //q14 = q10 * d4[0]
"vmla.f32 q15, q10, d7[0] \n\t" //q15 = q10 * d6[0]
"vmla.f32 q12, q11, d1[1] \n\t" //q12 = q11 * d0[1]
"vmla.f32 q13, q11, d3[1] \n\t" //q13 = q11 * d2[1]
"vmla.f32 q14, q11, d5[1] \n\t" //q14 = q11 * d4[1]
"vmla.f32 q15, q11, d7[1] \n\t" //q15 = q11 * d6[1]
"vmul.f32 q12, q8, d0[0] \n\t" //q12 = q8 * d0[0]
"vmul.f32 q13, q8, d2[0] \n\t" //q13 = q8 * d2[0]
"vmul.f32 q14, q8, d4[0] \n\t" //q14 = q8 * d4[0]
"vmul.f32 q15, q8, d6[0] \n\t" //q15 = q8 * d6[0]
"vmla.f32 q12, q9, d0[1] \n\t" //q12 = q9 * d0[1]
"vmla.f32 q13, q9, d2[1] \n\t" //q13 = q9 * d2[1]
"vmla.f32 q14, q9, d4[1] \n\t" //q14 = q9 * d4[1]
"vmla.f32 q15, q9, d6[1] \n\t" //q15 = q9 * d6[1]
"vmla.f32 q12, q10, d1[0] \n\t" //q12 = q10 * d0[0]
"vmla.f32 q13, q10, d3[0] \n\t" //q13 = q10 * d2[0]
"vmla.f32 q14, q10, d5[0] \n\t" //q14 = q10 * d4[0]
"vmla.f32 q15, q10, d7[0] \n\t" //q15 = q10 * d6[0]
"vmla.f32 q12, q11, d1[1] \n\t" //q12 = q11 * d0[1]
"vmla.f32 q13, q11, d3[1] \n\t" //q13 = q11 * d2[1]
"vmla.f32 q14, q11, d5[1] \n\t" //q14 = q11 * d4[1]
"vmla.f32 q15, q11, d7[1] \n\t" //q15 = q11 * d6[1]
"vst1.32 {d24, d25}, [%2]! \n\t" //d = q12
"vst1.32 {d26, d27}, [%2]! \n\t" //d+4 = q13
"vst1.32 {d28, d29}, [%2]! \n\t" //d+8 = q14
"vst1.32 {d30, d31}, [%2] \n\t" //d+12 = q15
"vst1.32 {d24, d25}, [%2]! \n\t" //d = q12
"vst1.32 {d26, d27}, [%2]! \n\t" //d+4 = q13
"vst1.32 {d28, d29}, [%2]! \n\t" //d+8 = q14
"vst1.32 {d30, d31}, [%2] \n\t" //d+12 = q15
:"+r"(m0), "+r"(m1), "+r"(dest):
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
"d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
"memory"
);
:"+r"(m0), "+r"(m1), "+r"(dest):
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
"d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
"memory"
);
}
static void TransformVectorNormalize_neon(float vec[3], float mtx[4][4])
{
__asm(
"vld1.32 {d0}, [%1] \n\t" //Q0 = v
"flds s2, [%1, #8] \n\t" //Q0 = v
"vld1.32 {d18, d19}, [%0]! \n\t" //Q1 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //Q2 = m+4
"vld1.32 {d22, d23}, [%0] \n\t" //Q3 = m+8
__asm(
"vld1.32 {d0}, [%1] \n\t" //Q0 = v
"flds s2, [%1, #8] \n\t" //Q0 = v
"vld1.32 {d18, d19}, [%0]! \n\t" //Q1 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //Q2 = m+4
"vld1.32 {d22, d23}, [%0] \n\t" //Q3 = m+8
"vmul.f32 q2, q9, d0[0] \n\t" //q2 = q9*Q0[0]
"vmla.f32 q2, q10, d0[1] \n\t" //Q5 += Q1*Q0[1]
"vmla.f32 q2, q11, d1[0] \n\t" //Q5 += Q2*Q0[2]
"vmul.f32 q2, q9, d0[0] \n\t" //q2 = q9*Q0[0]
"vmla.f32 q2, q10, d0[1] \n\t" //Q5 += Q1*Q0[1]
"vmla.f32 q2, q11, d1[0] \n\t" //Q5 += Q2*Q0[2]
"vmul.f32 d0, d4, d4 \n\t" //d0 = d0*d0
"vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1]
"vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d1*d1
"vmul.f32 d0, d4, d4 \n\t" //d0 = d0*d0
"vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1]
"vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d1*d1
"vmov.f32 d1, d0 \n\t" //d1 = d0
"vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0)
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4
"vmov.f32 d1, d0 \n\t" //d1 = d0
"vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0)
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4
"vmul.f32 q2, q2, d0[0] \n\t" //d0= d2*d4
"vmul.f32 q2, q2, d0[0] \n\t" //d0= d2*d4
"vst1.32 {d4}, [%1] \n\t" //Q4 = m+12
"fsts s10, [%1, #8] \n\t" //Q4 = m+12
: "+r"(mtx): "r"(vec)
: "d0","d1","d2","d3","d18","d19","d20","d21","d22", "d23", "memory"
);
"vst1.32 {d4}, [%1] \n\t" //Q4 = m+12
"fsts s10, [%1, #8] \n\t" //Q4 = m+12
: "+r"(mtx): "r"(vec)
: "d0","d1","d2","d3","d18","d19","d20","d21","d22", "d23", "memory"
);
}
static void Normalize_neon(float v[3])
{
__asm(
"vld1.32 {d4}, [%0]! \n\t" //d4={x,y}
"flds s10, [%0] \n\t" //d5[0] = z
"sub %0, %0, #8 \n\t" //d5[0] = z
"vmul.f32 d0, d4, d4 \n\t" //d0= d4*d4
"vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1]
"vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d5*d5
__asm(
"vld1.32 {d4}, [%0]! \n\t" //d4={x,y}
"flds s10, [%0] \n\t" //d5[0] = z
"sub %0, %0, #8 \n\t" //d5[0] = z
"vmul.f32 d0, d4, d4 \n\t" //d0= d4*d4
"vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1]
"vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d5*d5
"vmov.f32 d1, d0 \n\t" //d1 = d0
"vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0)
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4
"vmov.f32 d1, d0 \n\t" //d1 = d0
"vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0)
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4
"vmul.f32 q2, q2, d0[0] \n\t" //d0= d2*d4
"vst1.32 {d4}, [%0]! \n\t" //d2={x0,y0}, d3={z0, w0}
"fsts s10, [%0] \n\t" //d2={x0,y0}, d3={z0, w0}
"vmul.f32 q2, q2, d0[0] \n\t" //d0= d2*d4
"vst1.32 {d4}, [%0]! \n\t" //d2={x0,y0}, d3={z0, w0}
"fsts s10, [%0] \n\t" //d2={x0,y0}, d3={z0, w0}
:"+r"(v) :
: "d0", "d1", "d2", "d3", "d4", "d5", "memory"
);
:"+r"(v) :
: "d0", "d1", "d2", "d3", "d4", "d5", "memory"
);
}
static float DotProduct_neon( float v0[3], float v1[3] )
{
float dot;
__asm(
"vld1.32 {d8}, [%1]! \n\t" //d8={x0,y0}
"vld1.32 {d10}, [%2]! \n\t" //d10={x1,y1}
"flds s18, [%1, #0] \n\t" //d9[0]={z0}
"flds s22, [%2, #0] \n\t" //d11[0]={z1}
"vmul.f32 d12, d8, d10 \n\t" //d0= d2*d4
"vpadd.f32 d12, d12, d12 \n\t" //d0 = d[0] + d[1]
"vmla.f32 d12, d9, d11 \n\t" //d0 = d0 + d3*d5
"fmrs %0, s24 \n\t" //r0 = s0
: "=r"(dot), "+r"(v0), "+r"(v1):
: "d8", "d9", "d10", "d11", "d12"
float dot;
__asm(
"vld1.32 {d8}, [%1]! \n\t" //d8={x0,y0}
"vld1.32 {d10}, [%2]! \n\t" //d10={x1,y1}
"flds s18, [%1, #0] \n\t" //d9[0]={z0}
"flds s22, [%2, #0] \n\t" //d11[0]={z1}
"vmul.f32 d12, d8, d10 \n\t" //d0= d2*d4
"vpadd.f32 d12, d12, d12 \n\t" //d0 = d[0] + d[1]
"vmla.f32 d12, d9, d11 \n\t" //d0 = d0 + d3*d5
"fmrs %0, s24 \n\t" //r0 = s0
: "=r"(dot), "+r"(v0), "+r"(v1):
: "d8", "d9", "d10", "d11", "d12"
);
return dot;
);
return dot;
}
void MathInitNeon()
void MathInitNeon(void)
{
MultMatrix = MultMatrix_neon;
TransformVectorNormalize = TransformVectorNormalize_neon;
Normalize = Normalize_neon;
DotProduct = DotProduct_neon;
MultMatrix = MultMatrix_neon;
TransformVectorNormalize = TransformVectorNormalize_neon;
Normalize = Normalize_neon;
DotProduct = DotProduct_neon;
}
+51 -52
View File
@@ -13,85 +13,84 @@ unsigned int CRCTable[ 256 ];
u32 Reflect( u32 ref, char ch )
{
int i;
u32 value = 0;
u32 value = 0;
// Swap bit 0 for bit 7
// bit 1 for bit 6, etc.
for (i = 1; i < (ch + 1); i++)
{
if(ref & 1)
value |= 1 << (ch - i);
ref >>= 1;
}
return value;
// Swap bit 0 for bit 7
// bit 1 for bit 6, etc.
for (i = 1; i < (ch + 1); i++)
{
if(ref & 1)
value |= 1 << (ch - i);
ref >>= 1;
}
return value;
}
void CRC_BuildTable()
{
u32 crc;
int i, j;
u32 crc;
int i, j;
for (i = 0; i < 256; i++)
{
crc = Reflect( i, 8 ) << 24;
for (j = 0; j < 8; j++)
crc = (crc << 1) ^ (crc & (1 << 31) ? CRC32_POLYNOMIAL : 0);
for (i = 0; i < 256; i++)
{
crc = Reflect( i, 8 ) << 24;
for (j = 0; j < 8; j++)
crc = (crc << 1) ^ (crc & (1 << 31) ? CRC32_POLYNOMIAL : 0);
CRCTable[i] = Reflect( crc, 32 );
}
CRCTable[i] = Reflect( crc, 32 );
}
#ifdef __CRC_OPT
for (i = 0; i < 256; i++)
{
for(j = 0; j < 3; j++)
{
CRCTable[256*(j+1) + i] = (CRCTable[256*j + i]>>8) ^ CRCTable[CRCTable[256*j + i]&0xFF];
}
}
for (i = 0; i < 256; i++)
{
for(j = 0; j < 3; j++)
{
CRCTable[256*(j+1) + i] = (CRCTable[256*j + i]>>8) ^ CRCTable[CRCTable[256*j + i]&0xFF];
}
}
#endif
}
u32 CRC_Calculate( u32 crc, void *buffer, u32 count )
{
u8 *p;
u32 orig = crc;
u8 *p;
u32 orig = crc;
p = (u8*) buffer;
p = (u8*) buffer;
#ifdef __CRC_OPT
while(count > 3)
{
crc ^= *(unsigned int*) p; p += 4;
crc = CRCTable[3*256 + (crc&0xFF)]
^ CRCTable[2*256 + ((crc>>8)&0xFF)]
^ CRCTable[1*256 + ((crc>>16)&0xFF)]
^ CRCTable[0*256 + ((crc>>24))];
while(count > 3)
{
crc ^= *(unsigned int*) p; p += 4;
crc = CRCTable[3*256 + (crc&0xFF)]
^ CRCTable[2*256 + ((crc>>8)&0xFF)]
^ CRCTable[1*256 + ((crc>>16)&0xFF)]
^ CRCTable[0*256 + ((crc>>24))];
count -= 4;
}
count -= 4;
}
#endif
while (count--)
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
while (count--)
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
return crc ^ orig;
return crc ^ orig;
}
u32 CRC_CalculatePalette( u32 crc, void *buffer, u32 count )
{
u8 *p;
u32 orig = crc;
u8 *p;
u32 orig = crc;
p = (u8*) buffer;
while (count--)
{
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
p = (u8*) buffer;
while (count--)
{
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
p += 6;
}
p += 6;
}
return crc ^ orig;
return crc ^ orig;
}
+1 -1
View File
@@ -10,7 +10,7 @@ extern "C" {
#define CRCTable gln64CRCTable
#endif
void CRC_BuildTable();
void CRC_BuildTable(void);
u32 CRC_Calculate( u32 crc, void *buffer, u32 count );
u32 CRC_CalculatePalette( u32 crc, void *buffer, u32 count );
+192 -194
View File
@@ -49,53 +49,53 @@ typedef struct
Option configOptions[] =
{
{"#gles2n64 Graphics Plugin for N64", NULL, 0},
{"#by Orkin / glN64 developers and Adventus.", NULL, 0},
{"#gles2n64 Graphics Plugin for N64", NULL, 0},
{"#by Orkin / glN64 developers and Adventus.", NULL, 0},
{"config version", &config.version, 0},
{"", NULL, 0},
{"config version", &config.version, 0},
{"", NULL, 0},
{"#VI Settings:", NULL, 0},
{"video force", &config.video.force, 0},
{"video width", &config.video.width, 320},
{"video height", &config.video.height, 240},
{"", NULL, 0},
{"#VI Settings:", NULL, 0},
{"video force", &config.video.force, 0},
{"video width", &config.video.width, 320},
{"video height", &config.video.height, 240},
{"", NULL, 0},
{"#Render Settings:", NULL, 0},
{"enable fog", &config.enableFog, 0},
{"enable primitive z", &config.enablePrimZ, 1},
{"enable lighting", &config.enableLighting, 1},
{"enable alpha test", &config.enableAlphaTest, 1},
{"enable clipping", &config.enableClipping, 0},
{"enable face culling", &config.enableFaceCulling, 1},
{"enable noise", &config.enableNoise, 0},
{"", NULL, 0},
{"#Render Settings:", NULL, 0},
{"enable fog", &config.enableFog, 0},
{"enable primitive z", &config.enablePrimZ, 1},
{"enable lighting", &config.enableLighting, 1},
{"enable alpha test", &config.enableAlphaTest, 1},
{"enable clipping", &config.enableClipping, 0},
{"enable face culling", &config.enableFaceCulling, 1},
{"enable noise", &config.enableNoise, 0},
{"", NULL, 0},
{"#Texture Settings:", NULL, 0},
{"texture 2xSAI", &config.texture.sai2x, 0},
{"texture force bilinear", &config.texture.forceBilinear, 0},
{"texture max anisotropy", &config.texture.maxAnisotropy, 0},
{"texture use IA", &config.texture.useIA, 0},
{"texture fast CRC", &config.texture.fastCRC, 1},
{"texture pow2", &config.texture.pow2, 1},
{"", NULL, 0},
{"#Texture Settings:", NULL, 0},
{"texture 2xSAI", &config.texture.sai2x, 0},
{"texture force bilinear", &config.texture.forceBilinear, 0},
{"texture max anisotropy", &config.texture.maxAnisotropy, 0},
{"texture use IA", &config.texture.useIA, 0},
{"texture fast CRC", &config.texture.fastCRC, 1},
{"texture pow2", &config.texture.pow2, 1},
{"", NULL, 0},
{"#Other Settings:", NULL, 0},
{"update mode", &config.updateMode, SCREEN_UPDATE_AT_VI_UPDATE },
{"ignore offscreen rendering", &config.ignoreOffscreenRendering, 0},
{"force screen clear", &config.forceBufferClear, 0},
{"flip vertical", &config.screen.flipVertical, 0},
// paulscode: removed from pre-compile to a config option
//// (part of the Galaxy S Zelda crash-fix
{"tribuffer opt", &config.tribufferOpt, 1},
//
{"", NULL, 0},
{"#Other Settings:", NULL, 0},
{"update mode", &config.updateMode, SCREEN_UPDATE_AT_VI_UPDATE },
{"ignore offscreen rendering", &config.ignoreOffscreenRendering, 0},
{"force screen clear", &config.forceBufferClear, 0},
{"flip vertical", &config.screen.flipVertical, 0},
// paulscode: removed from pre-compile to a config option
//// (part of the Galaxy S Zelda crash-fix
{"tribuffer opt", &config.tribufferOpt, 1},
//
{"", NULL, 0},
{"#Hack Settings:", NULL, 0},
{"hack banjo tooie", &config.hackBanjoTooie, 0},
{"hack zelda", &config.hackZelda, 0},
{"hack alpha", &config.hackAlpha, 0},
{"hack z", &config.zHack, 0},
{"#Hack Settings:", NULL, 0},
{"hack banjo tooie", &config.hackBanjoTooie, 0},
{"hack zelda", &config.hackZelda, 0},
{"hack alpha", &config.hackAlpha, 0},
{"hack z", &config.zHack, 0},
};
@@ -104,140 +104,139 @@ const int configOptionsSize = sizeof(configOptions) / sizeof(Option);
void Config_WriteConfig(const char *filename)
{
int i;
config.version = CONFIG_VERSION;
FILE* f = fopen(filename, "w");
if (!f && log_cb)
log_cb(RETRO_LOG_ERROR, "Could Not Open %s for writing\n", filename);
config.version = CONFIG_VERSION;
FILE* f = fopen(filename, "w");
if (!f && log_cb)
log_cb(RETRO_LOG_ERROR, "Could Not Open %s for writing\n", filename);
for(i = 0; i < configOptionsSize; i++)
{
Option *o = &configOptions[i];
fprintf(f, "%s", o->name); // __LIBRETRO__: Fix warning
if (o->data) fprintf(f,"=%i", *(o->data));
fprintf(f, "\n");
}
for(i = 0; i < configOptionsSize; i++)
{
Option *o = &configOptions[i];
fprintf(f, "%s", o->name); // __LIBRETRO__: Fix warning
if (o->data) fprintf(f,"=%i", *(o->data));
fprintf(f, "\n");
}
fclose(f);
fclose(f);
}
void Config_SetDefault(void)
{
int i;
for(i = 0; i < configOptionsSize; i++)
{
Option *o = &configOptions[i];
if (o->data) *(o->data) = o->initial;
}
for(i = 0; i < configOptionsSize; i++)
{
Option *o = &configOptions[i];
if (o->data) *(o->data) = o->initial;
}
}
void Config_SetOption(char* line, char* val)
{
int i;
for(i = 0; i < configOptionsSize; i++)
{
Option *o = &configOptions[i];
if (strcasecmp(line, o->name) == 0)
{
if (o->data)
{
int v = atoi(val);
*(o->data) = v;
if (log_cb)
log_cb(RETRO_LOG_INFO, "Config Option: %s = %i\n", o->name, v);
}
break;
}
}
for(i = 0; i < configOptionsSize; i++)
{
Option *o = &configOptions[i];
if (strcasecmp(line, o->name) == 0)
{
if (o->data)
{
int v = atoi(val);
*(o->data) = v;
if (log_cb)
log_cb(RETRO_LOG_INFO, "Config Option: %s = %i\n", o->name, v);
}
break;
}
}
}
void Config_LoadRomConfig(unsigned char* header)
{
char line[4096];
int i;
char line[4096];
int i;
// get the name of the ROM
for (i = 0; i < 20; i++)
config.romName[i] = header[0x20+i];
config.romName[20] = '\0';
while (config.romName[strlen(config.romName)-1] == ' ')
{
config.romName[strlen(config.romName)-1] = '\0';
}
// get the name of the ROM
for (i = 0; i < 20; i++)
config.romName[i] = header[0x20+i];
config.romName[20] = '\0';
while (config.romName[strlen(config.romName)-1] == ' ')
{
config.romName[strlen(config.romName)-1] = '\0';
}
switch(header[0x3e])
{
// PAL codes
case 0x44:
case 0x46:
case 0x49:
case 0x50:
case 0x53:
case 0x55:
case 0x58:
case 0x59:
config.romPAL = true;
break;
switch(header[0x3e])
{
// PAL codes
case 0x44:
case 0x46:
case 0x49:
case 0x50:
case 0x53:
case 0x55:
case 0x58:
case 0x59:
config.romPAL = true;
break;
// NTSC codes
case 0x37:
case 0x41:
case 0x45:
case 0x4a:
config.romPAL = false;
break;
// NTSC codes
case 0x37:
case 0x41:
case 0x45:
case 0x4a:
config.romPAL = false;
break;
// Fallback for unknown codes
default:
config.romPAL = false;
}
// Fallback for unknown codes
default:
config.romPAL = false;
}
if (log_cb)
log_cb(RETRO_LOG_INFO, "Rom is %s\n", config.romPAL ? "PAL" : "NTSC");
if (log_cb)
log_cb(RETRO_LOG_INFO, "Rom is %s\n", config.romPAL ? "PAL" : "NTSC");
const char *filename = ConfigGetSharedDataFilepath("gles2n64rom.conf");
FILE *f = fopen(filename,"r");
if (!f)
{
if (log_cb)
log_cb(RETRO_LOG_INFO, "Could not find %s Rom settings file, using global.\n", filename);
return;
}
else
{
if (log_cb)
log_cb(RETRO_LOG_INFO, "[gles2N64]: Searching %s Database for \"%s\" ROM\n", filename, config.romName);
bool isRom = false;
while (!feof(f))
{
fgets(line, 4096, f);
if (line[0] == '\n') continue;
const char *filename = ConfigGetSharedDataFilepath("gles2n64rom.conf");
FILE *f = fopen(filename,"r");
if (!f)
{
if (log_cb)
log_cb(RETRO_LOG_INFO, "Could not find %s Rom settings file, using global.\n", filename);
return;
}
else
{
if (log_cb)
log_cb(RETRO_LOG_INFO, "[gles2N64]: Searching %s Database for \"%s\" ROM\n", filename, config.romName);
bool isRom = false;
while (!feof(f))
{
fgets(line, 4096, f);
if (line[0] == '\n') continue;
if (strncmp(line,"rom name=", 9) == 0)
if (strncmp(line,"rom name=", 9) == 0)
{
//Depending on the editor, end lines could be terminated by "LF" or "CRLF"
char* lf = strchr(line, '\n'); //Line Feed
char* cr = strchr(line, '\r'); //Carriage Return
if (lf) *lf='\0';
if (cr) *cr='\0';
isRom = (strcasecmp(config.romName, line+9) == 0);
}
else
{
if (isRom)
{
//Depending on the editor, end lines could be terminated by "LF" or "CRLF"
char* lf = strchr(line, '\n'); //Line Feed
char* cr = strchr(line, '\r'); //Carriage Return
if (lf) *lf='\0';
if (cr) *cr='\0';
isRom = (strcasecmp(config.romName, line+9) == 0);
char* val = strchr(line, '=');
if (!val) continue;
*val++ = '\0';
Config_SetOption(line,val);
if (log_cb)
log_cb(RETRO_LOG_INFO, "%s = %s", line, val);
}
else
{
if (isRom)
{
char* val = strchr(line, '=');
if (!val) continue;
*val++ = '\0';
Config_SetOption(line,val);
if (log_cb)
log_cb(RETRO_LOG_INFO, "%s = %s", line, val);
}
}
}
}
fclose(f);
}
}
}
fclose(f);
}
extern uint32_t screen_width;
@@ -245,59 +244,58 @@ extern uint32_t screen_height;
void Config_LoadConfig(void)
{
FILE *f;
char line[4096];
FILE *f;
char line[4096];
// default configuration
Config_SetDefault();
// default configuration
Config_SetDefault();
// __LIBRETRO__: Get screen size
config.screen.width = screen_width;
config.screen.height = screen_height;
// __LIBRETRO__: Get screen size
config.screen.width = screen_width;
config.screen.height = screen_height;
// read configuration
const char *filename = ConfigGetSharedDataFilepath("gles2n64.conf");
f = fopen(filename, "r");
if (!f)
{
if (log_cb)
{
log_cb(RETRO_LOG_WARN, "[gles2N64]: Couldn't open config file '%s' for reading: %s\n", filename, strerror( errno ) );
log_cb(RETRO_LOG_WARN, "[gles2N64]: Attempting to write new Config \n");
}
Config_WriteConfig(filename);
}
else
{
if (log_cb)
log_cb(RETRO_LOG_INFO, "[gles2n64]: Loading Config from %s \n", filename);
// read configuration
const char *filename = ConfigGetSharedDataFilepath("gles2n64.conf");
f = fopen(filename, "r");
if (!f)
{
if (log_cb)
{
log_cb(RETRO_LOG_WARN, "[gles2N64]: Couldn't open config file '%s' for reading: %s\n", filename, strerror( errno ) );
log_cb(RETRO_LOG_WARN, "[gles2N64]: Attempting to write new Config \n");
}
Config_WriteConfig(filename);
}
else
{
if (log_cb)
log_cb(RETRO_LOG_INFO, "[gles2n64]: Loading Config from %s \n", filename);
while (!feof( f ))
{
char *val;
fgets( line, 4096, f );
while (!feof( f ))
{
char *val;
fgets( line, 4096, f );
if (line[0] == '#' || line[0] == '\n')
continue;
if (line[0] == '#' || line[0] == '\n')
continue;
val = strchr( line, '=' );
if (!val) continue;
val = strchr( line, '=' );
if (!val) continue;
*val++ = '\0';
*val++ = '\0';
Config_SetOption(line,val);
}
Config_SetOption(line,val);
}
if (config.version < CONFIG_VERSION)
{
if (log_cb)
log_cb(RETRO_LOG_WARN, "[gles2N64]: Wrong config version, rewriting config with defaults\n");
Config_SetDefault();
Config_WriteConfig(filename);
}
if (config.version < CONFIG_VERSION)
{
if (log_cb)
log_cb(RETRO_LOG_WARN, "[gles2N64]: Wrong config version, rewriting config with defaults\n");
Config_SetDefault();
Config_WriteConfig(filename);
}
fclose(f);
}
fclose(f);
}
}
+78 -79
View File
@@ -4,61 +4,61 @@
DepthBufferInfo depthBuffer;
void DepthBuffer_Init()
void DepthBuffer_Init(void)
{
depthBuffer.current = NULL;
depthBuffer.top = NULL;
depthBuffer.bottom = NULL;
depthBuffer.numBuffers = 0;
depthBuffer.current = NULL;
depthBuffer.top = NULL;
depthBuffer.bottom = NULL;
depthBuffer.numBuffers = 0;
}
void DepthBuffer_RemoveBottom()
void DepthBuffer_RemoveBottom(void)
{
DepthBuffer *newBottom = depthBuffer.bottom->higher;
DepthBuffer *newBottom = depthBuffer.bottom->higher;
if (depthBuffer.bottom == depthBuffer.top)
depthBuffer.top = NULL;
if (depthBuffer.bottom == depthBuffer.top)
depthBuffer.top = NULL;
free( depthBuffer.bottom );
free( depthBuffer.bottom );
depthBuffer.bottom = newBottom;
depthBuffer.bottom = newBottom;
if (depthBuffer.bottom != NULL)
depthBuffer.bottom->lower = NULL;
if (depthBuffer.bottom != NULL)
depthBuffer.bottom->lower = NULL;
depthBuffer.numBuffers--;
depthBuffer.numBuffers--;
}
void DepthBuffer_Remove( DepthBuffer *buffer )
{
if ((buffer == depthBuffer.bottom) &&
(buffer == depthBuffer.top))
{
depthBuffer.top = NULL;
depthBuffer.bottom = NULL;
}
else if (buffer == depthBuffer.bottom)
{
depthBuffer.bottom = buffer->higher;
if ((buffer == depthBuffer.bottom) &&
(buffer == depthBuffer.top))
{
depthBuffer.top = NULL;
depthBuffer.bottom = NULL;
}
else if (buffer == depthBuffer.bottom)
{
depthBuffer.bottom = buffer->higher;
if (depthBuffer.bottom)
depthBuffer.bottom->lower = NULL;
}
else if (buffer == depthBuffer.top)
{
depthBuffer.top = buffer->lower;
if (depthBuffer.bottom)
depthBuffer.bottom->lower = NULL;
}
else if (buffer == depthBuffer.top)
{
depthBuffer.top = buffer->lower;
if (depthBuffer.top)
depthBuffer.top->higher = NULL;
}
else
{
buffer->higher->lower = buffer->lower;
buffer->lower->higher = buffer->higher;
}
if (depthBuffer.top)
depthBuffer.top->higher = NULL;
}
else
{
buffer->higher->lower = buffer->lower;
buffer->lower->higher = buffer->higher;
}
free( buffer );
depthBuffer.numBuffers--;
free( buffer );
depthBuffer.numBuffers--;
}
void DepthBuffer_RemoveBuffer( u32 address )
@@ -75,24 +75,24 @@ void DepthBuffer_RemoveBuffer( u32 address )
}
}
DepthBuffer *DepthBuffer_AddTop()
DepthBuffer *DepthBuffer_AddTop(void)
{
DepthBuffer *newtop = (DepthBuffer*)malloc( sizeof( DepthBuffer ) );
DepthBuffer *newtop = (DepthBuffer*)malloc( sizeof( DepthBuffer ) );
newtop->lower = depthBuffer.top;
newtop->higher = NULL;
newtop->lower = depthBuffer.top;
newtop->higher = NULL;
if (depthBuffer.top)
depthBuffer.top->higher = newtop;
if (depthBuffer.top)
depthBuffer.top->higher = newtop;
if (!depthBuffer.bottom)
depthBuffer.bottom = newtop;
if (!depthBuffer.bottom)
depthBuffer.bottom = newtop;
depthBuffer.top = newtop;
depthBuffer.top = newtop;
depthBuffer.numBuffers++;
depthBuffer.numBuffers++;
return newtop;
return newtop;
}
void DepthBuffer_MoveToTop( DepthBuffer *newtop )
@@ -117,49 +117,48 @@ void DepthBuffer_MoveToTop( DepthBuffer *newtop )
depthBuffer.top = newtop;
}
void DepthBuffer_Destroy()
void DepthBuffer_Destroy(void)
{
while (depthBuffer.bottom)
DepthBuffer_RemoveBottom();
while (depthBuffer.bottom)
DepthBuffer_RemoveBottom();
depthBuffer.top = NULL;
depthBuffer.top = NULL;
}
void DepthBuffer_SetBuffer( u32 address )
{
DepthBuffer *current = depthBuffer.top;
DepthBuffer *current = depthBuffer.top;
// Search through saved depth buffers
while (current != NULL)
{
if (current->address == address)
{
DepthBuffer_MoveToTop( current );
depthBuffer.current = current;
return;
}
current = current->lower;
}
// Search through saved depth buffers
while (current != NULL)
{
if (current->address == address)
{
DepthBuffer_MoveToTop( current );
depthBuffer.current = current;
return;
}
current = current->lower;
}
current = DepthBuffer_AddTop();
current = DepthBuffer_AddTop();
current->address = address;
current->cleared = TRUE;
current->address = address;
current->cleared = TRUE;
depthBuffer.current = current;
depthBuffer.current = current;
}
DepthBuffer *DepthBuffer_FindBuffer( u32 address )
{
DepthBuffer *current = depthBuffer.top;
DepthBuffer *current = depthBuffer.top;
while (current)
{
if (current->address == address)
return current;
current = current->lower;
}
while (current)
{
if (current->address == address)
return current;
current = current->lower;
}
return NULL;
return NULL;
}
+2 -2
View File
@@ -26,8 +26,8 @@ typedef struct
extern DepthBufferInfo depthBuffer;
void DepthBuffer_Init();
void DepthBuffer_Destroy();
void DepthBuffer_Init(void);
void DepthBuffer_Destroy(void);
void DepthBuffer_SetBuffer( u32 address );
void DepthBuffer_RemoveBuffer( u32 address );
DepthBuffer *DepthBuffer_FindBuffer( u32 address );
+233 -234
View File
@@ -14,79 +14,79 @@
void F3D_SPNoOp( u32 w0, u32 w1 )
{
gSPNoOp();
gSPNoOp();
}
void F3D_Mtx( u32 w0, u32 w1 )
{
if (_SHIFTR( w0, 0, 16 ) != 64)
{
// GBI_DetectUCode(); // Something's wrong
if (_SHIFTR( w0, 0, 16 ) != 64)
{
// GBI_DetectUCode(); // Something's wrong
#ifdef DEBUG
DebugMsg( DEBUG_MEDIUM | DEBUG_HIGH | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", w1, _SHIFTR( w0, 0, 16 ), _SHIFTR( w0, 16, 8 ) );
DebugMsg( DEBUG_MEDIUM | DEBUG_HIGH | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", w1, _SHIFTR( w0, 0, 16 ), _SHIFTR( w0, 16, 8 ) );
#endif
return;
}
return;
}
gSPMatrix( w1, _SHIFTR( w0, 16, 8 ) );
gSPMatrix( w1, _SHIFTR( w0, 16, 8 ) );
}
void F3D_Reserved0( u32 w0, u32 w1 )
{
#ifdef DEBUG
DebugMsg( DEBUG_MEDIUM | DEBUG_IGNORED | DEBUG_UNKNOWN, "G_RESERVED0: w0=0x%08lX w1=0x%08lX\n", w0, w1 );
DebugMsg( DEBUG_MEDIUM | DEBUG_IGNORED | DEBUG_UNKNOWN, "G_RESERVED0: w0=0x%08lX w1=0x%08lX\n", w0, w1 );
#endif
}
void F3D_MoveMem( u32 w0, u32 w1 )
{
#ifdef __TRIBUFFER_OPT
gSPFlushTriangles();
gSPFlushTriangles();
#endif
switch (_SHIFTR( w0, 16, 8 ))
{
case F3D_MV_VIEWPORT://G_MV_VIEWPORT:
gSPViewport( w1 );
break;
case G_MV_MATRIX_1:
gSPForceMatrix( w1 );
// force matrix takes four commands
RSP.PC[RSP.PCi] += 24;
break;
case G_MV_L0:
gSPLight( w1, LIGHT_1 );
break;
case G_MV_L1:
gSPLight( w1, LIGHT_2 );
break;
case G_MV_L2:
gSPLight( w1, LIGHT_3 );
break;
case G_MV_L3:
gSPLight( w1, LIGHT_4 );
break;
case G_MV_L4:
gSPLight( w1, LIGHT_5 );
break;
case G_MV_L5:
gSPLight( w1, LIGHT_6 );
break;
case G_MV_L6:
gSPLight( w1, LIGHT_7 );
break;
case G_MV_L7:
gSPLight( w1, LIGHT_8 );
break;
case G_MV_LOOKATX:
break;
case G_MV_LOOKATY:
break;
}
switch (_SHIFTR( w0, 16, 8 ))
{
case F3D_MV_VIEWPORT://G_MV_VIEWPORT:
gSPViewport( w1 );
break;
case G_MV_MATRIX_1:
gSPForceMatrix( w1 );
// force matrix takes four commands
RSP.PC[RSP.PCi] += 24;
break;
case G_MV_L0:
gSPLight( w1, LIGHT_1 );
break;
case G_MV_L1:
gSPLight( w1, LIGHT_2 );
break;
case G_MV_L2:
gSPLight( w1, LIGHT_3 );
break;
case G_MV_L3:
gSPLight( w1, LIGHT_4 );
break;
case G_MV_L4:
gSPLight( w1, LIGHT_5 );
break;
case G_MV_L5:
gSPLight( w1, LIGHT_6 );
break;
case G_MV_L6:
gSPLight( w1, LIGHT_7 );
break;
case G_MV_L7:
gSPLight( w1, LIGHT_8 );
break;
case G_MV_LOOKATX:
break;
case G_MV_LOOKATY:
break;
}
}
void F3D_Vtx( u32 w0, u32 w1 )
{
gSPVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) );
gSPVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) );
}
void F3D_Reserved1( u32 w0, u32 w1 )
@@ -95,19 +95,19 @@ void F3D_Reserved1( u32 w0, u32 w1 )
void F3D_DList( u32 w0, u32 w1 )
{
switch (_SHIFTR( w0, 16, 8 ))
{
case G_DL_PUSH:
gSPDisplayList( w1 );
break;
case G_DL_NOPUSH:
gSPBranchList( w1 );
break;
}
switch (_SHIFTR( w0, 16, 8 ))
{
case G_DL_PUSH:
gSPDisplayList( w1 );
break;
case G_DL_NOPUSH:
gSPBranchList( w1 );
break;
}
#ifdef __TRIBUFFER_OPT
//since PCi can be changed in gSPDisplayList
gSPFlushTriangles();
//since PCi can be changed in gSPDisplayList
gSPFlushTriangles();
#endif
}
@@ -121,210 +121,210 @@ void F3D_Reserved3( u32 w0, u32 w1 )
void F3D_Sprite2D_Base( u32 w0, u32 w1 )
{
//gSPSprite2DBase( w1 );
RSP.PC[RSP.PCi] += 8;
//gSPSprite2DBase( w1 );
RSP.PC[RSP.PCi] += 8;
}
void F3D_Tri1( u32 w0, u32 w1 )
{
gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10);
gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10);
}
void F3D_CullDL( u32 w0, u32 w1 )
{
gSPCullDisplayList( _SHIFTR( w0, 0, 24 ) / 40, (w1 / 40) - 1 );
gSPCullDisplayList( _SHIFTR( w0, 0, 24 ) / 40, (w1 / 40) - 1 );
}
void F3D_PopMtx( u32 w0, u32 w1 )
{
gSPPopMatrix( w1 );
gSPPopMatrix( w1 );
}
void F3D_MoveWord( u32 w0, u32 w1 )
{
switch (_SHIFTR( w0, 0, 8 ))
{
case G_MW_MATRIX:
gSPInsertMatrix( _SHIFTR( w0, 8, 16 ), w1 );
break;
switch (_SHIFTR( w0, 0, 8 ))
{
case G_MW_MATRIX:
gSPInsertMatrix( _SHIFTR( w0, 8, 16 ), w1 );
break;
case G_MW_NUMLIGHT:
gSPNumLights( ((w1 - 0x80000000) >> 5) - 1 );
break;
case G_MW_NUMLIGHT:
gSPNumLights( ((w1 - 0x80000000) >> 5) - 1 );
break;
case G_MW_CLIP:
gSPClipRatio( w1 );
break;
case G_MW_CLIP:
gSPClipRatio( w1 );
break;
case G_MW_SEGMENT:
gSPSegment( _SHIFTR( w0, 8, 16 ) >> 2, w1 & 0x00FFFFFF );
break;
case G_MW_SEGMENT:
gSPSegment( _SHIFTR( w0, 8, 16 ) >> 2, w1 & 0x00FFFFFF );
break;
case G_MW_FOG:
gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
break;
case G_MW_FOG:
gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
break;
case G_MW_LIGHTCOL:
switch (_SHIFTR( w0, 8, 16 ))
{
case F3D_MWO_aLIGHT_1:
gSPLightColor( LIGHT_1, w1 );
break;
case F3D_MWO_aLIGHT_2:
gSPLightColor( LIGHT_2, w1 );
break;
case F3D_MWO_aLIGHT_3:
gSPLightColor( LIGHT_3, w1 );
break;
case F3D_MWO_aLIGHT_4:
gSPLightColor( LIGHT_4, w1 );
break;
case F3D_MWO_aLIGHT_5:
gSPLightColor( LIGHT_5, w1 );
break;
case F3D_MWO_aLIGHT_6:
gSPLightColor( LIGHT_6, w1 );
break;
case F3D_MWO_aLIGHT_7:
gSPLightColor( LIGHT_7, w1 );
break;
case F3D_MWO_aLIGHT_8:
gSPLightColor( LIGHT_8, w1 );
break;
}
break;
case G_MW_POINTS:
gSPModifyVertex( _SHIFTR( w0, 8, 16 ) / 40, _SHIFTR( w0, 0, 8 ) % 40, w1 );
break;
case G_MW_PERSPNORM:
gSPPerspNormalize( w1 );
break;
}
case G_MW_LIGHTCOL:
switch (_SHIFTR( w0, 8, 16 ))
{
case F3D_MWO_aLIGHT_1:
gSPLightColor( LIGHT_1, w1 );
break;
case F3D_MWO_aLIGHT_2:
gSPLightColor( LIGHT_2, w1 );
break;
case F3D_MWO_aLIGHT_3:
gSPLightColor( LIGHT_3, w1 );
break;
case F3D_MWO_aLIGHT_4:
gSPLightColor( LIGHT_4, w1 );
break;
case F3D_MWO_aLIGHT_5:
gSPLightColor( LIGHT_5, w1 );
break;
case F3D_MWO_aLIGHT_6:
gSPLightColor( LIGHT_6, w1 );
break;
case F3D_MWO_aLIGHT_7:
gSPLightColor( LIGHT_7, w1 );
break;
case F3D_MWO_aLIGHT_8:
gSPLightColor( LIGHT_8, w1 );
break;
}
break;
case G_MW_POINTS:
gSPModifyVertex( _SHIFTR( w0, 8, 16 ) / 40, _SHIFTR( w0, 0, 8 ) % 40, w1 );
break;
case G_MW_PERSPNORM:
gSPPerspNormalize( w1 );
break;
}
}
void F3D_Texture( u32 w0, u32 w1 )
{
gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ),
_FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ),
_SHIFTR( w0, 11, 3 ),
_SHIFTR( w0, 8, 3 ),
_SHIFTR( w0, 0, 8 ) );
gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ),
_FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ),
_SHIFTR( w0, 11, 3 ),
_SHIFTR( w0, 8, 3 ),
_SHIFTR( w0, 0, 8 ) );
}
void F3D_SetOtherMode_H( u32 w0, u32 w1 )
{
switch (_SHIFTR( w0, 8, 8 ))
{
case G_MDSFT_PIPELINE:
gDPPipelineMode( w1 >> G_MDSFT_PIPELINE );
break;
case G_MDSFT_CYCLETYPE:
gDPSetCycleType( w1 >> G_MDSFT_CYCLETYPE );
break;
case G_MDSFT_TEXTPERSP:
gDPSetTexturePersp( w1 >> G_MDSFT_TEXTPERSP );
break;
case G_MDSFT_TEXTDETAIL:
gDPSetTextureDetail( w1 >> G_MDSFT_TEXTDETAIL );
break;
case G_MDSFT_TEXTLOD:
gDPSetTextureLOD( w1 >> G_MDSFT_TEXTLOD );
break;
case G_MDSFT_TEXTLUT:
gDPSetTextureLUT( w1 >> G_MDSFT_TEXTLUT );
break;
case G_MDSFT_TEXTFILT:
gDPSetTextureFilter( w1 >> G_MDSFT_TEXTFILT );
break;
case G_MDSFT_TEXTCONV:
gDPSetTextureConvert( w1 >> G_MDSFT_TEXTCONV );
break;
case G_MDSFT_COMBKEY:
gDPSetCombineKey( w1 >> G_MDSFT_COMBKEY );
break;
case G_MDSFT_RGBDITHER:
gDPSetColorDither( w1 >> G_MDSFT_RGBDITHER );
break;
case G_MDSFT_ALPHADITHER:
gDPSetAlphaDither( w1 >> G_MDSFT_ALPHADITHER );
break;
default:
{
uint32_t shift = _SHIFTR( w0, 8, 8 );
uint32_t length = _SHIFTR( w0, 0, 8 );
uint32_t mask = ((1 << length) - 1) << shift;
switch (_SHIFTR( w0, 8, 8 ))
{
case G_MDSFT_PIPELINE:
gDPPipelineMode( w1 >> G_MDSFT_PIPELINE );
break;
case G_MDSFT_CYCLETYPE:
gDPSetCycleType( w1 >> G_MDSFT_CYCLETYPE );
break;
case G_MDSFT_TEXTPERSP:
gDPSetTexturePersp( w1 >> G_MDSFT_TEXTPERSP );
break;
case G_MDSFT_TEXTDETAIL:
gDPSetTextureDetail( w1 >> G_MDSFT_TEXTDETAIL );
break;
case G_MDSFT_TEXTLOD:
gDPSetTextureLOD( w1 >> G_MDSFT_TEXTLOD );
break;
case G_MDSFT_TEXTLUT:
gDPSetTextureLUT( w1 >> G_MDSFT_TEXTLUT );
break;
case G_MDSFT_TEXTFILT:
gDPSetTextureFilter( w1 >> G_MDSFT_TEXTFILT );
break;
case G_MDSFT_TEXTCONV:
gDPSetTextureConvert( w1 >> G_MDSFT_TEXTCONV );
break;
case G_MDSFT_COMBKEY:
gDPSetCombineKey( w1 >> G_MDSFT_COMBKEY );
break;
case G_MDSFT_RGBDITHER:
gDPSetColorDither( w1 >> G_MDSFT_RGBDITHER );
break;
case G_MDSFT_ALPHADITHER:
gDPSetAlphaDither( w1 >> G_MDSFT_ALPHADITHER );
break;
default:
{
uint32_t shift = _SHIFTR( w0, 8, 8 );
uint32_t length = _SHIFTR( w0, 0, 8 );
uint32_t mask = ((1 << length) - 1) << shift;
gDP.otherMode.h &= ~mask;
gDP.otherMode.h |= w1 & mask;
gDP.otherMode.h &= ~mask;
gDP.otherMode.h |= w1 & mask;
gDP.changed |= CHANGED_CYCLETYPE;
}
break;
}
gDP.changed |= CHANGED_CYCLETYPE;
}
break;
}
}
void F3D_SetOtherMode_L( u32 w0, u32 w1 )
{
switch (_SHIFTR( w0, 8, 8 ))
{
case G_MDSFT_ALPHACOMPARE:
gDPSetAlphaCompare( w1 >> G_MDSFT_ALPHACOMPARE );
break;
case G_MDSFT_ZSRCSEL:
gDPSetDepthSource( w1 >> G_MDSFT_ZSRCSEL );
break;
case G_MDSFT_RENDERMODE:
gDPSetRenderMode( w1 & 0xCCCCFFFF, w1 & 0x3333FFFF );
break;
default:
{
uint32_t shift = _SHIFTR( w0, 8, 8 );
uint32_t length = _SHIFTR( w0, 0, 8 );
uint32_t mask = ((1 << length) - 1) << shift;
switch (_SHIFTR( w0, 8, 8 ))
{
case G_MDSFT_ALPHACOMPARE:
gDPSetAlphaCompare( w1 >> G_MDSFT_ALPHACOMPARE );
break;
case G_MDSFT_ZSRCSEL:
gDPSetDepthSource( w1 >> G_MDSFT_ZSRCSEL );
break;
case G_MDSFT_RENDERMODE:
gDPSetRenderMode( w1 & 0xCCCCFFFF, w1 & 0x3333FFFF );
break;
default:
{
uint32_t shift = _SHIFTR( w0, 8, 8 );
uint32_t length = _SHIFTR( w0, 0, 8 );
uint32_t mask = ((1 << length) - 1) << shift;
gDP.otherMode.l &= ~mask;
gDP.otherMode.l |= w1 & mask;
gDP.otherMode.l &= ~mask;
gDP.otherMode.l |= w1 & mask;
gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
}
break;
}
gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
}
break;
}
}
void F3D_EndDL( u32 w0, u32 w1 )
{
gSPEndDisplayList();
gSPEndDisplayList();
}
void F3D_SetGeometryMode( u32 w0, u32 w1 )
{
gSPSetGeometryMode( w1 );
gSPSetGeometryMode( w1 );
}
void F3D_ClearGeometryMode( u32 w0, u32 w1 )
{
gSPClearGeometryMode( w1 );
gSPClearGeometryMode( w1 );
}
void F3D_Line3D( u32 w0, u32 w1 )
{
// Hmmm...
// Hmmm...
}
void F3D_Quad( u32 w0, u32 w1 )
{
gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 10, _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10 );
gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 10, _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10 );
}
void F3D_RDPHalf_1( u32 w0, u32 w1 )
{
gDP.half_1 = w1;
gDP.half_1 = w1;
}
void F3D_RDPHalf_2( u32 w0, u32 w1 )
{
gDP.half_2 = w1;
gDP.half_2 = w1;
}
void F3D_RDPHalf_Cont( u32 w0, u32 w1 )
@@ -333,46 +333,45 @@ void F3D_RDPHalf_Cont( u32 w0, u32 w1 )
void F3D_Tri4( u32 w0, u32 w1 )
{
gSP4Triangles( _SHIFTR( w0, 0, 4 ), _SHIFTR( w1, 0, 4 ), _SHIFTR( w1, 4, 4 ),
_SHIFTR( w0, 4, 4 ), _SHIFTR( w1, 8, 4 ), _SHIFTR( w1, 12, 4 ),
_SHIFTR( w0, 8, 4 ), _SHIFTR( w1, 16, 4 ), _SHIFTR( w1, 20, 4 ),
_SHIFTR( w0, 12, 4 ), _SHIFTR( w1, 24, 4 ), _SHIFTR( w1, 28, 4 ) );
gSP4Triangles( _SHIFTR( w0, 0, 4 ), _SHIFTR( w1, 0, 4 ), _SHIFTR( w1, 4, 4 ),
_SHIFTR( w0, 4, 4 ), _SHIFTR( w1, 8, 4 ), _SHIFTR( w1, 12, 4 ),
_SHIFTR( w0, 8, 4 ), _SHIFTR( w1, 16, 4 ), _SHIFTR( w1, 20, 4 ),
_SHIFTR( w0, 12, 4 ), _SHIFTR( w1, 24, 4 ), _SHIFTR( w1, 28, 4 ) );
}
void F3D_Init()
void F3D_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3D );
// Set GeometryMode flags
GBI_InitFlags( F3D );
GBI.PCStackSize = 10;
GBI.PCStackSize = 10;
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3D_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3D_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
GBI_SetGBI( G_TRI1, F3D_TRI1, F3D_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
GBI_SetGBI( G_TRI1, F3D_TRI1, F3D_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
}
+132 -134
View File
@@ -23,44 +23,44 @@ u32 normal_address = 0;
void F3DCBFD_Vtx(u32 w0, u32 w1)
{
s32 i;
s32 v0, n;
u32 address;
n = (w0 >> 12)&0xFF;
v0 = ((w0 >> 1)&0x7F) - n;
address = RSP_SegmentToPhysical(w1);
s32 v0, n;
u32 address;
n = (w0 >> 12)&0xFF;
v0 = ((w0 >> 1)&0x7F) - n;
address = RSP_SegmentToPhysical(w1);
if (v0 < 0)
{
return;
}
if (v0 < 0)
{
return;
}
gSPFlushTriangles();
gSPFlushTriangles();
Vertex* vertex = (Vertex*)&RDRAM[address];
u32 v;
Vertex* vertex = (Vertex*)&RDRAM[address];
u32 v;
for (i = 0; i < n; i++)
{
for (i = 0; i < n; i++)
{
#ifdef __TRIBUFFER_OPT
v = __indexmap_getnew(v0 + i, 1);
v = __indexmap_getnew(v0 + i, 1);
#else
v = v0 + i;
v = v0 + i;
#endif
OGL.triangles.vertices[v].x = vertex->x;
OGL.triangles.vertices[v].y = vertex->y;
OGL.triangles.vertices[v].z = vertex->z;
OGL.triangles.vertices[v].w = 1.0f;
OGL.triangles.vertices[v].x = vertex->x;
OGL.triangles.vertices[v].y = vertex->y;
OGL.triangles.vertices[v].z = vertex->z;
OGL.triangles.vertices[v].w = 1.0f;
OGL.triangles.vertices[v].s = _FIXED2FLOAT(vertex->s, 5);
OGL.triangles.vertices[v].t = _FIXED2FLOAT(vertex->t, 5);
OGL.triangles.vertices[v].s = _FIXED2FLOAT(vertex->s, 5);
OGL.triangles.vertices[v].t = _FIXED2FLOAT(vertex->t, 5);
if (config.enableLighting && gSP.geometryMode & G_LIGHTING)
{
OGL.triangles.vertices[v].nx = ((s8*)RDRAM)[(normal_address + (i<<1) + (v0<<1) + 0)^3];
OGL.triangles.vertices[v].ny = ((s8*)RDRAM)[(normal_address + (i<<1) + (v0<<1) + 1)^3];
OGL.triangles.vertices[v].nz = (s8)(vertex->flag&0xff);
}
{
OGL.triangles.vertices[v].nx = ((s8*)RDRAM)[(normal_address + (i<<1) + (v0<<1) + 0)^3];
OGL.triangles.vertices[v].ny = ((s8*)RDRAM)[(normal_address + (i<<1) + (v0<<1) + 1)^3];
OGL.triangles.vertices[v].nz = (s8)(vertex->flag&0xff);
}
gSPProcessVertex(v);
@@ -70,148 +70,146 @@ void F3DCBFD_Vtx(u32 w0, u32 w1)
nonblack += OGL.triangles.vertices[v].b;
if (config.enableLighting && (gSP.geometryMode & G_LIGHTING) && (nonblack != 0))
{
OGL.triangles.vertices[v].r = OGL.triangles.vertices[v].r * vertex->color.r * 0.0039215689f;
OGL.triangles.vertices[v].g = OGL.triangles.vertices[v].g * vertex->color.g * 0.0039215689f;
OGL.triangles.vertices[v].b = OGL.triangles.vertices[v].b * vertex->color.b * 0.0039215689f;
OGL.triangles.vertices[v].a = vertex->color.a * 0.0039215689f;
}
else
{
OGL.triangles.vertices[v].r = vertex->color.r * 0.0039215689f;
OGL.triangles.vertices[v].g = vertex->color.g * 0.0039215689f;
OGL.triangles.vertices[v].b = vertex->color.b * 0.0039215689f;
OGL.triangles.vertices[v].a = vertex->color.a * 0.0039215689f;
}
vertex++;
}
{
OGL.triangles.vertices[v].r = OGL.triangles.vertices[v].r * vertex->color.r * 0.0039215689f;
OGL.triangles.vertices[v].g = OGL.triangles.vertices[v].g * vertex->color.g * 0.0039215689f;
OGL.triangles.vertices[v].b = OGL.triangles.vertices[v].b * vertex->color.b * 0.0039215689f;
OGL.triangles.vertices[v].a = vertex->color.a * 0.0039215689f;
}
else
{
OGL.triangles.vertices[v].r = vertex->color.r * 0.0039215689f;
OGL.triangles.vertices[v].g = vertex->color.g * 0.0039215689f;
OGL.triangles.vertices[v].b = vertex->color.b * 0.0039215689f;
OGL.triangles.vertices[v].a = vertex->color.a * 0.0039215689f;
}
vertex++;
}
}
void F3DCBFD_MoveWord(u32 w0, u32 w1)
{
u8 index = (u8)((w0 >> 16) & 0xFF);
u16 offset = (u16)(w0 & 0xFFFF);
u8 index = (u8)((w0 >> 16) & 0xFF);
u16 offset = (u16)(w0 & 0xFFFF);
switch (index)
{
case G_MW_NUMLIGHT:
if (config.enableLighting)
gSPNumLights(w1 / 48);
break;
switch (index)
{
case G_MW_NUMLIGHT:
if (config.enableLighting)
gSPNumLights(w1 / 48);
break;
case G_MW_CLIP:
if (offset == 0x04)
{
gSPClipRatio( w1 );
}
break;
case G_MW_CLIP:
if (offset == 0x04)
{
gSPClipRatio( w1 );
}
break;
case G_MW_SEGMENT:
gSPSegment(_SHIFTR(offset, 2, 4), w1 & 0x00FFFFFF);
break;
case G_MW_SEGMENT:
gSPSegment(_SHIFTR(offset, 2, 4), w1 & 0x00FFFFFF);
break;
case G_MW_FOG:
gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
break;
case G_MW_FOG:
gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
break;
case G_MV_COORDMOD: // moveword coord mod
break;
case G_MV_COORDMOD: // moveword coord mod
break;
default:
break;
}
default:
break;
}
}
void F3DCBFD_MoveMem(u32 w0, u32 w1)
{
#ifdef __TRIBUFFER_OPT
gSPFlushTriangles();
gSPFlushTriangles();
#endif
switch (_SHIFTR( w0, 0, 8 ))
{
case F3DCBFD_MV_VIEWPORT:
gSPViewport(w1);
switch (_SHIFTR( w0, 0, 8 ))
{
case F3DCBFD_MV_VIEWPORT:
gSPViewport(w1);
break;
case F3DCBFD_MV_LIGHT:
{
u32 offset = (w0 >> 5) & 0x3FFF;
u32 n = offset / 48;
if (n < 2)
{
//LookAt
return;
}
n--;
gSPLight(w1, n);
break;
}
case F3DCBFD_MV_LIGHT:
{
u32 offset = (w0 >> 5) & 0x3FFF;
u32 n = offset / 48;
if (n < 2)
{
//LookAt
return;
}
n--;
gSPLight(w1, n);
break;
}
case F3DCBFD_MV_NORMAL:
normal_address = RSP_SegmentToPhysical(w1);
break;
case F3DCBFD_MV_NORMAL:
normal_address = RSP_SegmentToPhysical(w1);
break;
}
}
}
void F3DCBFD_Tri4(u32 w0, u32 w1)
{
gSP4Triangles( _SHIFTR(w0, 23, 5), _SHIFTR(w0, 18, 5), (_SHIFTR(w0, 15, 3 ) << 2) | _SHIFTR(w1, 30, 2),
_SHIFTR(w0, 10, 5), _SHIFTR(w0, 5, 5), _SHIFTR(w0, 0, 5),
_SHIFTR(w1, 25, 5), _SHIFTR(w1, 20, 5), _SHIFTR(w1, 15, 5),
_SHIFTR(w1, 10, 5), _SHIFTR(w1, 5, 5), _SHIFTR(w1, 0, 5));
gSP4Triangles( _SHIFTR(w0, 23, 5), _SHIFTR(w0, 18, 5), (_SHIFTR(w0, 15, 3 ) << 2) | _SHIFTR(w1, 30, 2),
_SHIFTR(w0, 10, 5), _SHIFTR(w0, 5, 5), _SHIFTR(w0, 0, 5),
_SHIFTR(w1, 25, 5), _SHIFTR(w1, 20, 5), _SHIFTR(w1, 15, 5),
_SHIFTR(w1, 10, 5), _SHIFTR(w1, 5, 5), _SHIFTR(w1, 0, 5));
}
void F3DCBFD_Init()
void F3DCBFD_Init(void)
{
int i;
LOG(LOG_VERBOSE, "USING CBFD ucode!\n");
LOG(LOG_VERBOSE, "USING CBFD ucode!\n");
// Set GeometryMode flags
GBI_InitFlags(F3DEX2);
// Set GeometryMode flags
GBI_InitFlags(F3DEX2);
GBI.PCStackSize = 10;
GBI.PCStackSize = 10;
// GBI Command Command Value Command Function
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DCBFD_MoveMem);
GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DCBFD_MoveWord);
GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx );
GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode );
GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx );
GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture );
GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO );
GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 );
GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 );
GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 );
// GBI Command Command Value Command Function
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DCBFD_MoveMem);
GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DCBFD_MoveWord);
GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx );
GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode );
GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx );
GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture );
GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO );
GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 );
GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 );
GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 );
GBI_SetGBI(G_VTX, F3DEX2_VTX, F3DCBFD_Vtx);
GBI_SetGBI(G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx);
GBI_SetGBI(G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL);
GBI_SetGBI(G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX_Branch_Z);
GBI_SetGBI(G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1);
GBI_SetGBI(G_TRI2, F3DEX2_TRI2, F3DEX_Tri2);
GBI_SetGBI(G_QUAD, F3DEX2_QUAD, F3DEX2_Quad);
// GBI_SetGBI( G_LINE3D, F3DEX2_LINE3D, F3DEX2_Line3D );
GBI_SetGBI(G_VTX, F3DEX2_VTX, F3DCBFD_Vtx);
GBI_SetGBI(G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx);
GBI_SetGBI(G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL);
GBI_SetGBI(G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX_Branch_Z);
GBI_SetGBI(G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1);
GBI_SetGBI(G_TRI2, F3DEX2_TRI2, F3DEX_Tri2);
GBI_SetGBI(G_QUAD, F3DEX2_QUAD, F3DEX2_Quad);
// GBI_SetGBI( G_LINE3D, F3DEX2_LINE3D, F3DEX2_Line3D );
//for some reason glide64 maps TRI4 to these locations:
//for some reason glide64 maps TRI4 to these locations:
for(i = 0x10; i <= 0x1F; i++)
GBI_SetGBI(G_TRI4, i, F3DCBFD_Tri4);
for(i = 0x10; i <= 0x1F; i++)
GBI_SetGBI(G_TRI4, i, F3DCBFD_Tri4);
GBI_SetGBI( G_BG_1CYC, S2DEX2_BG_1CYC, S2DEX_BG_1Cyc);
GBI_SetGBI( G_BG_COPY, S2DEX2_BG_COPY, S2DEX_BG_Copy);
GBI_SetGBI( G_OBJ_RENDERMODE, S2DEX2_OBJ_RENDERMODE, S2DEX_Obj_RenderMode);
GBI_SetGBI( G_BG_1CYC, S2DEX2_BG_1CYC, S2DEX_BG_1Cyc);
GBI_SetGBI( G_BG_COPY, S2DEX2_BG_COPY, S2DEX_BG_Copy);
GBI_SetGBI( G_OBJ_RENDERMODE, S2DEX2_OBJ_RENDERMODE, S2DEX_Obj_RenderMode);
}
+1 -1
View File
@@ -5,7 +5,7 @@
extern "C" {
#endif
void F3DCBFD_Init();
void F3DCBFD_Init(void);
#ifdef __cplusplus
}
+72 -73
View File
@@ -13,112 +13,111 @@
void F3DDKR_DMA_Mtx( u32 w0, u32 w1 )
{
if (_SHIFTR( w0, 0, 16 ) != 64)
{
// GBI_DetectUCode(); // Something's wrong
if (_SHIFTR( w0, 0, 16 ) != 64)
{
// GBI_DetectUCode(); // Something's wrong
#ifdef DEBUG
DebugMsg( DEBUG_MEDIUM | DEBUG_HIGH | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", w1, _SHIFTR( w0, 0, 16 ), _SHIFTR( w0, 16, 8 ) );
DebugMsg( DEBUG_MEDIUM | DEBUG_HIGH | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", w1, _SHIFTR( w0, 0, 16 ), _SHIFTR( w0, 16, 8 ) );
#endif
return;
}
return;
}
u32 index = _SHIFTR( w0, 16, 4 );
u32 multiply;
u32 index = _SHIFTR( w0, 16, 4 );
u32 multiply;
if (index == 0) // DKR
{
index = _SHIFTR( w0, 22, 2 );
multiply = 0;
}
else // Gemini
{
multiply = _SHIFTR( w0, 23, 1 );
}
if (index == 0) // DKR
{
index = _SHIFTR( w0, 22, 2 );
multiply = 0;
}
else // Gemini
{
multiply = _SHIFTR( w0, 23, 1 );
}
gSPDMAMatrix( w1, index, multiply );
gSPDMAMatrix( w1, index, multiply );
}
void F3DDKR_DMA_Vtx( u32 w0, u32 w1 )
{
if ((w0 & F3DDKR_VTX_APPEND))
{
if (gSP.matrix.billboard)
gSP.vertexi = 1;
}
else
gSP.vertexi = 0;
if ((w0 & F3DDKR_VTX_APPEND))
{
if (gSP.matrix.billboard)
gSP.vertexi = 1;
}
else
gSP.vertexi = 0;
u32 n = _SHIFTR( w0, 19, 5 ) + 1;
u32 n = _SHIFTR( w0, 19, 5 ) + 1;
gSPDMAVertex( w1, n, gSP.vertexi + _SHIFTR( w0, 9, 5 ) );
gSPDMAVertex( w1, n, gSP.vertexi + _SHIFTR( w0, 9, 5 ) );
gSP.vertexi += n;
gSP.vertexi += n;
}
void F3DDKR_DMA_Tri( u32 w0, u32 w1 )
{
gSPDMATriangles( w1, _SHIFTR( w0, 4, 12 ) );
gSP.vertexi = 0;
gSPDMATriangles( w1, _SHIFTR( w0, 4, 12 ) );
gSP.vertexi = 0;
}
void F3DDKR_DMA_DList( u32 w0, u32 w1 )
{
gSPDMADisplayList( w1, _SHIFTR( w0, 16, 8 ) );
gSPDMADisplayList( w1, _SHIFTR( w0, 16, 8 ) );
}
void F3DDKR_DMA_Offsets( u32 w0, u32 w1 )
{
gSPSetDMAOffsets( _SHIFTR( w0, 0, 24 ), _SHIFTR( w1, 0, 24 ) );
gSPSetDMAOffsets( _SHIFTR( w0, 0, 24 ), _SHIFTR( w1, 0, 24 ) );
}
void F3DDKR_MoveWord( u32 w0, u32 w1 )
{
switch (_SHIFTR( w0, 0, 8 ))
{
case 0x02:
gSP.matrix.billboard = w1 & 1;
break;
case 0x0A:
gSP.matrix.modelViewi = _SHIFTR( w1, 6, 2 );
gSP.changed |= CHANGED_MATRIX;
break;
default:
F3D_MoveWord( w0, w1 );
break;
}
switch (_SHIFTR( w0, 0, 8 ))
{
case 0x02:
gSP.matrix.billboard = w1 & 1;
break;
case 0x0A:
gSP.matrix.modelViewi = _SHIFTR( w1, 6, 2 );
gSP.changed |= CHANGED_MATRIX;
break;
default:
F3D_MoveWord( w0, w1 );
break;
}
}
void F3DDKR_Init()
void F3DDKR_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3D );
// Set GeometryMode flags
GBI_InitFlags( F3D );
GBI.PCStackSize = 10;
GBI.PCStackSize = 10;
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_DMA_MTX, F3DDKR_DMA_MTX, F3DDKR_DMA_Mtx );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_DMA_VTX, F3DDKR_DMA_VTX, F3DDKR_DMA_Vtx );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_DMA_DL, F3DDKR_DMA_DL, F3DDKR_DMA_DList );
GBI_SetGBI( G_DMA_TRI, F3DDKR_DMA_TRI, F3DDKR_DMA_Tri );
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_DMA_MTX, F3DDKR_DMA_MTX, F3DDKR_DMA_Mtx );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_DMA_VTX, F3DDKR_DMA_VTX, F3DDKR_DMA_Vtx );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_DMA_DL, F3DDKR_DMA_DL, F3DDKR_DMA_DList );
GBI_SetGBI( G_DMA_TRI, F3DDKR_DMA_TRI, F3DDKR_DMA_Tri );
GBI_SetGBI( G_DMA_OFFSETS, F3DDKR_DMA_OFFSETS, F3DDKR_DMA_Offsets );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3DDKR_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
GBI_SetGBI( G_DMA_OFFSETS, F3DDKR_DMA_OFFSETS, F3DDKR_DMA_Offsets );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3DDKR_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
gSPSetDMAOffsets( 0, 0 );
gSPSetDMAOffsets( 0, 0 );
}
+1 -1
View File
@@ -13,7 +13,7 @@
extern "C" {
#endif
void F3DDKR_Init();
void F3DDKR_Init(void);
#ifdef __cplusplus
}
+41 -42
View File
@@ -11,80 +11,79 @@
void F3DEX_Vtx( u32 w0, u32 w1 )
{
gSPVertex( w1, _SHIFTR( w0, 10, 6 ), _SHIFTR( w0, 17, 7 ) );
gSPVertex( w1, _SHIFTR( w0, 10, 6 ), _SHIFTR( w0, 17, 7 ) );
}
void F3DEX_Tri1( u32 w0, u32 w1 )
{
gSP1Triangle( _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ));
gSP1Triangle( _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ));
}
void F3DEX_CullDL( u32 w0, u32 w1 )
{
gSPCullDisplayList( _SHIFTR( w0, 1, 15 ), _SHIFTR( w1, 1, 15 ) );
gSPCullDisplayList( _SHIFTR( w0, 1, 15 ), _SHIFTR( w1, 1, 15 ) );
}
void F3DEX_ModifyVtx( u32 w0, u32 w1 )
{
gSPModifyVertex( _SHIFTR( w0, 1, 15 ), _SHIFTR( w0, 16, 8 ), w1 );
gSPModifyVertex( _SHIFTR( w0, 1, 15 ), _SHIFTR( w0, 16, 8 ), w1 );
}
void F3DEX_Tri2( u32 w0, u32 w1 )
{
gSP2Triangles( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), _SHIFTR( w0, 1, 7 ), 0,
_SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ), 0);
gSP2Triangles( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), _SHIFTR( w0, 1, 7 ), 0,
_SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ), 0);
}
void F3DEX_Quad( u32 w0, u32 w1 )
{
gSP1Quadrangle( _SHIFTR( w1, 25, 7 ), _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ) );
gSP1Quadrangle( _SHIFTR( w1, 25, 7 ), _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ) );
}
void F3DEX_Branch_Z( u32 w0, u32 w1 )
{
gSPBranchLessZ( gDP.half_1, _SHIFTR( w0, 1, 11 ), (s32)w1 );
gSPBranchLessZ( gDP.half_1, _SHIFTR( w0, 1, 11 ), (s32)w1 );
}
void F3DEX_Load_uCode( u32 w0, u32 w1 )
{
gSPLoadUcodeEx( w1, gDP.half_1, _SHIFTR( w0, 0, 16 ) + 1 );
gSPLoadUcodeEx( w1, gDP.half_1, _SHIFTR( w0, 0, 16 ) + 1 );
}
void F3DEX_Init()
void F3DEX_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3DEX );
// Set GeometryMode flags
GBI_InitFlags( F3DEX );
GBI.PCStackSize = 18;
GBI.PCStackSize = 18;
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3DEX_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3DEX_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
GBI_SetGBI( G_TRI1, F3D_TRI1, F3DEX_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3DEX_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3DEX_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_MODIFYVTX, F3DEX_MODIFYVTX, F3DEX_ModifyVtx );
GBI_SetGBI( G_TRI2, F3DEX_TRI2, F3DEX_Tri2 );
GBI_SetGBI( G_BRANCH_Z, F3DEX_BRANCH_Z, F3DEX_Branch_Z );
GBI_SetGBI( G_LOAD_UCODE, F3DEX_LOAD_UCODE, F3DEX_Load_uCode );
GBI_SetGBI( G_TRI1, F3D_TRI1, F3DEX_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3DEX_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3DEX_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_MODIFYVTX, F3DEX_MODIFYVTX, F3DEX_ModifyVtx );
GBI_SetGBI( G_TRI2, F3DEX_TRI2, F3DEX_Tri2 );
GBI_SetGBI( G_BRANCH_Z, F3DEX_BRANCH_Z, F3DEX_Branch_Z );
GBI_SetGBI( G_LOAD_UCODE, F3DEX_LOAD_UCODE, F3DEX_Load_uCode );
}
+165 -166
View File
@@ -15,42 +15,42 @@
void F3DEX2_Mtx( u32 w0, u32 w1 )
{
gSPMatrix( w1, _SHIFTR( w0, 0, 8 ) ^ G_MTX_PUSH );
gSPMatrix( w1, _SHIFTR( w0, 0, 8 ) ^ G_MTX_PUSH );
}
void F3DEX2_MoveMem( u32 w0, u32 w1 )
{
#ifdef __TRIBUFFER_OPT
gSPFlushTriangles();
gSPFlushTriangles();
#endif
switch (_SHIFTR( w0, 0, 8 ))
{
case F3DEX2_MV_VIEWPORT:
gSPViewport( w1 );
break;
switch (_SHIFTR( w0, 0, 8 ))
{
case F3DEX2_MV_VIEWPORT:
gSPViewport( w1 );
break;
case G_MV_MATRIX:
gSPForceMatrix( w1 );
RSP.PC[RSP.PCi] += 8; // force matrix takes two commands
break;
case G_MV_MATRIX:
gSPForceMatrix( w1 );
RSP.PC[RSP.PCi] += 8; // force matrix takes two commands
break;
case G_MV_LIGHT:
case G_MV_LIGHT:
{
uint32_t offset = _SHIFTR( w0, 8, 8 ) << 3;
if (offset >= 48)
{
uint32_t offset = _SHIFTR( w0, 8, 8 ) << 3;
if (offset >= 48)
{
gSPLight( w1, (offset - 24) / 24);
}
gSPLight( w1, (offset - 24) / 24);
}
break;
}
}
break;
}
}
void F3DEX2_Vtx( u32 w0, u32 w1 )
{
u32 n = _SHIFTR( w0, 12, 8 );
u32 n = _SHIFTR( w0, 12, 8 );
gSPVertex( w1, n, _SHIFTR( w0, 1, 7 ) - n );
gSPVertex( w1, n, _SHIFTR( w0, 1, 7 ) - n );
}
void F3DEX2_Reserved1( u32 w0, u32 w1 )
@@ -59,139 +59,139 @@ void F3DEX2_Reserved1( u32 w0, u32 w1 )
void F3DEX2_Tri1( u32 w0, u32 w1 )
{
gSP1Triangle( _SHIFTR( w0, 17, 7 ),
_SHIFTR( w0, 9, 7 ),
_SHIFTR( w0, 1, 7 ));
gSP1Triangle( _SHIFTR( w0, 17, 7 ),
_SHIFTR( w0, 9, 7 ),
_SHIFTR( w0, 1, 7 ));
}
void F3DEX2_PopMtx( u32 w0, u32 w1 )
{
gSPPopMatrixN( 0, w1 >> 6 );
gSPPopMatrixN( 0, w1 >> 6 );
}
void F3DEX2_MoveWord( u32 w0, u32 w1 )
{
switch (_SHIFTR( w0, 16, 8 ))
{
case G_MW_FORCEMTX:
// Handled in movemem
break;
case G_MW_MATRIX:
gSPInsertMatrix( _SHIFTR( w0, 0, 16 ), w1 );
break;
case G_MW_NUMLIGHT:
gSPNumLights( w1 / 24 );
break;
case G_MW_CLIP:
gSPClipRatio( w1 );
break;
case G_MW_SEGMENT:
gSPSegment( _SHIFTR( w0, 0, 16 ) >> 2, w1 & 0x00FFFFFF );
break;
case G_MW_FOG:
gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
break;
case G_MW_LIGHTCOL:
gSPLightColor((_SHIFTR( w0, 0, 16 ) / 24) + 1, w1 );
break;
case G_MW_PERSPNORM:
gSPPerspNormalize( w1 );
break;
}
switch (_SHIFTR( w0, 16, 8 ))
{
case G_MW_FORCEMTX:
// Handled in movemem
break;
case G_MW_MATRIX:
gSPInsertMatrix( _SHIFTR( w0, 0, 16 ), w1 );
break;
case G_MW_NUMLIGHT:
gSPNumLights( w1 / 24 );
break;
case G_MW_CLIP:
gSPClipRatio( w1 );
break;
case G_MW_SEGMENT:
gSPSegment( _SHIFTR( w0, 0, 16 ) >> 2, w1 & 0x00FFFFFF );
break;
case G_MW_FOG:
gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
break;
case G_MW_LIGHTCOL:
gSPLightColor((_SHIFTR( w0, 0, 16 ) / 24) + 1, w1 );
break;
case G_MW_PERSPNORM:
gSPPerspNormalize( w1 );
break;
}
}
void F3DEX2_Texture( u32 w0, u32 w1 )
{
gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ),
_FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ),
_SHIFTR( w0, 11, 3 ),
_SHIFTR( w0, 8, 3 ),
_SHIFTR( w0, 1, 7 ) );
gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ),
_FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ),
_SHIFTR( w0, 11, 3 ),
_SHIFTR( w0, 8, 3 ),
_SHIFTR( w0, 1, 7 ) );
}
void F3DEX2_SetOtherMode_H( u32 w0, u32 w1 )
{
switch (32 - _SHIFTR( w0, 8, 8 ) - (_SHIFTR( w0, 0, 8 ) + 1))
{
case G_MDSFT_PIPELINE:
gDPPipelineMode( w1 >> G_MDSFT_PIPELINE );
break;
case G_MDSFT_CYCLETYPE:
gDPSetCycleType( w1 >> G_MDSFT_CYCLETYPE );
break;
case G_MDSFT_TEXTPERSP:
gDPSetTexturePersp( w1 >> G_MDSFT_TEXTPERSP );
break;
case G_MDSFT_TEXTDETAIL:
gDPSetTextureDetail( w1 >> G_MDSFT_TEXTDETAIL );
break;
case G_MDSFT_TEXTLOD:
gDPSetTextureLOD( w1 >> G_MDSFT_TEXTLOD );
break;
case G_MDSFT_TEXTLUT:
gDPSetTextureLUT( w1 >> G_MDSFT_TEXTLUT );
break;
case G_MDSFT_TEXTFILT:
gDPSetTextureFilter( w1 >> G_MDSFT_TEXTFILT );
break;
case G_MDSFT_TEXTCONV:
gDPSetTextureConvert( w1 >> G_MDSFT_TEXTCONV );
break;
case G_MDSFT_COMBKEY:
gDPSetCombineKey( w1 >> G_MDSFT_COMBKEY );
break;
case G_MDSFT_RGBDITHER:
gDPSetColorDither( w1 >> G_MDSFT_RGBDITHER );
break;
case G_MDSFT_ALPHADITHER:
gDPSetAlphaDither( w1 >> G_MDSFT_ALPHADITHER );
break;
default:
{
uint32_t length = _SHIFTR( w0, 0, 8 ) + 1;
uint32_t shift = 32 - _SHIFTR( w0, 8, 8 ) - length;
uint32_t mask = ((1 << length) - 1) << shift;
switch (32 - _SHIFTR( w0, 8, 8 ) - (_SHIFTR( w0, 0, 8 ) + 1))
{
case G_MDSFT_PIPELINE:
gDPPipelineMode( w1 >> G_MDSFT_PIPELINE );
break;
case G_MDSFT_CYCLETYPE:
gDPSetCycleType( w1 >> G_MDSFT_CYCLETYPE );
break;
case G_MDSFT_TEXTPERSP:
gDPSetTexturePersp( w1 >> G_MDSFT_TEXTPERSP );
break;
case G_MDSFT_TEXTDETAIL:
gDPSetTextureDetail( w1 >> G_MDSFT_TEXTDETAIL );
break;
case G_MDSFT_TEXTLOD:
gDPSetTextureLOD( w1 >> G_MDSFT_TEXTLOD );
break;
case G_MDSFT_TEXTLUT:
gDPSetTextureLUT( w1 >> G_MDSFT_TEXTLUT );
break;
case G_MDSFT_TEXTFILT:
gDPSetTextureFilter( w1 >> G_MDSFT_TEXTFILT );
break;
case G_MDSFT_TEXTCONV:
gDPSetTextureConvert( w1 >> G_MDSFT_TEXTCONV );
break;
case G_MDSFT_COMBKEY:
gDPSetCombineKey( w1 >> G_MDSFT_COMBKEY );
break;
case G_MDSFT_RGBDITHER:
gDPSetColorDither( w1 >> G_MDSFT_RGBDITHER );
break;
case G_MDSFT_ALPHADITHER:
gDPSetAlphaDither( w1 >> G_MDSFT_ALPHADITHER );
break;
default:
{
uint32_t length = _SHIFTR( w0, 0, 8 ) + 1;
uint32_t shift = 32 - _SHIFTR( w0, 8, 8 ) - length;
uint32_t mask = ((1 << length) - 1) << shift;
gDP.otherMode.h &= ~mask;
gDP.otherMode.h |= w1 & mask;
gDP.otherMode.h &= ~mask;
gDP.otherMode.h |= w1 & mask;
gDP.changed |= CHANGED_CYCLETYPE;
}
break;
}
gDP.changed |= CHANGED_CYCLETYPE;
}
break;
}
}
void F3DEX2_SetOtherMode_L( u32 w0, u32 w1 )
{
switch (32 - _SHIFTR( w0, 8, 8 ) - (_SHIFTR( w0, 0, 8 ) + 1))
{
case G_MDSFT_ALPHACOMPARE:
gDPSetAlphaCompare( w1 >> G_MDSFT_ALPHACOMPARE );
break;
case G_MDSFT_ZSRCSEL:
gDPSetDepthSource( w1 >> G_MDSFT_ZSRCSEL );
break;
case G_MDSFT_RENDERMODE:
gDPSetRenderMode( w1 & 0xCCCCFFFF, w1 & 0x3333FFFF );
break;
default:
{
uint32_t length = _SHIFTR( w0, 0, 8 ) + 1;
uint32_t shift = 32 - _SHIFTR( w0, 8, 8 ) - length;
uint32_t mask = ((1 << length) - 1) << shift;
switch (32 - _SHIFTR( w0, 8, 8 ) - (_SHIFTR( w0, 0, 8 ) + 1))
{
case G_MDSFT_ALPHACOMPARE:
gDPSetAlphaCompare( w1 >> G_MDSFT_ALPHACOMPARE );
break;
case G_MDSFT_ZSRCSEL:
gDPSetDepthSource( w1 >> G_MDSFT_ZSRCSEL );
break;
case G_MDSFT_RENDERMODE:
gDPSetRenderMode( w1 & 0xCCCCFFFF, w1 & 0x3333FFFF );
break;
default:
{
uint32_t length = _SHIFTR( w0, 0, 8 ) + 1;
uint32_t shift = 32 - _SHIFTR( w0, 8, 8 ) - length;
uint32_t mask = ((1 << length) - 1) << shift;
gDP.otherMode.l &= ~mask;
gDP.otherMode.l |= w1 & mask;
gDP.otherMode.l &= ~mask;
gDP.otherMode.l |= w1 & mask;
gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
}
break;
}
gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
}
break;
}
}
void F3DEX2_GeometryMode( u32 w0, u32 w1 )
{
gSPGeometryMode( ~_SHIFTR( w0, 0, 24 ), w1 );
gSPGeometryMode( ~_SHIFTR( w0, 0, 24 ), w1 );
}
void F3DEX2_DMAIO( u32 w0, u32 w1 )
@@ -212,50 +212,49 @@ void F3DEX2_Special_3( u32 w0, u32 w1 )
void F3DEX2_Quad( u32 w0, u32 w1 )
{
gSP2Triangles( _SHIFTR( w0, 17, 7 ),
_SHIFTR( w0, 9, 7 ),
_SHIFTR( w0, 1, 7 ),
0,
_SHIFTR( w1, 17, 7 ),
_SHIFTR( w1, 9, 7 ),
_SHIFTR( w1, 1, 7 ),
0 );
gSP2Triangles( _SHIFTR( w0, 17, 7 ),
_SHIFTR( w0, 9, 7 ),
_SHIFTR( w0, 1, 7 ),
0,
_SHIFTR( w1, 17, 7 ),
_SHIFTR( w1, 9, 7 ),
_SHIFTR( w1, 1, 7 ),
0 );
}
void F3DEX2_Init()
void F3DEX2_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3DEX2 );
// Set GeometryMode flags
GBI_InitFlags( F3DEX2 );
GBI.PCStackSize = 18;
GBI.PCStackSize = 18;
// GBI Command Command Value Command Function
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DEX2_MoveMem );
GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord );
GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx );
GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode );
GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx );
GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture );
GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO );
GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 );
GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 );
GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 );
// GBI Command Command Value Command Function
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DEX2_MoveMem );
GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord );
GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx );
GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode );
GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx );
GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture );
GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO );
GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 );
GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 );
GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 );
GBI_SetGBI( G_VTX, F3DEX2_VTX, F3DEX2_Vtx );
GBI_SetGBI( G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx );
GBI_SetGBI( G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL );
GBI_SetGBI( G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX_Branch_Z );
GBI_SetGBI( G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1 );
GBI_SetGBI( G_TRI2, F3DEX2_TRI2, F3DEX_Tri2 );
GBI_SetGBI( G_QUAD, F3DEX2_QUAD, F3DEX2_Quad );
// GBI_SetGBI( G_LINE3D, F3DEX2_LINE3D, F3DEX2_Line3D );
GBI_SetGBI( G_VTX, F3DEX2_VTX, F3DEX2_Vtx );
GBI_SetGBI( G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx );
GBI_SetGBI( G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL );
GBI_SetGBI( G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX_Branch_Z );
GBI_SetGBI( G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1 );
GBI_SetGBI( G_TRI2, F3DEX2_TRI2, F3DEX_Tri2 );
GBI_SetGBI( G_QUAD, F3DEX2_QUAD, F3DEX2_Quad );
// GBI_SetGBI( G_LINE3D, F3DEX2_LINE3D, F3DEX2_Line3D );
}
+33 -34
View File
@@ -11,49 +11,48 @@
void F3DPD_Vtx( u32 w0, u32 w1 )
{
gSPCIVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) );
gSPCIVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) );
}
void F3DPD_VtxColorBase( u32 w0, u32 w1 )
{
gSPSetVertexColorBase( w1 );
gSPSetVertexColorBase( w1 );
}
void F3DPD_Init()
void F3DPD_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3D );
// Set GeometryMode flags
GBI_InitFlags( F3D );
GBI.PCStackSize = 10;
GBI.PCStackSize = 10;
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3DPD_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_VTXCOLORBASE, F3DPD_VTXCOLORBASE, F3DPD_VtxColorBase );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3DPD_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_VTXCOLORBASE, F3DPD_VTXCOLORBASE, F3DPD_VtxColorBase );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
GBI_SetGBI( G_TRI1, F3D_TRI1, F3D_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
GBI_SetGBI( G_TRI1, F3D_TRI1, F3D_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
gSPSetDMAOffsets( 0, 0 );
gSPSetDMAOffsets( 0, 0 );
}
+1 -1
View File
@@ -7,7 +7,7 @@ extern "C" {
#define F3DPD_VTXCOLORBASE 0x07
void F3DPD_Init();
void F3DPD_Init(void);
#ifdef __cplusplus
}
+37 -39
View File
@@ -13,61 +13,59 @@
void F3DWRUS_Vtx( u32 w0, u32 w1 )
{
gSPVertex( w1, _SHIFTR( w0, 9, 7 ), _SHIFTR( w0, 16, 8 ) / 5 );
gSPVertex( w1, _SHIFTR( w0, 9, 7 ), _SHIFTR( w0, 16, 8 ) / 5 );
}
void F3DWRUS_Tri1( u32 w0, u32 w1 )
{
gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 5,
_SHIFTR( w1, 8, 8 ) / 5,
_SHIFTR( w1, 0, 8 ) / 5);
gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 5,
_SHIFTR( w1, 8, 8 ) / 5,
_SHIFTR( w1, 0, 8 ) / 5);
}
void F3DWRUS_Tri2( u32 w0, u32 w1 )
{
gSP2Triangles( _SHIFTR( w0, 16, 8 ) / 5, _SHIFTR( w0, 8, 8 ) / 5, _SHIFTR( w0, 0, 8 ) / 5, 0,
_SHIFTR( w1, 16, 8 ) / 5, _SHIFTR( w1, 8, 8 ) / 5, _SHIFTR( w1, 0, 8 ) / 5, 0);
gSP2Triangles( _SHIFTR( w0, 16, 8 ) / 5, _SHIFTR( w0, 8, 8 ) / 5, _SHIFTR( w0, 0, 8 ) / 5, 0,
_SHIFTR( w1, 16, 8 ) / 5, _SHIFTR( w1, 8, 8 ) / 5, _SHIFTR( w1, 0, 8 ) / 5, 0);
}
void F3DWRUS_Quad( u32 w0, u32 w1 )
{
gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 5, _SHIFTR( w1, 16, 8 ) / 5, _SHIFTR( w1, 8, 8 ) / 5, _SHIFTR( w1, 0, 8 ) / 5 );
gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 5, _SHIFTR( w1, 16, 8 ) / 5, _SHIFTR( w1, 8, 8 ) / 5, _SHIFTR( w1, 0, 8 ) / 5 );
}
void F3DWRUS_Init()
void F3DWRUS_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3D );
// Set GeometryMode flags
GBI_InitFlags( F3D );
GBI.PCStackSize = 10;
GBI.PCStackSize = 10;
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3DWRUS_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3DWRUS_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
GBI_SetGBI( G_TRI1, F3D_TRI1, F3DWRUS_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3DWRUS_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
GBI_SetGBI( G_TRI2, F3DWRUS_TRI2, F3DWRUS_Tri2 );
GBI_SetGBI( G_TRI1, F3D_TRI1, F3DWRUS_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_QUAD, F3D_QUAD, F3DWRUS_Quad );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
GBI_SetGBI( G_TRI2, F3DWRUS_TRI2, F3DWRUS_Tri2 );
}
+1 -1
View File
@@ -6,7 +6,7 @@ extern "C" {
#endif
#define F3DWRUS_TRI2 0xB1
void F3DWRUS_Init();
void F3DWRUS_Init(void);
#ifdef __cplusplus
}
+161 -166
View File
@@ -102,12 +102,12 @@ void GBI_Unknown( u32 w0, u32 w1 )
{
}
static int MicrocodeDialog()
static int MicrocodeDialog(void)
{
return 0;
}
MicrocodeInfo *GBI_AddMicrocode()
MicrocodeInfo *GBI_AddMicrocode(void)
{
MicrocodeInfo *newtop = (MicrocodeInfo*)malloc( sizeof( MicrocodeInfo ) );
@@ -128,210 +128,205 @@ MicrocodeInfo *GBI_AddMicrocode()
return newtop;
}
void GBI_Init()
void GBI_Init(void)
{
u32 i;
GBI.top = NULL;
GBI.bottom = NULL;
GBI.current = NULL;
GBI.numMicrocodes = 0;
GBI.top = NULL;
GBI.bottom = NULL;
GBI.current = NULL;
GBI.numMicrocodes = 0;
for (i = 0; i <= 0xFF; i++)
GBI.cmd[i] = GBI_Unknown;
for (i = 0; i <= 0xFF; i++)
GBI.cmd[i] = GBI_Unknown;
}
void GBI_Destroy()
void GBI_Destroy(void)
{
while (GBI.bottom)
{
MicrocodeInfo *newBottom = GBI.bottom->higher;
while (GBI.bottom)
{
MicrocodeInfo *newBottom = GBI.bottom->higher;
if (GBI.bottom == GBI.top)
GBI.top = NULL;
if (GBI.bottom == GBI.top)
GBI.top = NULL;
free( GBI.bottom );
free( GBI.bottom );
GBI.bottom = newBottom;
GBI.bottom = newBottom;
if (GBI.bottom)
GBI.bottom->lower = NULL;
if (GBI.bottom)
GBI.bottom->lower = NULL;
GBI.numMicrocodes--;
}
GBI.numMicrocodes--;
}
}
MicrocodeInfo *GBI_DetectMicrocode( u32 uc_start, u32 uc_dstart, u16 uc_dsize )
{
int i;
MicrocodeInfo *current;
MicrocodeInfo *current;
for (i = 0; i < GBI.numMicrocodes; i++)
{
current = GBI.top;
for (i = 0; i < GBI.numMicrocodes; i++)
{
current = GBI.top;
while (current)
{
if ((current->address == uc_start) && (current->dataAddress == uc_dstart) && (current->dataSize == uc_dsize))
return current;
current = current->lower;
}
}
current = GBI_AddMicrocode();
current->address = uc_start;
current->dataAddress = uc_dstart;
current->dataSize = uc_dsize;
current->NoN = FALSE;
current->type = NONE;
// See if we can identify it by CRC
uc_crc = CRC_Calculate( 0xFFFFFFFF, &RDRAM[uc_start & 0x1FFFFFFF], 4096);
LOG(LOG_MINIMAL, "UCODE CRC=0x%x\n", uc_crc);
for (i = 0; i < sizeof( specialMicrocodes ) / sizeof( SpecialMicrocodeInfo ); i++)
{
if (uc_crc == specialMicrocodes[i].crc)
{
current->type = specialMicrocodes[i].type;
while (current)
{
if ((current->address == uc_start) && (current->dataAddress == uc_dstart) && (current->dataSize == uc_dsize))
return current;
}
}
// See if we can identify it by text
char uc_data[2048];
UnswapCopy( &RDRAM[uc_dstart & 0x1FFFFFFF], uc_data, 2048 );
strcpy( uc_str, "Not Found" );
current = current->lower;
}
}
for (i = 0; i < 2048; i++)
{
if ((uc_data[i] == 'R') && (uc_data[i+1] == 'S') && (uc_data[i+2] == 'P'))
{
u32 j = 0;
while (uc_data[i+j] > 0x0A)
current = GBI_AddMicrocode();
current->address = uc_start;
current->dataAddress = uc_dstart;
current->dataSize = uc_dsize;
current->NoN = FALSE;
current->type = NONE;
// See if we can identify it by CRC
uc_crc = CRC_Calculate( 0xFFFFFFFF, &RDRAM[uc_start & 0x1FFFFFFF], 4096);
LOG(LOG_MINIMAL, "UCODE CRC=0x%x\n", uc_crc);
for (i = 0; i < sizeof( specialMicrocodes ) / sizeof( SpecialMicrocodeInfo ); i++)
{
if (uc_crc == specialMicrocodes[i].crc)
{
current->type = specialMicrocodes[i].type;
return current;
}
}
// See if we can identify it by text
char uc_data[2048];
UnswapCopy( &RDRAM[uc_dstart & 0x1FFFFFFF], uc_data, 2048 );
strcpy( uc_str, "Not Found" );
for (i = 0; i < 2048; i++)
{
if ((uc_data[i] == 'R') && (uc_data[i+1] == 'S') && (uc_data[i+2] == 'P'))
{
u32 j = 0;
while (uc_data[i+j] > 0x0A)
{
uc_str[j] = uc_data[i+j];
j++;
}
uc_str[j] = 0x00;
int type = NONE;
if (strncmp( &uc_str[4], "SW", 2 ) == 0)
{
type = F3D;
}
else if (strncmp( &uc_str[4], "Gfx", 3 ) == 0)
{
current->NoN = (strncmp( &uc_str[20], ".NoN", 4 ) == 0);
if (strncmp( &uc_str[14], "F3D", 3 ) == 0)
{
uc_str[j] = uc_data[i+j];
j++;
if (uc_str[28] == '1')
type = F3DEX;
else if (uc_str[31] == '2')
type = F3DEX2;
}
uc_str[j] = 0x00;
int type = NONE;
if (strncmp( &uc_str[4], "SW", 2 ) == 0)
else if (strncmp( &uc_str[14], "L3D", 3 ) == 0)
{
type = F3D;
if (uc_str[28] == '1')
type = L3DEX;
else if (uc_str[31] == '2')
type = L3DEX2;
}
else if (strncmp( &uc_str[4], "Gfx", 3 ) == 0)
else if (strncmp( &uc_str[14], "S2D", 3 ) == 0)
{
current->NoN = (strncmp( &uc_str[20], ".NoN", 4 ) == 0);
if (strncmp( &uc_str[14], "F3D", 3 ) == 0)
{
if (uc_str[28] == '1')
type = F3DEX;
else if (uc_str[31] == '2')
type = F3DEX2;
}
else if (strncmp( &uc_str[14], "L3D", 3 ) == 0)
{
if (uc_str[28] == '1')
type = L3DEX;
else if (uc_str[31] == '2')
type = L3DEX2;
}
else if (strncmp( &uc_str[14], "S2D", 3 ) == 0)
{
if (uc_str[28] == '1')
type = S2DEX;
else if (uc_str[31] == '2')
type = S2DEX2;
}
if (uc_str[28] == '1')
type = S2DEX;
else if (uc_str[31] == '2')
type = S2DEX2;
}
}
LOG(LOG_VERBOSE, "UCODE STRING=%s\n", uc_str);
LOG(LOG_VERBOSE, "UCODE STRING=%s\n", uc_str);
if (type != NONE)
{
current->type = type;
return current;
}
break;
}
}
for (i = 0; i < sizeof( specialMicrocodes ) / sizeof( SpecialMicrocodeInfo ); i++)
{
if (strcmp( uc_str, specialMicrocodes[i].text ) == 0)
{
current->type = specialMicrocodes[i].type;
if (type != NONE)
{
current->type = type;
return current;
}
}
}
// Let the user choose the microcode
LOG(LOG_ERROR, "[gles2n64]: Warning - unknown ucode!!!\n");
if(last_good_ucode != (u32)-1)
{
current->type=last_good_ucode;
}
else
{
current->type = MicrocodeDialog();
}
return current;
break;
}
}
for (i = 0; i < sizeof( specialMicrocodes ) / sizeof( SpecialMicrocodeInfo ); i++)
{
if (strcmp( uc_str, specialMicrocodes[i].text ) == 0)
{
current->type = specialMicrocodes[i].type;
return current;
}
}
// Let the user choose the microcode
LOG(LOG_ERROR, "[gles2n64]: Warning - unknown ucode!!!\n");
if(last_good_ucode != (u32)-1)
current->type=last_good_ucode;
else
current->type = MicrocodeDialog();
return current;
}
void GBI_MakeCurrent( MicrocodeInfo *current )
{
int i;
if (current != GBI.top)
{
if (current == GBI.bottom)
{
GBI.bottom = current->higher;
GBI.bottom->lower = NULL;
}
else
{
current->higher->lower = current->lower;
current->lower->higher = current->higher;
}
if (current != GBI.top)
{
if (current == GBI.bottom)
{
GBI.bottom = current->higher;
GBI.bottom->lower = NULL;
}
else
{
current->higher->lower = current->lower;
current->lower->higher = current->higher;
}
current->higher = NULL;
current->lower = GBI.top;
GBI.top->higher = current;
GBI.top = current;
}
current->higher = NULL;
current->lower = GBI.top;
GBI.top->higher = current;
GBI.top = current;
}
if (!GBI.current || (GBI.current->type != current->type))
{
if (!GBI.current || (GBI.current->type != current->type))
{
for (i = 0; i <= 0xFF; i++)
GBI.cmd[i] = GBI_Unknown;
for (i = 0; i <= 0xFF; i++)
GBI.cmd[i] = GBI_Unknown;
RDP_Init();
switch (current->type)
{
case F3D: F3D_Init(); break;
case F3DEX: F3DEX_Init(); break;
case F3DEX2: F3DEX2_Init(); break;
case L3D: L3D_Init(); break;
case L3DEX: L3DEX_Init(); break;
case L3DEX2: L3DEX2_Init(); break;
case S2DEX: S2DEX_Init(); break;
case S2DEX2: S2DEX2_Init(); break;
case F3DDKR: F3DDKR_Init(); break;
case F3DWRUS: F3DWRUS_Init(); break;
case F3DPD: F3DPD_Init(); break;
case F3DCBFD: F3DCBFD_Init(); break;
}
}
RDP_Init();
switch (current->type)
{
case F3D: F3D_Init(); break;
case F3DEX: F3DEX_Init(); break;
case F3DEX2: F3DEX2_Init(); break;
case L3D: L3D_Init(); break;
case L3DEX: L3DEX_Init(); break;
case L3DEX2: L3DEX2_Init(); break;
case S2DEX: S2DEX_Init(); break;
case S2DEX2: S2DEX2_Init(); break;
case F3DDKR: F3DDKR_Init(); break;
case F3DWRUS: F3DWRUS_Init(); break;
case F3DPD: F3DPD_Init(); break;
case F3DCBFD: F3DCBFD_Init(); break;
}
}
GBI.current = current;
GBI.current = current;
}
+2 -2
View File
@@ -764,8 +764,8 @@ extern GBIInfo GBI;
void GBI_MakeCurrent( MicrocodeInfo *current );
MicrocodeInfo *GBI_DetectMicrocode( u32 uc_start, u32 uc_dstart, u16 uc_dsize );
extern u32 last_good_ucode;
void GBI_Init();
void GBI_Destroy();
void GBI_Init(void);
void GBI_Destroy(void);
// Allows easier setting of GBI commands
#define GBI_SetGBI( command, value, function ) \
+35 -35
View File
@@ -11,47 +11,47 @@
void L3D_Line3D( u32 w0, u32 w1 )
{
u32 wd = _SHIFTR( w1, 0, 8 );
u32 wd = _SHIFTR( w1, 0, 8 );
if (wd == 0)
gSPLine3D( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 24, 8 ) );
else
gSPLineW3D( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, wd, _SHIFTR( w1, 24, 8 ) );
if (wd == 0)
gSPLine3D( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 24, 8 ) );
else
gSPLineW3D( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, wd, _SHIFTR( w1, 24, 8 ) );
}
void L3D_Init()
void L3D_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3D );
// Set GeometryMode flags
GBI_InitFlags( F3D );
GBI.PCStackSize = 10;
GBI.PCStackSize = 10;
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3D_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_VTX, F3D_VTX, F3D_Vtx );
GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
// GBI_SetGBI( G_TRI1, F3D_TRI1, F3D_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_LINE3D, L3D_LINE3D, L3D_Line3D );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
// GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
// GBI_SetGBI( G_TRI1, F3D_TRI1, F3D_Tri1 );
GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
GBI_SetGBI( G_LINE3D, L3D_LINE3D, L3D_Line3D );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
// GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
}
+1 -1
View File
@@ -10,7 +10,7 @@ extern "C" {
#define L3D_LINE3D 0xB5
void L3D_Line3D( u32 w0, u32 w1 );
void L3D_Init();
void L3D_Init(void);
#ifdef __cplusplus
}
+1 -1
View File
@@ -8,7 +8,7 @@ extern "C" {
#include "Types.h"
void L3DEX_Line3D( u32 w0, u32 w1 );
void L3DEX_Init();
void L3DEX_Init(void);
#ifdef __cplusplus
}
+37 -38
View File
@@ -13,49 +13,48 @@
void L3DEX2_Line3D( u32 w0, u32 w1 )
{
u32 wd = _SHIFTR( w0, 0, 8 );
u32 wd = _SHIFTR( w0, 0, 8 );
if (wd == 0)
gSPLine3D( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), 0 );
else
gSPLineW3D( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), wd, 0 );
if (wd == 0)
gSPLine3D( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), 0 );
else
gSPLineW3D( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), wd, 0 );
}
void L3DEX2_Init()
void L3DEX2_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3DEX2 );
// Set GeometryMode flags
GBI_InitFlags( F3DEX2 );
GBI.PCStackSize = 18;
GBI.PCStackSize = 18;
// GBI Command Command Value Command Function
// GBI_SetGBI( G_BG_COPY, 0x0A, S2DEX_BG_Copy );
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DEX2_MoveMem );
GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord );
GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx );
GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode );
GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx );
GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture );
GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO );
GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 );
GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 );
GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 );
// GBI Command Command Value Command Function
// GBI_SetGBI( G_BG_COPY, 0x0A, S2DEX_BG_Copy );
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DEX2_MoveMem );
GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord );
GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx );
GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode );
GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx );
GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture );
GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO );
GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 );
GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 );
GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 );
GBI_SetGBI( G_VTX, F3DEX2_VTX, F3DEX2_Vtx );
GBI_SetGBI( G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx );
GBI_SetGBI( G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL );
GBI_SetGBI( G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX_Branch_Z );
// GBI_SetGBI( G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1 );
// GBI_SetGBI( G_TRI2, F3DEX2_TRI2, F3DEX_Tri2 );
// GBI_SetGBI( G_QUAD, F3DEX2_QUAD, F3DEX2_Quad );
GBI_SetGBI( G_LINE3D, L3DEX2_LINE3D, L3DEX2_Line3D );
GBI_SetGBI( G_VTX, F3DEX2_VTX, F3DEX2_Vtx );
GBI_SetGBI( G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx );
GBI_SetGBI( G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL );
GBI_SetGBI( G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX_Branch_Z );
// GBI_SetGBI( G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1 );
// GBI_SetGBI( G_TRI2, F3DEX2_TRI2, F3DEX_Tri2 );
// GBI_SetGBI( G_QUAD, F3DEX2_QUAD, F3DEX2_Quad );
GBI_SetGBI( G_LINE3D, L3DEX2_LINE3D, L3DEX2_Line3D );
}
+630 -634
View File
File diff suppressed because it is too large. Load diff
+74 -75
View File
@@ -20,106 +20,105 @@ RSPInfo RSP;
void RSP_LoadMatrix( f32 mtx[4][4], u32 address )
{
int i, j;
f32 recip = 1.5258789e-05f;
f32 recip = 1.5258789e-05f;
struct _N64Matrix
{
s16 integer[4][4];
u16 fraction[4][4];
} *n64Mat = (struct _N64Matrix *)&RDRAM[address];
struct _N64Matrix
{
s16 integer[4][4];
u16 fraction[4][4];
} *n64Mat = (struct _N64Matrix *)&RDRAM[address];
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
mtx[i][j] = (GLfloat)(n64Mat->integer[i][j^1]) + (GLfloat)(n64Mat->fraction[i][j^1]) * recip;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
mtx[i][j] = (GLfloat)(n64Mat->integer[i][j^1]) + (GLfloat)(n64Mat->fraction[i][j^1]) * recip;
}
void RSP_ProcessDList()
void RSP_ProcessDList(void)
{
int i, j;
VI_UpdateSize();
OGL_UpdateScale();
TextureCache_ActivateNoise(2);
VI_UpdateSize();
OGL_UpdateScale();
TextureCache_ActivateNoise(2);
RSP.PC[0] = *(u32*)&DMEM[0x0FF0];
RSP.PCi = 0;
RSP.count = 0;
RSP.PC[0] = *(u32*)&DMEM[0x0FF0];
RSP.PCi = 0;
RSP.count = 0;
RSP.halt = FALSE;
RSP.busy = TRUE;
RSP.halt = FALSE;
RSP.busy = TRUE;
gSP.matrix.stackSize = min( 32, *(u32*)&DMEM[0x0FE4] >> 6 );
gSP.matrix.modelViewi = 0;
gSP.changed |= CHANGED_MATRIX;
gSP.matrix.stackSize = min( 32, *(u32*)&DMEM[0x0FE4] >> 6 );
gSP.matrix.modelViewi = 0;
gSP.changed |= CHANGED_MATRIX;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
gSP.matrix.modelView[0][i][j] = 0.0f;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
gSP.matrix.modelView[0][i][j] = 0.0f;
gSP.matrix.modelView[0][0][0] = 1.0f;
gSP.matrix.modelView[0][1][1] = 1.0f;
gSP.matrix.modelView[0][2][2] = 1.0f;
gSP.matrix.modelView[0][3][3] = 1.0f;
gSP.matrix.modelView[0][0][0] = 1.0f;
gSP.matrix.modelView[0][1][1] = 1.0f;
gSP.matrix.modelView[0][2][2] = 1.0f;
gSP.matrix.modelView[0][3][3] = 1.0f;
u32 uc_start = *(u32*)&DMEM[0x0FD0];
u32 uc_dstart = *(u32*)&DMEM[0x0FD8];
u32 uc_dsize = *(u32*)&DMEM[0x0FDC];
u32 uc_start = *(u32*)&DMEM[0x0FD0];
u32 uc_dstart = *(u32*)&DMEM[0x0FD8];
u32 uc_dsize = *(u32*)&DMEM[0x0FDC];
if ((uc_start != RSP.uc_start) || (uc_dstart != RSP.uc_dstart))
gSPLoadUcodeEx( uc_start, uc_dstart, uc_dsize );
if ((uc_start != RSP.uc_start) || (uc_dstart != RSP.uc_dstart))
gSPLoadUcodeEx( uc_start, uc_dstart, uc_dsize );
gDPSetAlphaCompare(G_AC_NONE);
gDPSetDepthSource(G_ZS_PIXEL);
gDPSetRenderMode(0, 0);
gDPSetAlphaDither(G_AD_DISABLE);
gDPSetColorDither(G_CD_DISABLE);
gDPSetCombineKey(G_CK_NONE);
gDPSetTextureConvert(G_TC_FILT);
gDPSetTextureFilter(G_TF_POINT);
gDPSetTextureLUT(G_TT_NONE);
gDPSetTextureLOD(G_TL_TILE);
gDPSetTextureDetail(G_TD_CLAMP);
gDPSetTexturePersp(G_TP_PERSP);
gDPSetCycleType(G_CYC_1CYCLE);
gDPPipelineMode(G_PM_NPRIMITIVE);
gDPSetAlphaCompare(G_AC_NONE);
gDPSetDepthSource(G_ZS_PIXEL);
gDPSetRenderMode(0, 0);
gDPSetAlphaDither(G_AD_DISABLE);
gDPSetColorDither(G_CD_DISABLE);
gDPSetCombineKey(G_CK_NONE);
gDPSetTextureConvert(G_TC_FILT);
gDPSetTextureFilter(G_TF_POINT);
gDPSetTextureLUT(G_TT_NONE);
gDPSetTextureLOD(G_TL_TILE);
gDPSetTextureDetail(G_TD_CLAMP);
gDPSetTexturePersp(G_TP_PERSP);
gDPSetCycleType(G_CYC_1CYCLE);
gDPPipelineMode(G_PM_NPRIMITIVE);
while (!RSP.halt)
{
u32 pc = RSP.PC[RSP.PCi];
while (!RSP.halt)
{
u32 pc = RSP.PC[RSP.PCi];
if ((pc + 8) > RDRAMSize)
{
if ((pc + 8) > RDRAMSize)
{
#ifdef DEBUG
DebugMsg( DEBUG_LOW | DEBUG_ERROR, "ATTEMPTING TO EXECUTE RSP COMMAND AT INVALID RDRAM LOCATION\n" );
DebugMsg( DEBUG_LOW | DEBUG_ERROR, "ATTEMPTING TO EXECUTE RSP COMMAND AT INVALID RDRAM LOCATION\n" );
#endif
break;
}
break;
}
u32 w0 = *(u32*)&RDRAM[pc];
u32 w1 = *(u32*)&RDRAM[pc+4];
RSP.nextCmd = _SHIFTR( *(u32*)&RDRAM[pc+8], 24, 8 );
RSP.cmd = _SHIFTR( w0, 24, 8 );
RSP.PC[RSP.PCi] += 8;
u32 w0 = *(u32*)&RDRAM[pc];
u32 w1 = *(u32*)&RDRAM[pc+4];
RSP.nextCmd = _SHIFTR( *(u32*)&RDRAM[pc+8], 24, 8 );
RSP.cmd = _SHIFTR( w0, 24, 8 );
RSP.PC[RSP.PCi] += 8;
GBI.cmd[RSP.cmd]( w0, w1 );
GBI.cmd[RSP.cmd]( w0, w1 );
}
}
RSP.busy = FALSE;
RSP.DList++;
gSP.changed |= CHANGED_COLORBUFFER;
RSP.busy = FALSE;
RSP.DList++;
gSP.changed |= CHANGED_COLORBUFFER;
}
void RSP_Init()
void RSP_Init(void)
{
RDRAMSize = 1024 * 1024 * 8;
RSP.DList = 0;
RSP.uc_start = RSP.uc_dstart = 0;
gDP.loadTile = &gDP.tiles[7];
gSP.textureTile[0] = &gDP.tiles[0];
gSP.textureTile[1] = &gDP.tiles[1];
RDRAMSize = 1024 * 1024 * 8;
RSP.DList = 0;
RSP.uc_start = RSP.uc_dstart = 0;
gDP.loadTile = &gDP.tiles[7];
gSP.textureTile[0] = &gDP.tiles[0];
gSP.textureTile[1] = &gDP.tiles[1];
DepthBuffer_Init();
GBI_Init();
DepthBuffer_Init();
GBI_Init();
}
+2 -2
View File
@@ -26,8 +26,8 @@ extern RSPInfo RSP;
#define RSP_SegmentToPhysical( segaddr ) ((gSP.segment[(segaddr >> 24) & 0x0F] + (segaddr & 0x00FFFFFF)) & 0x00FFFFFF)
void RSP_Init();
void RSP_ProcessDList();
void RSP_Init(void);
void RSP_ProcessDList(void);
void RSP_LoadMatrix( f32 mtx[4][4], u32 address );
#ifdef __cplusplus
+38 -39
View File
@@ -10,30 +10,30 @@
void S2DEX_BG_1Cyc( u32 w0, u32 w1 )
{
gSPBgRect1Cyc( w1 );
gSPBgRect1Cyc( w1 );
}
void S2DEX_BG_Copy( u32 w0, u32 w1 )
{
gSPBgRectCopy( w1 );
gSPBgRectCopy( w1 );
}
void S2DEX_Obj_Rectangle( u32 w0, u32 w1 )
{
gSPObjRectangle( w1 );
gSPObjRectangle( w1 );
}
void S2DEX_Obj_Sprite( u32 w0, u32 w1 )
{
gSPObjSprite( w1 );
gSPObjSprite( w1 );
}
void S2DEX_Obj_MoveMem( u32 w0, u32 w1 )
{
if (_SHIFTR( w0, 0, 16 ) == 0)
gSPObjMatrix( w1 );
else
gSPObjSubMatrix( w1 );
if (_SHIFTR( w0, 0, 16 ) == 0)
gSPObjMatrix( w1 );
else
gSPObjSubMatrix( w1 );
}
void S2DEX_Select_DL( u32 w0, u32 w1 )
@@ -50,12 +50,12 @@ void S2DEX_Obj_Rectangle_R( u32 w0, u32 w1 )
void S2DEX_Obj_LoadTxtr( u32 w0, u32 w1 )
{
gSPObjLoadTxtr( w1 );
gSPObjLoadTxtr( w1 );
}
void S2DEX_Obj_LdTx_Sprite( u32 w0, u32 w1 )
{
gSPObjLoadTxSprite( w1 );
gSPObjLoadTxSprite( w1 );
}
void S2DEX_Obj_LdTx_Rect( u32 w0, u32 w1 )
@@ -64,39 +64,38 @@ void S2DEX_Obj_LdTx_Rect( u32 w0, u32 w1 )
void S2DEX_Obj_LdTx_Rect_R( u32 w0, u32 w1 )
{
gSPObjLoadTxRectR( w1 );
gSPObjLoadTxRectR( w1 );
}
void S2DEX_Init()
void S2DEX_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3DEX );
// Set GeometryMode flags
GBI_InitFlags( F3DEX );
gSP.geometryMode = 0;
gSP.geometryMode = 0;
GBI.PCStackSize = 18;
GBI.PCStackSize = 18;
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_BG_1CYC, S2DEX_BG_1CYC, S2DEX_BG_1Cyc );
GBI_SetGBI( G_BG_COPY, S2DEX_BG_COPY, S2DEX_BG_Copy );
GBI_SetGBI( G_OBJ_RECTANGLE, S2DEX_OBJ_RECTANGLE, S2DEX_Obj_Rectangle );
GBI_SetGBI( G_OBJ_SPRITE, S2DEX_OBJ_SPRITE, S2DEX_Obj_Sprite );
GBI_SetGBI( G_OBJ_MOVEMEM, S2DEX_OBJ_MOVEMEM, S2DEX_Obj_MoveMem );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_SELECT_DL, S2DEX_SELECT_DL, S2DEX_Select_DL );
GBI_SetGBI( G_OBJ_RENDERMODE, S2DEX_OBJ_RENDERMODE, S2DEX_Obj_RenderMode );
GBI_SetGBI( G_OBJ_RECTANGLE_R, S2DEX_OBJ_RECTANGLE_R, S2DEX_Obj_Rectangle_R );
GBI_SetGBI( G_OBJ_LOADTXTR, S2DEX_OBJ_LOADTXTR, S2DEX_Obj_LoadTxtr );
GBI_SetGBI( G_OBJ_LDTX_SPRITE, S2DEX_OBJ_LDTX_SPRITE, S2DEX_Obj_LdTx_Sprite );
GBI_SetGBI( G_OBJ_LDTX_RECT, S2DEX_OBJ_LDTX_RECT, S2DEX_Obj_LdTx_Rect );
GBI_SetGBI( G_OBJ_LDTX_RECT_R, S2DEX_OBJ_LDTX_RECT_R, S2DEX_Obj_LdTx_Rect_R );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_LOAD_UCODE, S2DEX_LOAD_UCODE, F3DEX_Load_uCode );
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_BG_1CYC, S2DEX_BG_1CYC, S2DEX_BG_1Cyc );
GBI_SetGBI( G_BG_COPY, S2DEX_BG_COPY, S2DEX_BG_Copy );
GBI_SetGBI( G_OBJ_RECTANGLE, S2DEX_OBJ_RECTANGLE, S2DEX_Obj_Rectangle );
GBI_SetGBI( G_OBJ_SPRITE, S2DEX_OBJ_SPRITE, S2DEX_Obj_Sprite );
GBI_SetGBI( G_OBJ_MOVEMEM, S2DEX_OBJ_MOVEMEM, S2DEX_Obj_MoveMem );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
GBI_SetGBI( G_SELECT_DL, S2DEX_SELECT_DL, S2DEX_Select_DL );
GBI_SetGBI( G_OBJ_RENDERMODE, S2DEX_OBJ_RENDERMODE, S2DEX_Obj_RenderMode );
GBI_SetGBI( G_OBJ_RECTANGLE_R, S2DEX_OBJ_RECTANGLE_R, S2DEX_Obj_Rectangle_R );
GBI_SetGBI( G_OBJ_LOADTXTR, S2DEX_OBJ_LOADTXTR, S2DEX_Obj_LoadTxtr );
GBI_SetGBI( G_OBJ_LDTX_SPRITE, S2DEX_OBJ_LDTX_SPRITE, S2DEX_Obj_LdTx_Sprite );
GBI_SetGBI( G_OBJ_LDTX_RECT, S2DEX_OBJ_LDTX_RECT, S2DEX_Obj_LdTx_Rect );
GBI_SetGBI( G_OBJ_LDTX_RECT_R, S2DEX_OBJ_LDTX_RECT_R, S2DEX_Obj_LdTx_Rect_R );
GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_LOAD_UCODE, S2DEX_LOAD_UCODE, F3DEX_Load_uCode );
}
+27 -28
View File
@@ -10,36 +10,35 @@
#include "RSP.h"
#include "Types.h"
void S2DEX2_Init()
void S2DEX2_Init(void)
{
// Set GeometryMode flags
GBI_InitFlags( F3DEX2 );
// Set GeometryMode flags
GBI_InitFlags( F3DEX2 );
gSP.geometryMode = 0;
gSP.geometryMode = 0;
GBI.PCStackSize = 18;
GBI.PCStackSize = 18;
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_BG_1CYC, S2DEX2_BG_1CYC, S2DEX_BG_1Cyc );
GBI_SetGBI( G_BG_COPY, S2DEX2_BG_COPY, S2DEX_BG_Copy );
GBI_SetGBI( G_OBJ_RECTANGLE, S2DEX2_OBJ_RECTANGLE, S2DEX_Obj_Rectangle );
GBI_SetGBI( G_OBJ_SPRITE, S2DEX2_OBJ_SPRITE, S2DEX_Obj_Sprite );
GBI_SetGBI( G_OBJ_MOVEMEM, S2DEX2_OBJ_MOVEMEM, S2DEX_Obj_MoveMem );
GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
GBI_SetGBI( G_SELECT_DL, S2DEX2_SELECT_DL, S2DEX_Select_DL );
GBI_SetGBI( G_OBJ_RENDERMODE, S2DEX2_OBJ_RENDERMODE, S2DEX_Obj_RenderMode );
GBI_SetGBI( G_OBJ_RECTANGLE_R, S2DEX2_OBJ_RECTANGLE_R, S2DEX_Obj_Rectangle_R );
GBI_SetGBI( G_OBJ_LOADTXTR, S2DEX2_OBJ_LOADTXTR, S2DEX_Obj_LoadTxtr );
GBI_SetGBI( G_OBJ_LDTX_SPRITE, S2DEX2_OBJ_LDTX_SPRITE, S2DEX_Obj_LdTx_Sprite );
GBI_SetGBI( G_OBJ_LDTX_RECT, S2DEX2_OBJ_LDTX_RECT, S2DEX_Obj_LdTx_Rect );
GBI_SetGBI( G_OBJ_LDTX_RECT_R, S2DEX2_OBJ_LDTX_RECT_R, S2DEX_Obj_LdTx_Rect_R );
GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord );
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_BG_1CYC, S2DEX2_BG_1CYC, S2DEX_BG_1Cyc );
GBI_SetGBI( G_BG_COPY, S2DEX2_BG_COPY, S2DEX_BG_Copy );
GBI_SetGBI( G_OBJ_RECTANGLE, S2DEX2_OBJ_RECTANGLE, S2DEX_Obj_Rectangle );
GBI_SetGBI( G_OBJ_SPRITE, S2DEX2_OBJ_SPRITE, S2DEX_Obj_Sprite );
GBI_SetGBI( G_OBJ_MOVEMEM, S2DEX2_OBJ_MOVEMEM, S2DEX_Obj_MoveMem );
GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList );
GBI_SetGBI( G_SELECT_DL, S2DEX2_SELECT_DL, S2DEX_Select_DL );
GBI_SetGBI( G_OBJ_RENDERMODE, S2DEX2_OBJ_RENDERMODE, S2DEX_Obj_RenderMode );
GBI_SetGBI( G_OBJ_RECTANGLE_R, S2DEX2_OBJ_RECTANGLE_R, S2DEX_Obj_Rectangle_R );
GBI_SetGBI( G_OBJ_LOADTXTR, S2DEX2_OBJ_LOADTXTR, S2DEX_Obj_LoadTxtr );
GBI_SetGBI( G_OBJ_LDTX_SPRITE, S2DEX2_OBJ_LDTX_SPRITE, S2DEX_Obj_LdTx_Sprite );
GBI_SetGBI( G_OBJ_LDTX_RECT, S2DEX2_OBJ_LDTX_RECT, S2DEX_Obj_LdTx_Rect );
GBI_SetGBI( G_OBJ_LDTX_RECT_R, S2DEX2_OBJ_LDTX_RECT_R, S2DEX_Obj_LdTx_Rect_R );
GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord );
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );
}
+1 -1
View File
@@ -5,7 +5,7 @@
extern "C" {
#endif
void S2DEX2_Init();
void S2DEX2_Init(void);
#define S2DEX2_OBJ_RECTANGLE_R 0xDA
#define S2DEX2_OBJ_MOVEMEM 0xDC
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -214,8 +214,8 @@ extern ShaderProgram *scProgramCurrent;
extern int scProgramChanged;
extern int scProgramCount;
extern void ShaderCombiner_Init();
extern void ShaderCombiner_Destroy();
extern void ShaderCombiner_Init(void);
extern void ShaderCombiner_Destroy(void);
extern void ShaderCombiner_DeleteProgram(ShaderProgram *prog);
extern void ShaderCombiner_Set(u64 mux, int flags);
extern ShaderProgram *ShaderCombiner_Compile(DecodedMux *dmux, int flags);
+765 -779
View File
File diff suppressed because it is too large. Load diff
+65 -69
View File
@@ -12,90 +12,86 @@
VIInfo VI;
void VI_UpdateSize()
void VI_UpdateSize(void)
{
if (!config.video.force)
{
f32 xScale = _FIXED2FLOAT( _SHIFTR( *REG.VI_X_SCALE, 0, 12 ), 10 );
f32 xOffset = _FIXED2FLOAT( _SHIFTR( *REG.VI_X_SCALE, 16, 12 ), 10 );
if (!config.video.force)
{
f32 xScale = _FIXED2FLOAT( _SHIFTR( *REG.VI_X_SCALE, 0, 12 ), 10 );
f32 xOffset = _FIXED2FLOAT( _SHIFTR( *REG.VI_X_SCALE, 16, 12 ), 10 );
f32 yScale = _FIXED2FLOAT( _SHIFTR( *REG.VI_Y_SCALE, 0, 12 ), 10 );
f32 yOffset = _FIXED2FLOAT( _SHIFTR( *REG.VI_Y_SCALE, 16, 12 ), 10 );
f32 yScale = _FIXED2FLOAT( _SHIFTR( *REG.VI_Y_SCALE, 0, 12 ), 10 );
f32 yOffset = _FIXED2FLOAT( _SHIFTR( *REG.VI_Y_SCALE, 16, 12 ), 10 );
u32 hEnd = _SHIFTR( *REG.VI_H_START, 0, 10 );
u32 hStart = _SHIFTR( *REG.VI_H_START, 16, 10 );
u32 hEnd = _SHIFTR( *REG.VI_H_START, 0, 10 );
u32 hStart = _SHIFTR( *REG.VI_H_START, 16, 10 );
// These are in half-lines, so shift an extra bit
u32 vEnd = _SHIFTR( *REG.VI_V_START, 1, 9 );
u32 vStart = _SHIFTR( *REG.VI_V_START, 17, 9 );
// These are in half-lines, so shift an extra bit
u32 vEnd = _SHIFTR( *REG.VI_V_START, 1, 9 );
u32 vStart = _SHIFTR( *REG.VI_V_START, 17, 9 );
//Glide does this:
if (hEnd == hStart) hEnd = (u32)(*REG.VI_WIDTH / xScale);
//Glide does this:
if (hEnd == hStart) hEnd = (u32)(*REG.VI_WIDTH / xScale);
VI.width = (hEnd - hStart) * xScale;
VI.height = (vEnd - vStart) * yScale * 1.0126582f;
}
else
{
VI.width = config.video.width;
VI.height = config.video.height;
}
VI.width = (hEnd - hStart) * xScale;
VI.height = (vEnd - vStart) * yScale * 1.0126582f;
}
else
{
VI.width = config.video.width;
VI.height = config.video.height;
}
if (VI.width == 0.0f) VI.width = 320.0f;
if (VI.height == 0.0f) VI.height = 240.0f;
VI.rwidth = 1.0f / VI.width;
VI.rheight = 1.0f / VI.height;
if (VI.width == 0.0f) VI.width = 320.0f;
if (VI.height == 0.0f) VI.height = 240.0f;
VI.rwidth = 1.0f / VI.width;
VI.rheight = 1.0f / VI.height;
//add display buffer if doesn't exist
if (config.ignoreOffscreenRendering)
{
int i;
//int start = *REG.VI_ORIGIN;
u32 start = RSP_SegmentToPhysical(*REG.VI_ORIGIN) & 0x00FFFFFF;
u32 end = min(start + VI.width * VI.height * 4, RDRAMSize);
for(i = 0; i < VI.displayNum; i++)
{
if (VI.display[i].start <= end && VI.display[i].start >= start) break;
if (start <= VI.display[i].end && start >= VI.display[i].start) break;
}
if (i == VI.displayNum)
{
//printf("VI IMAGE=%i\n", o);
VI.display[i%16].start = start;
VI.display[i%16].end = end;
VI.displayNum = (VI.displayNum < 16) ? (VI.displayNum+1) : 16;
}
}
//add display buffer if doesn't exist
if (config.ignoreOffscreenRendering)
{
int i;
//int start = *REG.VI_ORIGIN;
u32 start = RSP_SegmentToPhysical(*REG.VI_ORIGIN) & 0x00FFFFFF;
u32 end = min(start + VI.width * VI.height * 4, RDRAMSize);
for(i = 0; i < VI.displayNum; i++)
{
if (VI.display[i].start <= end && VI.display[i].start >= start) break;
if (start <= VI.display[i].end && start >= VI.display[i].start) break;
}
if (i == VI.displayNum)
{
//printf("VI IMAGE=%i\n", o);
VI.display[i%16].start = start;
VI.display[i%16].end = end;
VI.displayNum = (VI.displayNum < 16) ? (VI.displayNum+1) : 16;
}
}
}
void VI_UpdateScreen()
void VI_UpdateScreen(void)
{
switch(config.updateMode)
{
switch(config.updateMode)
{
case SCREEN_UPDATE_AT_VI_CHANGE:
if (*REG.VI_ORIGIN != VI.lastOrigin)
{
if (*REG.VI_ORIGIN < VI.lastOrigin || *REG.VI_ORIGIN > VI.lastOrigin+0x2000 )
OGL_SwapBuffers();
case SCREEN_UPDATE_AT_VI_CHANGE:
if (*REG.VI_ORIGIN != VI.lastOrigin)
{
if (*REG.VI_ORIGIN < VI.lastOrigin || *REG.VI_ORIGIN > VI.lastOrigin+0x2000 )
OGL_SwapBuffers();
VI.lastOrigin = *REG.VI_ORIGIN;
}
break;
case SCREEN_UPDATE_AT_VI_UPDATE:
if (gSP.changed & CHANGED_COLORBUFFER)
{
OGL_SwapBuffers();
gSP.changed &= ~CHANGED_COLORBUFFER;
}
break;
}
VI.lastOrigin = *REG.VI_ORIGIN;
}
break;
case SCREEN_UPDATE_AT_VI_UPDATE:
if (gSP.changed & CHANGED_COLORBUFFER)
{
OGL_SwapBuffers();
gSP.changed &= ~CHANGED_COLORBUFFER;
}
break;
}
}
+2 -2
View File
@@ -24,8 +24,8 @@ typedef struct
extern VIInfo VI;
void VI_UpdateSize();
void VI_UpdateScreen();
void VI_UpdateSize(void);
void VI_UpdateScreen(void);
#ifdef __cplusplus
}
+115 -116
View File
@@ -85,125 +85,124 @@ static const volatile unsigned char Three2Eight[8] =
static const volatile unsigned char Two2Eight[4] =
{
0, // 00 = 00000000
85, // 01 = 01010101
170, // 10 = 10101010
255 // 11 = 11111111
0, // 00 = 00000000
85, // 01 = 01010101
170, // 10 = 10101010
255 // 11 = 11111111
};
static const volatile unsigned char One2Four[2] =
{
0, // 0 = 0000
15, // 1 = 1111
0, // 0 = 0000
15, // 1 = 1111
};
static const volatile unsigned char One2Eight[2] =
{
0, // 0 = 00000000
255, // 1 = 11111111
0, // 0 = 00000000
255, // 1 = 11111111
};
static INLINE void UnswapCopy( void *src, void *dest, u32 numBytes )
{
int i;
// copy leading bytes
int leadingBytes = ((intptr_t)src) & 3;
if (leadingBytes != 0)
{
leadingBytes = 4-leadingBytes;
if ((unsigned int)leadingBytes > numBytes)
leadingBytes = numBytes;
numBytes -= leadingBytes;
// copy leading bytes
int leadingBytes = ((intptr_t)src) & 3;
if (leadingBytes != 0)
{
leadingBytes = 4-leadingBytes;
if ((unsigned int)leadingBytes > numBytes)
leadingBytes = numBytes;
numBytes -= leadingBytes;
src = (void *)((intptr_t)src ^ 3);
for (i = 0; i < leadingBytes; i++)
{
*(u8 *)(dest) = *(u8 *)(src);
dest = (void *)((intptr_t)dest+1);
src = (void *)((intptr_t)src -1);
}
src = (void *)((intptr_t)src+5);
}
src = (void *)((intptr_t)src ^ 3);
for (i = 0; i < leadingBytes; i++)
{
*(u8 *)(dest) = *(u8 *)(src);
dest = (void *)((intptr_t)dest+1);
src = (void *)((intptr_t)src -1);
}
src = (void *)((intptr_t)src+5);
}
// copy dwords
int numDWords = numBytes >> 2;
while (numDWords--)
{
u32 dword = *(u32 *)src;
// copy dwords
int numDWords = numBytes >> 2;
while (numDWords--)
{
u32 dword = *(u32 *)src;
#if defined(ARM_ASM) && !defined(__QNX__)
/* TODO/FIXME - expected string literal before ')' token with QNX */
__asm("rev %0, %0" : "+r"(dword)::);
/* TODO/FIXME - expected string literal before ')' token with QNX */
__asm("rev %0, %0" : "+r"(dword)::);
#else
dword = ((dword<<24)|((dword<<8)&0x00FF0000)|((dword>>8)&0x0000FF00)|(dword>>24));
dword = ((dword<<24)|((dword<<8)&0x00FF0000)|((dword>>8)&0x0000FF00)|(dword>>24));
#endif
*(u32 *)dest = dword;
dest = (void *)((intptr_t)dest+4);
src = (void *)((intptr_t)src +4);
}
*(u32 *)dest = dword;
dest = (void *)((intptr_t)dest+4);
src = (void *)((intptr_t)src +4);
}
// copy trailing bytes
int trailingBytes = numBytes & 3;
if (trailingBytes)
{
src = (void *)((intptr_t)src ^ 3);
for (i = 0; i < trailingBytes; i++)
{
*(u8 *)(dest) = *(u8 *)(src);
dest = (void *)((intptr_t)dest+1);
src = (void *)((intptr_t)src -1);
}
}
// copy trailing bytes
int trailingBytes = numBytes & 3;
if (trailingBytes)
{
src = (void *)((intptr_t)src ^ 3);
for (i = 0; i < trailingBytes; i++)
{
*(u8 *)(dest) = *(u8 *)(src);
dest = (void *)((intptr_t)dest+1);
src = (void *)((intptr_t)src -1);
}
}
}
static INLINE void DWordInterleave( void *mem, u32 numDWords )
{
int tmp;
while( numDWords-- )
{
tmp = *(int *)((intptr_t)mem + 0);
*(int *)((intptr_t)mem + 0) = *(int *)((intptr_t)mem + 4);
*(int *)((intptr_t)mem + 4) = tmp;
mem = (void *)((intptr_t)mem + 8);
}
int tmp;
while( numDWords-- )
{
tmp = *(int *)((intptr_t)mem + 0);
*(int *)((intptr_t)mem + 0) = *(int *)((intptr_t)mem + 4);
*(int *)((intptr_t)mem + 4) = tmp;
mem = (void *)((intptr_t)mem + 8);
}
}
static INLINE void QWordInterleave( void *mem, u32 numDWords )
{
numDWords >>= 1; // qwords
while( numDWords-- )
{
int tmp0, tmp1;
tmp0 = *(int *)((intptr_t)mem + 0);
tmp1 = *(int *)((intptr_t)mem + 4);
*(int *)((intptr_t)mem + 0) = *(int *)((intptr_t)mem + 8);
*(int *)((intptr_t)mem + 8) = tmp0;
*(int *)((intptr_t)mem + 4) = *(int *)((intptr_t)mem + 12);
*(int *)((intptr_t)mem + 12) = tmp1;
mem = (void *)((intptr_t)mem + 16);
}
numDWords >>= 1; // qwords
while( numDWords-- )
{
int tmp0, tmp1;
tmp0 = *(int *)((intptr_t)mem + 0);
tmp1 = *(int *)((intptr_t)mem + 4);
*(int *)((intptr_t)mem + 0) = *(int *)((intptr_t)mem + 8);
*(int *)((intptr_t)mem + 8) = tmp0;
*(int *)((intptr_t)mem + 4) = *(int *)((intptr_t)mem + 12);
*(int *)((intptr_t)mem + 12) = tmp1;
mem = (void *)((intptr_t)mem + 16);
}
}
static INLINE u32 swapdword( u32 value )
{
#if defined(ARM_ASM) && !defined(__QNX__)
__asm("rev %0, %0" : "+r"(value)::);
return value;
__asm("rev %0, %0" : "+r"(value)::);
return value;
#else
return ((value & 0xff000000) >> 24) |
((value & 0x00ff0000) >> 8) |
((value & 0x0000ff00) << 8) |
((value & 0x000000ff) << 24);
return ((value & 0xff000000) >> 24) |
((value & 0x00ff0000) >> 8) |
((value & 0x0000ff00) << 8) |
((value & 0x000000ff) << 24);
#endif
}
static INLINE u16 swapword( u16 value )
{
#if defined(ARM_ASM) && !defined(__QNX__)
__asm("rev16 %0, %0" : "+r"(value)::);
return value;
__asm("rev16 %0, %0" : "+r"(value)::);
return value;
#else
return (value << 8) | (value >> 8);
return (value << 8) | (value >> 8);
#endif
}
@@ -211,13 +210,13 @@ static INLINE u16 swapword( u16 value )
static INLINE u32 RGBA5551_RGBA8888( u16 color )
{
color = swapword( color );
u8 r, g, b, a;
r = Five2Eight[color >> 11];
g = Five2Eight[(color >> 6) & 0x001f];
b = Five2Eight[(color >> 1) & 0x001f];
a = One2Eight [(color ) & 0x0001];
return (a << 24) | (b << 16) | (g << 8) | r;
color = swapword( color );
u8 r, g, b, a;
r = Five2Eight[color >> 11];
g = Five2Eight[(color >> 6) & 0x001f];
b = Five2Eight[(color >> 1) & 0x001f];
a = One2Eight [(color ) & 0x0001];
return (a << 24) | (b << 16) | (g << 8) | r;
}
// Just swaps the word
@@ -232,85 +231,85 @@ static INLINE u32 IA88_RGBA8888( u16 color )
static INLINE u16 IA88_RGBA4444( u16 color )
{
u8 i = color >> 12;
u8 a = (color >> 4) & 0x000F;
return (i << 12) | (i << 8) | (i << 4) | a;
u8 i = color >> 12;
u8 a = (color >> 4) & 0x000F;
return (i << 12) | (i << 8) | (i << 4) | a;
}
#define IA44_RGBA4444(color) (((color & 0xf0) << 8) | ((color & 0xf0) << 4) | (color))
static INLINE u32 IA44_RGBA8888( u8 color )
{
u8 i = Four2Eight[color >> 4];
u8 a = Four2Eight[color & 0x0F];
return (a << 24) | (i << 16) | (i << 8) | i;
u8 i = Four2Eight[color >> 4];
u8 a = Four2Eight[color & 0x0F];
return (a << 24) | (i << 16) | (i << 8) | i;
}
static INLINE u16 IA44_IA88( u8 color )
{
u8 i = Four2Eight[color >> 4];
u8 a = Four2Eight[color & 0x0F];
return (a << 8) | i;
u8 i = Four2Eight[color >> 4];
u8 a = Four2Eight[color & 0x0F];
return (a << 8) | i;
}
static INLINE u16 IA31_RGBA4444( u8 color )
{
u8 i = Three2Four[color >> 1];
u8 a = One2Four[color & 0x01];
return (i << 12) | (i << 8) | (i << 4) | a;
u8 i = Three2Four[color >> 1];
u8 a = One2Four[color & 0x01];
return (i << 12) | (i << 8) | (i << 4) | a;
}
static INLINE u16 IA31_IA88( u8 color )
{
u8 i = Three2Eight[color >> 1];
u8 a = One2Eight[color & 0x01];
return (a << 8) | i;
u8 i = Three2Eight[color >> 1];
u8 a = One2Eight[color & 0x01];
return (a << 8) | i;
}
static INLINE u32 IA31_RGBA8888( u8 color )
{
u8 i = Three2Eight[color >> 1];
u8 a = One2Eight[color & 0x01];
return (i << 24) | (i << 16) | (i << 8) | a;
u8 i = Three2Eight[color >> 1];
u8 a = One2Eight[color & 0x01];
return (i << 24) | (i << 16) | (i << 8) | a;
}
static INLINE u16 I8_RGBA4444( u8 color )
{
u8 c = color >> 4;
return (c << 12) | (c << 8) | (c << 4) | c;
u8 c = color >> 4;
return (c << 12) | (c << 8) | (c << 4) | c;
}
#define I8_RGBA8888(color) ((color << 24) | (color << 16) | (color << 8) | color)
static INLINE u16 I4_RGBA4444( u8 color )
{
u16 ret = color & 0x0f;
ret |= ret << 4; ret |= ret << 8; return ret;
u16 ret = color & 0x0f;
ret |= ret << 4; ret |= ret << 8; return ret;
}
#define I4_I8(color) (Four2Eight[color & 0x0f])
static INLINE u16 I4_IA88( u8 color )
{
u32 c = Four2Eight[color & 0x0f];
return (c << 8) | c;
u32 c = Four2Eight[color & 0x0f];
return (c << 8) | c;
}
#define I8_IA88(color) ((color << 8) | color)
static INLINE u16 IA88_IA88( u16 color )
{
u8 a = (color&0xFF);
u8 i = (color>>8);
return (i << 8) | a;
u8 a = (color&0xFF);
u8 i = (color>>8);
return (i << 8) | a;
}
static INLINE u32 I4_RGBA8888( u8 color )
{
u8 c = Four2Eight[color];
c |= c << 4;
return (c << 24) | (c << 16) | (c << 8) | c;
u8 c = Four2Eight[color];
c |= c << 4;
return (c << 24) | (c << 16) | (c << 8) | c;
}
#endif // CONVERT_H
+497 -499
View File
File diff suppressed because it is too large. Load diff
+961 -1010
View File
File diff suppressed because it is too large. Load diff
+381 -381
View File
@@ -4,481 +4,481 @@
#ifdef __VEC4_OPT
static void gSPTransformVertex4NEON(u32 v, float mtx[4][4])
{
float *ptr = &OGL.triangles.vertices[v].x;
float *ptr = &OGL.triangles.vertices[v].x;
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //q0 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d2, d3}, [%1] \n\t" //q1 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d4, d5}, [%1] \n\t" //q2 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d6, d7}, [%1] \n\t" //q3 = {x,y,z,w}
"sub %1, %1, %3 \n\t" //q0 = {x,y,z,w}
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //q0 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d2, d3}, [%1] \n\t" //q1 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d4, d5}, [%1] \n\t" //q2 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d6, d7}, [%1] \n\t" //q3 = {x,y,z,w}
"sub %1, %1, %3 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m
"vld1.32 {d22, d23}, [%0]! \n\t" //q11 = m
"vld1.32 {d24, d25}, [%0] \n\t" //q12 = m
"vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m
"vld1.32 {d22, d23}, [%0]! \n\t" //q11 = m
"vld1.32 {d24, d25}, [%0] \n\t" //q12 = m
"vmov.f32 q13, q12 \n\t" //q13 = q12
"vmov.f32 q14, q12 \n\t" //q14 = q12
"vmov.f32 q15, q12 \n\t" //q15 = q12
"vmov.f32 q13, q12 \n\t" //q13 = q12
"vmov.f32 q14, q12 \n\t" //q14 = q12
"vmov.f32 q15, q12 \n\t" //q15 = q12
"vmla.f32 q12, q9, d0[0] \n\t" //q12 = q9*d0[0]
"vmla.f32 q13, q9, d2[0] \n\t" //q13 = q9*d0[0]
"vmla.f32 q14, q9, d4[0] \n\t" //q14 = q9*d0[0]
"vmla.f32 q15, q9, d6[0] \n\t" //q15 = q9*d0[0]
"vmla.f32 q12, q10, d0[1] \n\t" //q12 = q10*d0[1]
"vmla.f32 q13, q10, d2[1] \n\t" //q13 = q10*d0[1]
"vmla.f32 q14, q10, d4[1] \n\t" //q14 = q10*d0[1]
"vmla.f32 q15, q10, d6[1] \n\t" //q15 = q10*d0[1]
"vmla.f32 q12, q11, d1[0] \n\t" //q12 = q11*d1[0]
"vmla.f32 q13, q11, d3[0] \n\t" //q13 = q11*d1[0]
"vmla.f32 q14, q11, d5[0] \n\t" //q14 = q11*d1[0]
"vmla.f32 q15, q11, d7[0] \n\t" //q15 = q11*d1[0]
"vmla.f32 q12, q9, d0[0] \n\t" //q12 = q9*d0[0]
"vmla.f32 q13, q9, d2[0] \n\t" //q13 = q9*d0[0]
"vmla.f32 q14, q9, d4[0] \n\t" //q14 = q9*d0[0]
"vmla.f32 q15, q9, d6[0] \n\t" //q15 = q9*d0[0]
"vmla.f32 q12, q10, d0[1] \n\t" //q12 = q10*d0[1]
"vmla.f32 q13, q10, d2[1] \n\t" //q13 = q10*d0[1]
"vmla.f32 q14, q10, d4[1] \n\t" //q14 = q10*d0[1]
"vmla.f32 q15, q10, d6[1] \n\t" //q15 = q10*d0[1]
"vmla.f32 q12, q11, d1[0] \n\t" //q12 = q11*d1[0]
"vmla.f32 q13, q11, d3[0] \n\t" //q13 = q11*d1[0]
"vmla.f32 q14, q11, d5[0] \n\t" //q14 = q11*d1[0]
"vmla.f32 q15, q11, d7[0] \n\t" //q15 = q11*d1[0]
"vst1.32 {d24, d25}, [%1] \n\t" //q12
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d26, d27}, [%1] \n\t" //q13
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d28, d29}, [%1] \n\t" //q14
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d30, d31}, [%1] \n\t" //q15
"vst1.32 {d24, d25}, [%1] \n\t" //q12
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d26, d27}, [%1] \n\t" //q13
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d28, d29}, [%1] \n\t" //q14
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d30, d31}, [%1] \n\t" //q15
: "+&r"(mtx), "+&r"(ptr)
: "I"(sizeof(SPVertex)), "I"(3 * sizeof(SPVertex))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d18","d19", "d20", "d21", "d22", "d23", "d24",
"d25", "d26", "d27", "d28", "d29", "d30", "d31", "memory"
);
: "+&r"(mtx), "+&r"(ptr)
: "I"(sizeof(SPVertex)), "I"(3 * sizeof(SPVertex))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d18","d19", "d20", "d21", "d22", "d23", "d24",
"d25", "d26", "d27", "d28", "d29", "d30", "d31", "memory"
);
}
//4x Transform normal and normalize
static void gSPTransformNormal4NEON(u32 v, float mtx[4][4])
{
void *ptr = (void*)&OGL.triangles.vertices[v].nx;
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //q0 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d2, d3}, [%1] \n\t" //q1 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d4, d5}, [%1] \n\t" //q2 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d6, d7}, [%1] \n\t" //q3 = {x,y,z,w}
"sub %1, %1, %3 \n\t" //q0 = {x,y,z,w}
void *ptr = (void*)&OGL.triangles.vertices[v].nx;
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //q0 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d2, d3}, [%1] \n\t" //q1 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d4, d5}, [%1] \n\t" //q2 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d6, d7}, [%1] \n\t" //q3 = {x,y,z,w}
"sub %1, %1, %3 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m+16
"vld1.32 {d22, d23}, [%0] \n\t" //q11 = m+32
"vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m+16
"vld1.32 {d22, d23}, [%0] \n\t" //q11 = m+32
"vmul.f32 q12, q9, d0[0] \n\t" //q12 = q9*d0[0]
"vmul.f32 q13, q9, d2[0] \n\t" //q13 = q9*d2[0]
"vmul.f32 q14, q9, d4[0] \n\t" //q14 = q9*d4[0]
"vmul.f32 q15, q9, d6[0] \n\t" //q15 = q9*d6[0]
"vmul.f32 q12, q9, d0[0] \n\t" //q12 = q9*d0[0]
"vmul.f32 q13, q9, d2[0] \n\t" //q13 = q9*d2[0]
"vmul.f32 q14, q9, d4[0] \n\t" //q14 = q9*d4[0]
"vmul.f32 q15, q9, d6[0] \n\t" //q15 = q9*d6[0]
"vmla.f32 q12, q10, d0[1] \n\t" //q12 += q10*q0[1]
"vmla.f32 q13, q10, d2[1] \n\t" //q13 += q10*q2[1]
"vmla.f32 q14, q10, d4[1] \n\t" //q14 += q10*q4[1]
"vmla.f32 q15, q10, d6[1] \n\t" //q15 += q10*q6[1]
"vmla.f32 q12, q10, d0[1] \n\t" //q12 += q10*q0[1]
"vmla.f32 q13, q10, d2[1] \n\t" //q13 += q10*q2[1]
"vmla.f32 q14, q10, d4[1] \n\t" //q14 += q10*q4[1]
"vmla.f32 q15, q10, d6[1] \n\t" //q15 += q10*q6[1]
"vmla.f32 q12, q11, d1[0] \n\t" //q12 += q11*d1[0]
"vmla.f32 q13, q11, d3[0] \n\t" //q13 += q11*d3[0]
"vmla.f32 q14, q11, d5[0] \n\t" //q14 += q11*d5[0]
"vmla.f32 q15, q11, d7[0] \n\t" //q15 += q11*d7[0]
"vmla.f32 q12, q11, d1[0] \n\t" //q12 += q11*d1[0]
"vmla.f32 q13, q11, d3[0] \n\t" //q13 += q11*d3[0]
"vmla.f32 q14, q11, d5[0] \n\t" //q14 += q11*d5[0]
"vmla.f32 q15, q11, d7[0] \n\t" //q15 += q11*d7[0]
"vmul.f32 q0, q12, q12 \n\t" //q0 = q12*q12
"vmul.f32 q1, q13, q13 \n\t" //q1 = q13*q13
"vmul.f32 q2, q14, q14 \n\t" //q2 = q14*q14
"vmul.f32 q3, q15, q15 \n\t" //q3 = q15*q15
"vmul.f32 q0, q12, q12 \n\t" //q0 = q12*q12
"vmul.f32 q1, q13, q13 \n\t" //q1 = q13*q13
"vmul.f32 q2, q14, q14 \n\t" //q2 = q14*q14
"vmul.f32 q3, q15, q15 \n\t" //q3 = q15*q15
"vpadd.f32 d0, d0 \n\t" //d0[0] = d0[0] + d0[1]
"vpadd.f32 d2, d2 \n\t" //d2[0] = d2[0] + d2[1]
"vpadd.f32 d4, d4 \n\t" //d4[0] = d4[0] + d4[1]
"vpadd.f32 d6, d6 \n\t" //d6[0] = d6[0] + d6[1]
"vpadd.f32 d0, d0 \n\t" //d0[0] = d0[0] + d0[1]
"vpadd.f32 d2, d2 \n\t" //d2[0] = d2[0] + d2[1]
"vpadd.f32 d4, d4 \n\t" //d4[0] = d4[0] + d4[1]
"vpadd.f32 d6, d6 \n\t" //d6[0] = d6[0] + d6[1]
"vmov.f32 s1, s2 \n\t" //d0[1] = d1[0]
"vmov.f32 s5, s6 \n\t" //d2[1] = d3[0]
"vmov.f32 s9, s10 \n\t" //d4[1] = d5[0]
"vmov.f32 s13, s14 \n\t" //d6[1] = d7[0]
"vmov.f32 s1, s2 \n\t" //d0[1] = d1[0]
"vmov.f32 s5, s6 \n\t" //d2[1] = d3[0]
"vmov.f32 s9, s10 \n\t" //d4[1] = d5[0]
"vmov.f32 s13, s14 \n\t" //d6[1] = d7[0]
"vpadd.f32 d0, d0, d2 \n\t" //d0 = {d0[0] + d0[1], d2[0] + d2[1]}
"vpadd.f32 d1, d4, d6 \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vpadd.f32 d0, d0, d2 \n\t" //d0 = {d0[0] + d0[1], d2[0] + d2[1]}
"vpadd.f32 d1, d4, d6 \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vmov.f32 q1, q0 \n\t" //q1 = q0
"vrsqrte.f32 q0, q0 \n\t" //q0 = ~ 1.0 / sqrt(q0)
"vmul.f32 q2, q0, q1 \n\t" //q2 = q0 * q1
"vrsqrts.f32 q3, q2, q0 \n\t" //q3 = (3 - q0 * q2) / 2
"vmul.f32 q0, q0, q3 \n\t" //q0 = q0 * q3
"vmul.f32 q2, q0, q1 \n\t" //q2 = q0 * q1
"vrsqrts.f32 q3, q2, q0 \n\t" //q3 = (3 - q0 * q2) / 2
"vmul.f32 q0, q0, q3 \n\t" //q0 = q0 * q3
"vmov.f32 q1, q0 \n\t" //q1 = q0
"vrsqrte.f32 q0, q0 \n\t" //q0 = ~ 1.0 / sqrt(q0)
"vmul.f32 q2, q0, q1 \n\t" //q2 = q0 * q1
"vrsqrts.f32 q3, q2, q0 \n\t" //q3 = (3 - q0 * q2) / 2
"vmul.f32 q0, q0, q3 \n\t" //q0 = q0 * q3
"vmul.f32 q2, q0, q1 \n\t" //q2 = q0 * q1
"vrsqrts.f32 q3, q2, q0 \n\t" //q3 = (3 - q0 * q2) / 2
"vmul.f32 q0, q0, q3 \n\t" //q0 = q0 * q3
"vmul.f32 q3, q15, d1[1] \n\t" //q3 = q15*d1[1]
"vmul.f32 q2, q14, d1[0] \n\t" //q2 = q14*d1[0]
"vmul.f32 q1, q13, d0[1] \n\t" //q1 = q13*d0[1]
"vmul.f32 q0, q12, d0[0] \n\t" //q0 = q12*d0[0]
"vmul.f32 q3, q15, d1[1] \n\t" //q3 = q15*d1[1]
"vmul.f32 q2, q14, d1[0] \n\t" //q2 = q14*d1[0]
"vmul.f32 q1, q13, d0[1] \n\t" //q1 = q13*d0[1]
"vmul.f32 q0, q12, d0[0] \n\t" //q0 = q12*d0[0]
"vst1.32 {d0, d1}, [%1] \n\t" //d0={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d2, d3}, [%1] \n\t" //d2={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d4, d5}, [%1] \n\t" //d4={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d6, d7}, [%1] \n\t" //d6={nx,ny,nz,pad}
"vst1.32 {d0, d1}, [%1] \n\t" //d0={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d2, d3}, [%1] \n\t" //d2={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d4, d5}, [%1] \n\t" //d4={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d6, d7}, [%1] \n\t" //d6={nx,ny,nz,pad}
: "+&r"(mtx), "+&r"(ptr)
: "I"(sizeof(SPVertex)), "I"(3 * sizeof(SPVertex))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16","d17", "d18","d19", "d20", "d21", "d22",
"d23", "d24", "d25", "d26", "d27", "d28", "d29",
"d30", "d31", "memory"
);
: "+&r"(mtx), "+&r"(ptr)
: "I"(sizeof(SPVertex)), "I"(3 * sizeof(SPVertex))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16","d17", "d18","d19", "d20", "d21", "d22",
"d23", "d24", "d25", "d26", "d27", "d28", "d29",
"d30", "d31", "memory"
);
}
static void gSPLightVertex4NEON(u32 v)
{
volatile float result[16];
volatile float result[16];
volatile int i = gSP.numLights;
volatile int tmp = 0;
volatile void *ptr0 = &(gSP.lights[0].r);
volatile void *ptr1 = &(OGL.triangles.vertices[v].nx);
volatile void *ptr2 = result;
volatile void *ptr3 = gSP.matrix.modelView[gSP.matrix.modelViewi];
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //q0 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d2, d3}, [%1] \n\t" //q1 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d4, d5}, [%1] \n\t" //q2 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d6, d7}, [%1] \n\t" //q3 = {x,y,z,w}
"sub %1, %1, %3 \n\t" //q0 = {x,y,z,w}
volatile int i = gSP.numLights;
volatile int tmp = 0;
volatile void *ptr0 = &(gSP.lights[0].r);
volatile void *ptr1 = &(OGL.triangles.vertices[v].nx);
volatile void *ptr2 = result;
volatile void *ptr3 = gSP.matrix.modelView[gSP.matrix.modelViewi];
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //q0 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d2, d3}, [%1] \n\t" //q1 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d4, d5}, [%1] \n\t" //q2 = {x,y,z,w}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d6, d7}, [%1] \n\t" //q3 = {x,y,z,w}
"sub %1, %1, %3 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m+16
"vld1.32 {d22, d23}, [%0] \n\t" //q11 = m+32
"vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m+16
"vld1.32 {d22, d23}, [%0] \n\t" //q11 = m+32
"vmul.f32 q12, q9, d0[0] \n\t" //q12 = q9*d0[0]
"vmul.f32 q13, q9, d2[0] \n\t" //q13 = q9*d2[0]
"vmul.f32 q14, q9, d4[0] \n\t" //q14 = q9*d4[0]
"vmul.f32 q15, q9, d6[0] \n\t" //q15 = q9*d6[0]
"vmul.f32 q12, q9, d0[0] \n\t" //q12 = q9*d0[0]
"vmul.f32 q13, q9, d2[0] \n\t" //q13 = q9*d2[0]
"vmul.f32 q14, q9, d4[0] \n\t" //q14 = q9*d4[0]
"vmul.f32 q15, q9, d6[0] \n\t" //q15 = q9*d6[0]
"vmla.f32 q12, q10, d0[1] \n\t" //q12 += q10*q0[1]
"vmla.f32 q13, q10, d2[1] \n\t" //q13 += q10*q2[1]
"vmla.f32 q14, q10, d4[1] \n\t" //q14 += q10*q4[1]
"vmla.f32 q15, q10, d6[1] \n\t" //q15 += q10*q6[1]
"vmla.f32 q12, q10, d0[1] \n\t" //q12 += q10*q0[1]
"vmla.f32 q13, q10, d2[1] \n\t" //q13 += q10*q2[1]
"vmla.f32 q14, q10, d4[1] \n\t" //q14 += q10*q4[1]
"vmla.f32 q15, q10, d6[1] \n\t" //q15 += q10*q6[1]
"vmla.f32 q12, q11, d1[0] \n\t" //q12 += q11*d1[0]
"vmla.f32 q13, q11, d3[0] \n\t" //q13 += q11*d3[0]
"vmla.f32 q14, q11, d5[0] \n\t" //q14 += q11*d5[0]
"vmla.f32 q15, q11, d7[0] \n\t" //q15 += q11*d7[0]
"vmla.f32 q12, q11, d1[0] \n\t" //q12 += q11*d1[0]
"vmla.f32 q13, q11, d3[0] \n\t" //q13 += q11*d3[0]
"vmla.f32 q14, q11, d5[0] \n\t" //q14 += q11*d5[0]
"vmla.f32 q15, q11, d7[0] \n\t" //q15 += q11*d7[0]
"vmul.f32 q0, q12, q12 \n\t" //q0 = q12*q12
"vmul.f32 q1, q13, q13 \n\t" //q1 = q13*q13
"vmul.f32 q2, q14, q14 \n\t" //q2 = q14*q14
"vmul.f32 q3, q15, q15 \n\t" //q3 = q15*q15
"vmul.f32 q0, q12, q12 \n\t" //q0 = q12*q12
"vmul.f32 q1, q13, q13 \n\t" //q1 = q13*q13
"vmul.f32 q2, q14, q14 \n\t" //q2 = q14*q14
"vmul.f32 q3, q15, q15 \n\t" //q3 = q15*q15
"vpadd.f32 d0, d0 \n\t" //d0[0] = d0[0] + d0[1]
"vpadd.f32 d2, d2 \n\t" //d2[0] = d2[0] + d2[1]
"vpadd.f32 d4, d4 \n\t" //d4[0] = d4[0] + d4[1]
"vpadd.f32 d6, d6 \n\t" //d6[0] = d6[0] + d6[1]
"vpadd.f32 d0, d0 \n\t" //d0[0] = d0[0] + d0[1]
"vpadd.f32 d2, d2 \n\t" //d2[0] = d2[0] + d2[1]
"vpadd.f32 d4, d4 \n\t" //d4[0] = d4[0] + d4[1]
"vpadd.f32 d6, d6 \n\t" //d6[0] = d6[0] + d6[1]
"vmov.f32 s1, s2 \n\t" //d0[1] = d1[0]
"vmov.f32 s5, s6 \n\t" //d2[1] = d3[0]
"vmov.f32 s9, s10 \n\t" //d4[1] = d5[0]
"vmov.f32 s13, s14 \n\t" //d6[1] = d7[0]
"vmov.f32 s1, s2 \n\t" //d0[1] = d1[0]
"vmov.f32 s5, s6 \n\t" //d2[1] = d3[0]
"vmov.f32 s9, s10 \n\t" //d4[1] = d5[0]
"vmov.f32 s13, s14 \n\t" //d6[1] = d7[0]
"vpadd.f32 d0, d0, d2 \n\t" //d0 = {d0[0] + d0[1], d2[0] + d2[1]}
"vpadd.f32 d1, d4, d6 \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vpadd.f32 d0, d0, d2 \n\t" //d0 = {d0[0] + d0[1], d2[0] + d2[1]}
"vpadd.f32 d1, d4, d6 \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vmov.f32 q1, q0 \n\t" //q1 = q0
"vrsqrte.f32 q0, q0 \n\t" //q0 = ~ 1.0 / sqrt(q0)
"vmul.f32 q2, q0, q1 \n\t" //q2 = q0 * q1
"vrsqrts.f32 q3, q2, q0 \n\t" //q3 = (3 - q0 * q2) / 2
"vmul.f32 q0, q0, q3 \n\t" //q0 = q0 * q3
"vmul.f32 q2, q0, q1 \n\t" //q2 = q0 * q1
"vrsqrts.f32 q3, q2, q0 \n\t" //q3 = (3 - q0 * q2) / 2
"vmul.f32 q0, q0, q3 \n\t" //q0 = q0 * q3
"vmov.f32 q1, q0 \n\t" //q1 = q0
"vrsqrte.f32 q0, q0 \n\t" //q0 = ~ 1.0 / sqrt(q0)
"vmul.f32 q2, q0, q1 \n\t" //q2 = q0 * q1
"vrsqrts.f32 q3, q2, q0 \n\t" //q3 = (3 - q0 * q2) / 2
"vmul.f32 q0, q0, q3 \n\t" //q0 = q0 * q3
"vmul.f32 q2, q0, q1 \n\t" //q2 = q0 * q1
"vrsqrts.f32 q3, q2, q0 \n\t" //q3 = (3 - q0 * q2) / 2
"vmul.f32 q0, q0, q3 \n\t" //q0 = q0 * q3
"vmul.f32 q3, q15, d1[1] \n\t" //q3 = q15*d1[1]
"vmul.f32 q2, q14, d1[0] \n\t" //q2 = q14*d1[0]
"vmul.f32 q1, q13, d0[1] \n\t" //q1 = q13*d0[1]
"vmul.f32 q0, q12, d0[0] \n\t" //q0 = q12*d0[0]
"vmul.f32 q3, q15, d1[1] \n\t" //q3 = q15*d1[1]
"vmul.f32 q2, q14, d1[0] \n\t" //q2 = q14*d1[0]
"vmul.f32 q1, q13, d0[1] \n\t" //q1 = q13*d0[1]
"vmul.f32 q0, q12, d0[0] \n\t" //q0 = q12*d0[0]
"vst1.32 {d0, d1}, [%1] \n\t" //d0={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d2, d3}, [%1] \n\t" //d2={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d4, d5}, [%1] \n\t" //d4={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d6, d7}, [%1] \n\t" //d6={nx,ny,nz,pad}
"vst1.32 {d0, d1}, [%1] \n\t" //d0={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d2, d3}, [%1] \n\t" //d2={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d4, d5}, [%1] \n\t" //d4={nx,ny,nz,pad}
"add %1, %1, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d6, d7}, [%1] \n\t" //d6={nx,ny,nz,pad}
: "+&r"(ptr3), "+&r"(ptr1)
: "I"(sizeof(SPVertex)), "I"(3 * sizeof(SPVertex))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16","d17", "d18","d19", "d20", "d21", "d22",
"d23", "d24", "d25", "d26", "d27", "d28", "d29",
"d30", "d31", "memory"
);
__asm(
: "+&r"(ptr3), "+&r"(ptr1)
: "I"(sizeof(SPVertex)), "I"(3 * sizeof(SPVertex))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16","d17", "d18","d19", "d20", "d21", "d22",
"d23", "d24", "d25", "d26", "d27", "d28", "d29",
"d30", "d31", "memory"
);
__asm(
"mov %0, %5 \n\t" //r0=sizeof(light)
"mla %0, %1, %0, %2 \n\t" //r0=r1*r0+r2
"mov %0, %5 \n\t" //r0=sizeof(light)
"mla %0, %1, %0, %2 \n\t" //r0=r1*r0+r2
"vmov.f32 q8, q0 \n\t" //q8=q0
"vmov.f32 q9, q1 \n\t" //q9=q1
"vmov.f32 q10, q2 \n\t" //q10=q2
"vmov.f32 q11, q3 \n\t" //q11=q3
"vmov.f32 q8, q0 \n\t" //q8=q0
"vmov.f32 q9, q1 \n\t" //q9=q1
"vmov.f32 q10, q2 \n\t" //q10=q2
"vmov.f32 q11, q3 \n\t" //q11=q3
"vld1.32 {d0}, [%0] \n\t" //d0={r,g}
"flds s2, [%0, #8] \n\t" //d1[0]={b}
"vmov.f32 q1, q0 \n\t" //q1=q0
"vmov.f32 q2, q0 \n\t" //q2=q0
"vmov.f32 q3, q0 \n\t" //q3=q0
"vld1.32 {d0}, [%0] \n\t" //d0={r,g}
"flds s2, [%0, #8] \n\t" //d1[0]={b}
"vmov.f32 q1, q0 \n\t" //q1=q0
"vmov.f32 q2, q0 \n\t" //q2=q0
"vmov.f32 q3, q0 \n\t" //q3=q0
"vmov.f32 q15, #0.0 \n\t" //q15=0
"vdup.f32 q15, d30[0] \n\t" //q15=d30[0]
"vmov.f32 q15, #0.0 \n\t" //q15=0
"vdup.f32 q15, d30[0] \n\t" //q15=d30[0]
"cmp %1, #0 \n\t" //
"beq 2f \n\t" //(r1==0) goto 2
"cmp %1, #0 \n\t" //
"beq 2f \n\t" //(r1==0) goto 2
"1: \n\t" //
"vld1.32 {d8}, [%2]! \n\t" //d8={r,g}
"flds s18, [%2] \n\t" //q9[0]={b}
"add %2, %2, #4 \n\t" //q9[0]={b}
"vld1.32 {d10}, [%2]! \n\t" //d10={x,y}
"flds s22, [%2] \n\t" //d11[0]={z}
"add %2, %2, #4 \n\t" //q9[0]={b}
"1: \n\t" //
"vld1.32 {d8}, [%2]! \n\t" //d8={r,g}
"flds s18, [%2] \n\t" //q9[0]={b}
"add %2, %2, #4 \n\t" //q9[0]={b}
"vld1.32 {d10}, [%2]! \n\t" //d10={x,y}
"flds s22, [%2] \n\t" //d11[0]={z}
"add %2, %2, #4 \n\t" //q9[0]={b}
"vmov.f32 q13, q5 \n\t" //q13 = q5
"vmov.f32 q12, q4 \n\t" //q12 = q4
"vmov.f32 q13, q5 \n\t" //q13 = q5
"vmov.f32 q12, q4 \n\t" //q12 = q4
"vmul.f32 q4, q8, q13 \n\t" //q4 = q8*q13
"vmul.f32 q5, q9, q13 \n\t" //q5 = q9*q13
"vmul.f32 q6, q10, q13 \n\t" //q6 = q10*q13
"vmul.f32 q7, q11, q13 \n\t" //q7 = q11*q13
"vmul.f32 q4, q8, q13 \n\t" //q4 = q8*q13
"vmul.f32 q5, q9, q13 \n\t" //q5 = q9*q13
"vmul.f32 q6, q10, q13 \n\t" //q6 = q10*q13
"vmul.f32 q7, q11, q13 \n\t" //q7 = q11*q13
"vpadd.f32 d8, d8 \n\t" //d8[0] = d8[0] + d8[1]
"vpadd.f32 d10, d10 \n\t" //d10[0] = d10[0] + d10[1]
"vpadd.f32 d12, d12 \n\t" //d12[0] = d12[0] + d12[1]
"vpadd.f32 d14, d14 \n\t" //d14[0] = d14[0] + d14[1]
"vpadd.f32 d8, d8 \n\t" //d8[0] = d8[0] + d8[1]
"vpadd.f32 d10, d10 \n\t" //d10[0] = d10[0] + d10[1]
"vpadd.f32 d12, d12 \n\t" //d12[0] = d12[0] + d12[1]
"vpadd.f32 d14, d14 \n\t" //d14[0] = d14[0] + d14[1]
"vmov.f32 s17, s18 \n\t" //d8[1] = d9[0]
"vmov.f32 s21, s22 \n\t" //d10[1] = d11[0]
"vmov.f32 s25, s26 \n\t" //d12[1] = d13[0]
"vmov.f32 s29, s30 \n\t" //d14[1] = d15[0]
"vmov.f32 s17, s18 \n\t" //d8[1] = d9[0]
"vmov.f32 s21, s22 \n\t" //d10[1] = d11[0]
"vmov.f32 s25, s26 \n\t" //d12[1] = d13[0]
"vmov.f32 s29, s30 \n\t" //d14[1] = d15[0]
"vpadd.f32 d8, d8, d10 \n\t" //d8 = {d8[0] + d8[1], d10[0] + d10[1]}
"vpadd.f32 d9, d12, d14 \n\t" //d9 = {d12[0] + d12[1], d14[0] + d14[1]}
"vpadd.f32 d8, d8, d10 \n\t" //d8 = {d8[0] + d8[1], d10[0] + d10[1]}
"vpadd.f32 d9, d12, d14 \n\t" //d9 = {d12[0] + d12[1], d14[0] + d14[1]}
"vmax.f32 q4, q4, q15 \n\t" //q4=max(q4, 0)
"vmax.f32 q4, q4, q15 \n\t" //q4=max(q4, 0)
"vmla.f32 q0, q12, d8[0] \n\t" //q0 +=
"vmla.f32 q1, q12, d8[1] \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vmla.f32 q2, q12, d9[0] \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vmla.f32 q3, q12, d9[1] \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vmla.f32 q0, q12, d8[0] \n\t" //q0 +=
"vmla.f32 q1, q12, d8[1] \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vmla.f32 q2, q12, d9[0] \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"vmla.f32 q3, q12, d9[1] \n\t" //d1 = {d4[0] + d4[1], d6[0] + d6[1]}
"subs %1, %1, #1 \n\t" //r1=r1 - 1
"bne 1b \n\t" //(r1!=0) goto 1
"subs %1, %1, #1 \n\t" //r1=r1 - 1
"bne 1b \n\t" //(r1!=0) goto 1
"2: \n\t" //
"2: \n\t" //
"vmov.f32 q4, #1.0 \n\t" //
"vmin.f32 q0, q0, q4 \n\t" //
"vmin.f32 q1, q1, q4 \n\t" //
"vmin.f32 q2, q2, q4 \n\t" //
"vmin.f32 q3, q3, q4 \n\t" //
"vst1.32 {d0, d1}, [%4]! \n\t" //
"vst1.32 {d2, d3}, [%4]! \n\t" //
"vst1.32 {d4, d5}, [%4]! \n\t" //
"vst1.32 {d6, d7}, [%4] \n\t" //
"vmov.f32 q4, #1.0 \n\t" //
"vmin.f32 q0, q0, q4 \n\t" //
"vmin.f32 q1, q1, q4 \n\t" //
"vmin.f32 q2, q2, q4 \n\t" //
"vmin.f32 q3, q3, q4 \n\t" //
"vst1.32 {d0, d1}, [%4]! \n\t" //
"vst1.32 {d2, d3}, [%4]! \n\t" //
"vst1.32 {d4, d5}, [%4]! \n\t" //
"vst1.32 {d6, d7}, [%4] \n\t" //
: "+&r"(tmp), "+&r"(i), "+&r"(ptr0), "+&r"(ptr1), "+&r"(ptr2)
: "I"(sizeof(SPLight))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
"d16","d17", "d18","d19", "d20", "d21", "d22", "d23",
"d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
"memory", "cc"
);
OGL.triangles.vertices[v].r = result[0];
OGL.triangles.vertices[v].g = result[1];
OGL.triangles.vertices[v].b = result[2];
OGL.triangles.vertices[v+1].r = result[4];
OGL.triangles.vertices[v+1].g = result[5];
OGL.triangles.vertices[v+1].b = result[6];
OGL.triangles.vertices[v+2].r = result[8];
OGL.triangles.vertices[v+2].g = result[9];
OGL.triangles.vertices[v+2].b = result[10];
OGL.triangles.vertices[v+3].r = result[12];
OGL.triangles.vertices[v+3].g = result[13];
OGL.triangles.vertices[v+3].b = result[14];
: "+&r"(tmp), "+&r"(i), "+&r"(ptr0), "+&r"(ptr1), "+&r"(ptr2)
: "I"(sizeof(SPLight))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
"d16","d17", "d18","d19", "d20", "d21", "d22", "d23",
"d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
"memory", "cc"
);
OGL.triangles.vertices[v].r = result[0];
OGL.triangles.vertices[v].g = result[1];
OGL.triangles.vertices[v].b = result[2];
OGL.triangles.vertices[v+1].r = result[4];
OGL.triangles.vertices[v+1].g = result[5];
OGL.triangles.vertices[v+1].b = result[6];
OGL.triangles.vertices[v+2].r = result[8];
OGL.triangles.vertices[v+2].g = result[9];
OGL.triangles.vertices[v+2].b = result[10];
OGL.triangles.vertices[v+3].r = result[12];
OGL.triangles.vertices[v+3].g = result[13];
OGL.triangles.vertices[v+3].b = result[14];
}
static void gSPBillboardVertex4NEON(u32 v)
{
int i = 0;
int i = 0;
void *ptr0 = (void*)&OGL.triangles.vertices[v].x;
void *ptr1 = (void*)&OGL.triangles.vertices[i].x;
__asm(
void *ptr0 = (void*)&OGL.triangles.vertices[v].x;
void *ptr1 = (void*)&OGL.triangles.vertices[i].x;
__asm(
"vld1.32 {d0, d1}, [%0] \n\t" //q0 = {x,y,z,w}
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d2, d3}, [%0] \n\t" //q1 = {x,y,z,w}
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d4, d5}, [%0] \n\t" //q2 = {x,y,z,w}
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d6, d7}, [%0] \n\t" //q3 = {x,y,z,w}
"sub %0, %0, %3 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d0, d1}, [%0] \n\t" //q0 = {x,y,z,w}
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d2, d3}, [%0] \n\t" //q1 = {x,y,z,w}
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d4, d5}, [%0] \n\t" //q2 = {x,y,z,w}
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d6, d7}, [%0] \n\t" //q3 = {x,y,z,w}
"sub %0, %0, %3 \n\t" //q0 = {x,y,z,w}
"vld1.32 {d16, d17}, [%1] \n\t" //q2={x1,y1,z1,w1}
"vadd.f32 q0, q0, q8 \n\t" //q1=q1+q1
"vadd.f32 q1, q1, q8 \n\t" //q1=q1+q1
"vadd.f32 q2, q2, q8 \n\t" //q1=q1+q1
"vadd.f32 q3, q3, q8 \n\t" //q1=q1+q1
"vst1.32 {d0, d1}, [%0] \n\t" //
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d2, d3}, [%0] \n\t" //
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d4, d5}, [%0] \n\t" //
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d6, d7}, [%0] \n\t" //
: "+&r"(ptr0), "+&r"(ptr1)
: "I"(sizeof(SPVertex)), "I"(3 * sizeof(SPVertex))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16", "d17", "memory"
);
"vld1.32 {d16, d17}, [%1] \n\t" //q2={x1,y1,z1,w1}
"vadd.f32 q0, q0, q8 \n\t" //q1=q1+q1
"vadd.f32 q1, q1, q8 \n\t" //q1=q1+q1
"vadd.f32 q2, q2, q8 \n\t" //q1=q1+q1
"vadd.f32 q3, q3, q8 \n\t" //q1=q1+q1
"vst1.32 {d0, d1}, [%0] \n\t" //
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d2, d3}, [%0] \n\t" //
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d4, d5}, [%0] \n\t" //
"add %0, %0, %2 \n\t" //q0 = {x,y,z,w}
"vst1.32 {d6, d7}, [%0] \n\t" //
: "+&r"(ptr0), "+&r"(ptr1)
: "I"(sizeof(SPVertex)), "I"(3 * sizeof(SPVertex))
: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16", "d17", "memory"
);
}
#endif
static void gSPTransformVertexNEON(float vtx[4], float mtx[4][4])
{
//optimised using cycle analyser
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //d8 = {x,y}
"vld1.32 {d18, d19}, [%0]! \n\t" //Q1 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //Q2 = m+4
"vld1.32 {d22, d23}, [%0]! \n\t" //Q3 = m+8
"vld1.32 {d24, d25}, [%0] \n\t" //Q4 = m+12
//optimised using cycle analyser
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //d8 = {x,y}
"vld1.32 {d18, d19}, [%0]! \n\t" //Q1 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //Q2 = m+4
"vld1.32 {d22, d23}, [%0]! \n\t" //Q3 = m+8
"vld1.32 {d24, d25}, [%0] \n\t" //Q4 = m+12
"vmul.f32 q13, q9, d0[0] \n\t" //Q5 = Q1*Q0[0]
"vmla.f32 q13, q10, d0[1] \n\t" //Q5 += Q1*Q0[1]
"vmla.f32 q13, q11, d1[0] \n\t" //Q5 += Q2*Q0[2]
"vadd.f32 q13, q13, q12 \n\t" //Q5 += Q3*Q0[3]
"vst1.32 {d26, d27}, [%1] \n\t" //Q4 = m+12
"vmul.f32 q13, q9, d0[0] \n\t" //Q5 = Q1*Q0[0]
"vmla.f32 q13, q10, d0[1] \n\t" //Q5 += Q1*Q0[1]
"vmla.f32 q13, q11, d1[0] \n\t" //Q5 += Q2*Q0[2]
"vadd.f32 q13, q13, q12 \n\t" //Q5 += Q3*Q0[3]
"vst1.32 {d26, d27}, [%1] \n\t" //Q4 = m+12
: "+r"(mtx) : "r"(vtx)
: "d0", "d1", "d18","d19","d20","d21","d22","d23","d24","d25",
"d26", "d27", "memory"
);
: "+r"(mtx) : "r"(vtx)
: "d0", "d1", "d18","d19","d20","d21","d22","d23","d24","d25",
"d26", "d27", "memory"
);
}
static void gSPLightVertexNEON(u32 v)
{
volatile float result[4];
volatile float result[4];
volatile int tmp = 0;
volatile int i = gSP.numLights;
volatile void *ptr0 = &gSP.lights[0].r;
volatile void *ptr1 = &OGL.triangles.vertices[v].nx;
volatile void *ptr2 = result;;
volatile void *ptr3 = gSP.matrix.modelView[gSP.matrix.modelViewi];
volatile int tmp = 0;
volatile int i = gSP.numLights;
volatile void *ptr0 = &gSP.lights[0].r;
volatile void *ptr1 = &OGL.triangles.vertices[v].nx;
volatile void *ptr2 = result;;
volatile void *ptr3 = gSP.matrix.modelView[gSP.matrix.modelViewi];
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //Q0 = v
"vld1.32 {d18, d19}, [%0]! \n\t" //Q1 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //Q2 = m+4
"vld1.32 {d22, d23}, [%0] \n\t" //Q3 = m+8
__asm(
"vld1.32 {d0, d1}, [%1] \n\t" //Q0 = v
"vld1.32 {d18, d19}, [%0]! \n\t" //Q1 = m
"vld1.32 {d20, d21}, [%0]! \n\t" //Q2 = m+4
"vld1.32 {d22, d23}, [%0] \n\t" //Q3 = m+8
"vmul.f32 q2, q9, d0[0] \n\t" //q2 = q9*Q0[0]
"vmla.f32 q2, q10, d0[1] \n\t" //Q5 += Q1*Q0[1]
"vmla.f32 q2, q11, d1[0] \n\t" //Q5 += Q2*Q0[2]
"vmul.f32 q2, q9, d0[0] \n\t" //q2 = q9*Q0[0]
"vmla.f32 q2, q10, d0[1] \n\t" //Q5 += Q1*Q0[1]
"vmla.f32 q2, q11, d1[0] \n\t" //Q5 += Q2*Q0[2]
"vmul.f32 d0, d4, d4 \n\t" //d0 = d0*d0
"vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1]
"vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d5*d5
"vmul.f32 d0, d4, d4 \n\t" //d0 = d0*d0
"vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1]
"vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d5*d5
"vmov.f32 d1, d0 \n\t" //d1 = d0
"vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0)
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4
"vmov.f32 d1, d0 \n\t" //d1 = d0
"vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0)
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3
"vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1
"vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2
"vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4
"vmul.f32 q1, q2, d0[0] \n\t" //q1 = d2*d4
"vmul.f32 q1, q2, d0[0] \n\t" //q1 = d2*d4
"vst1.32 {d2, d3}, [%1] \n\t" //d0={nx,ny,nz,pad}
"vst1.32 {d2, d3}, [%1] \n\t" //d0={nx,ny,nz,pad}
: "+&r"(ptr3): "r"(ptr1)
: "d0","d1","d2","d3","d18","d19","d20","d21","d22", "d23", "memory"
);
: "+&r"(ptr3): "r"(ptr1)
: "d0","d1","d2","d3","d18","d19","d20","d21","d22", "d23", "memory"
);
__asm(
"mov %0, #24 \n\t" //r0=24
"mla %0, %1, %0, %2 \n\t" //r0=r1*r0+r2
__asm(
"mov %0, #24 \n\t" //r0=24
"mla %0, %1, %0, %2 \n\t" //r0=r1*r0+r2
"vld1.32 {d0}, [%0]! \n\t" //d0={r,g}
"flds s2, [%0] \n\t" //d1[0]={b}
"cmp %0, #0 \n\t" //
"beq 2f \n\t" //(r1==0) goto 2
"vld1.32 {d0}, [%0]! \n\t" //d0={r,g}
"flds s2, [%0] \n\t" //d1[0]={b}
"cmp %0, #0 \n\t" //
"beq 2f \n\t" //(r1==0) goto 2
"1: \n\t" //
"vld1.32 {d4}, [%2]! \n\t" //d4={r,g}
"flds s10, [%2] \n\t" //q5[0]={b}
"add %2, %2, #4 \n\t" //r2+=4
"vld1.32 {d6}, [%2]! \n\t" //d6={x,y}
"flds s14, [%2] \n\t" //d7[0]={z}
"add %2, %2, #4 \n\t" //r2+=4
"vmul.f32 d6, d2, d6 \n\t" //d6=d2*d6
"vpadd.f32 d6, d6 \n\t" //d6=d6[0]+d6[1]
"vmla.f32 d6, d3, d7 \n\t" //d6=d6+d3*d7
"vmov.f32 d7, #0.0 \n\t" //d7=0
"vmax.f32 d6, d6, d7 \n\t" //d6=max(d6, d7)
"vmla.f32 q0, q2, d6[0] \n\t" //q0=q0+q2*d6[0]
"sub %1, %1, #1 \n\t" //r0=r0-1
"cmp %1, #0 \n\t" //r0=r0-1
"bgt 1b \n\t" //(r1!=0) ? goto 1
"b 2f \n\t" //(r1!=0) ? goto 1
"2: \n\t" //
"vmov.f32 q1, #1.0 \n\t" //
"vmin.f32 q0, q0, q1 \n\t" //
"vst1.32 {d0, d1}, [%3] \n\t" //
"1: \n\t" //
"vld1.32 {d4}, [%2]! \n\t" //d4={r,g}
"flds s10, [%2] \n\t" //q5[0]={b}
"add %2, %2, #4 \n\t" //r2+=4
"vld1.32 {d6}, [%2]! \n\t" //d6={x,y}
"flds s14, [%2] \n\t" //d7[0]={z}
"add %2, %2, #4 \n\t" //r2+=4
"vmul.f32 d6, d2, d6 \n\t" //d6=d2*d6
"vpadd.f32 d6, d6 \n\t" //d6=d6[0]+d6[1]
"vmla.f32 d6, d3, d7 \n\t" //d6=d6+d3*d7
"vmov.f32 d7, #0.0 \n\t" //d7=0
"vmax.f32 d6, d6, d7 \n\t" //d6=max(d6, d7)
"vmla.f32 q0, q2, d6[0] \n\t" //q0=q0+q2*d6[0]
"sub %1, %1, #1 \n\t" //r0=r0-1
"cmp %1, #0 \n\t" //r0=r0-1
"bgt 1b \n\t" //(r1!=0) ? goto 1
"b 2f \n\t" //(r1!=0) ? goto 1
"2: \n\t" //
"vmov.f32 q1, #1.0 \n\t" //
"vmin.f32 q0, q0, q1 \n\t" //
"vst1.32 {d0, d1}, [%3] \n\t" //
: "+&r"(tmp), "+&r"(i), "+&r"(ptr0), "+&r"(ptr2)
:: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16", "memory", "cc"
);
OGL.triangles.vertices[v].r = result[0];
OGL.triangles.vertices[v].g = result[1];
OGL.triangles.vertices[v].b = result[2];
: "+&r"(tmp), "+&r"(i), "+&r"(ptr0), "+&r"(ptr2)
:: "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d16", "memory", "cc"
);
OGL.triangles.vertices[v].r = result[0];
OGL.triangles.vertices[v].g = result[1];
OGL.triangles.vertices[v].b = result[2];
}
static void gSPBillboardVertexNEON(u32 v, u32 i)
{
__asm(
"vld1.32 {d2, d3}, [%0] \n\t" //q1={x0,y0, z0, w0}
"vld1.32 {d4, d5}, [%1] \n\t" //q2={x1,y1, z1, w1}
"vadd.f32 q1, q1, q2 \n\t" //q1=q1+q1
"vst1.32 {d2, d3}, [%0] \n\t" //
:: "r"(&OGL.triangles.vertices[v].x), "r"(&OGL.triangles.vertices[i].x)
: "d2", "d3", "d4", "d5", "memory"
);
__asm(
"vld1.32 {d2, d3}, [%0] \n\t" //q1={x0,y0, z0, w0}
"vld1.32 {d4, d5}, [%1] \n\t" //q2={x1,y1, z1, w1}
"vadd.f32 q1, q1, q2 \n\t" //q1=q1+q1
"vst1.32 {d2, d3}, [%0] \n\t" //
:: "r"(&OGL.triangles.vertices[v].x), "r"(&OGL.triangles.vertices[i].x)
: "d2", "d3", "d4", "d5", "memory"
);
}
void gSPInitNeon()
void gSPInitNeon(void)
{
#ifdef __VEC4_OPT
gSPTransformVertex4 = gSPTransformVertex4NEON;
gSPTransformNormal4 = gSPTransformNormal4NEON;
gSPLightVertex4 = gSPLightVertex4NEON;
gSPBillboardVertex4 = gSPBillboardVertex4NEON;
gSPTransformVertex4 = gSPTransformVertex4NEON;
gSPTransformNormal4 = gSPTransformNormal4NEON;
gSPLightVertex4 = gSPLightVertex4NEON;
gSPBillboardVertex4 = gSPBillboardVertex4NEON;
#endif
gSPTransformVertex = gSPTransformVertexNEON;
gSPLightVertex = gSPLightVertexNEON;
gSPBillboardVertex = gSPBillboardVertexNEON;
gSPTransformVertex = gSPTransformVertexNEON;
gSPLightVertex = gSPLightVertexNEON;
gSPBillboardVertex = gSPBillboardVertexNEON;
}
+37 -37
View File
@@ -59,7 +59,6 @@ void (*renderCallback)() = NULL;
EXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle,
void *Context, void (*DebugCallback)(void *, int, const char *))
{
#ifdef __NEON_OPT
unsigned cpu = 0;
@@ -72,38 +71,38 @@ EXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle,
gSPInitNeon();
}
#endif
return M64ERR_SUCCESS;
return M64ERR_SUCCESS;
}
EXPORT m64p_error CALL PluginShutdown(void)
{
OGL_Stop(); // paulscode, OGL_Stop missing from Yongzh's code
return M64ERR_SUCCESS; // __LIBRETRO__: Fix warning
OGL_Stop(); // paulscode, OGL_Stop missing from Yongzh's code
return M64ERR_SUCCESS; // __LIBRETRO__: Fix warning
}
EXPORT m64p_error CALL PluginGetVersion(m64p_plugin_type *PluginType,
int *PluginVersion, int *APIVersion, const char **PluginNamePtr,
int *Capabilities)
{
/* set version info */
if (PluginType != NULL)
*PluginType = M64PLUGIN_GFX;
/* set version info */
if (PluginType != NULL)
*PluginType = M64PLUGIN_GFX;
if (PluginVersion != NULL)
*PluginVersion = PLUGIN_VERSION;
if (PluginVersion != NULL)
*PluginVersion = PLUGIN_VERSION;
if (APIVersion != NULL)
*APIVersion = PLUGIN_API_VERSION;
if (PluginNamePtr != NULL)
*PluginNamePtr = PLUGIN_NAME;
if (APIVersion != NULL)
*APIVersion = PLUGIN_API_VERSION;
if (Capabilities != NULL)
{
*Capabilities = 0;
}
return M64ERR_SUCCESS;
if (PluginNamePtr != NULL)
*PluginNamePtr = PLUGIN_NAME;
if (Capabilities != NULL)
{
*Capabilities = 0;
}
return M64ERR_SUCCESS;
}
EXPORT void CALL ChangeWindow (void)
@@ -195,17 +194,18 @@ EXPORT void CALL ShowCFB (void)
EXPORT void CALL UpdateScreen (void)
{
//has there been any display lists since last update
if (OGL.frame_prevdl == OGL.frame_dl) return;
//has there been any display lists since last update
if (OGL.frame_prevdl == OGL.frame_dl)
return;
OGL.frame_prevdl = OGL.frame_dl;
OGL.frame_prevdl = OGL.frame_dl;
if (OGL.mustRenderDlist)
{
OGL.screenUpdate=true;
VI_UpdateScreen();
OGL.mustRenderDlist = false;
}
if (OGL.mustRenderDlist)
{
OGL.screenUpdate=true;
VI_UpdateScreen();
OGL.mustRenderDlist = false;
}
}
EXPORT void CALL ViStatusChanged (void)
@@ -286,27 +286,27 @@ EXPORT void CALL FBGetFrameBufferInfo(void *p)
// paulscode, API changed this to "ReadScreen2" in Mupen64Plus 1.99.4
EXPORT void CALL ReadScreen2(void *dest, int *width, int *height, int front)
{
/* TODO: 'int front' was added in 1.99.4. What to do with this here? */
OGL_ReadScreen(dest, width, height);
/* TODO: 'int front' was added in 1.99.4. What to do with this here? */
OGL_ReadScreen(dest, width, height);
}
EXPORT void CALL SetRenderingCallback(void (*callback)())
{
renderCallback = callback;
renderCallback = callback;
}
EXPORT void CALL StartGL()
EXPORT void CALL StartGL(void)
{
OGL_Start();
OGL_Start();
}
EXPORT void CALL StopGL()
EXPORT void CALL StopGL(void)
{
OGL_Stop();
OGL_Stop();
}
#ifdef __LIBRETRO__
void gles2n64_reset()
void gles2n64_reset(void)
{
// HACK: Check for leaks!
OGL_Stop();