mirror of
https://github.com/libretro/parallel-n64.git
synced 2026-11-07 12:37:50 -10:00
(gles2n64) Code formatting cleanups
This commit is contained in:
1 parent
984d686085
commit
f8437d35f1
40 files changed
+5506
-5621
No files matched your search
+30
-30
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void F3DCBFD_Init();
|
||||
void F3DCBFD_Init(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+72
-73
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void F3DDKR_Init();
|
||||
void F3DDKR_Init(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+41
-42
@@ -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
@@ -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
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ extern "C" {
|
||||
|
||||
#define F3DPD_VTXCOLORBASE 0x07
|
||||
|
||||
void F3DPD_Init();
|
||||
void F3DPD_Init(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+37
-39
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#define F3DWRUS_TRI2 0xB1
|
||||
void F3DWRUS_Init();
|
||||
void F3DWRUS_Init(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+161
-166
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
+74
-75
@@ -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
@@ -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
@@ -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
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
+500
-519
File diff suppressed because it is too large.
Load diff
@@ -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
File diff suppressed because it is too large.
Load diff
+65
-69
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
+961
-1010
File diff suppressed because it is too large.
Load diff
+381
-381
@@ -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
@@ -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();
|
||||
|
||||
Reference in new issue
Block a user