98e75f2d |
1 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/3dmath.cpp ./Glide64/3dmath.cpp |
2 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/3dmath.cpp 2013-09-06 22:05:28.000000000 +0200 |
3 | +++ ./Glide64/3dmath.cpp 2013-09-14 09:41:13.000000000 +0200 |
4 | @@ -202,15 +202,109 @@ |
5 | } |
6 | } |
7 | |
8 | +#ifdef __ARM_NEON__ |
9 | +void MultMatrix_neon( float m0[4][4], float m1[4][4], float dest[4][4]) |
10 | +{ |
11 | + asm volatile ( |
12 | + "vld1.32 {d0, d1}, [%1]! \n\t" //q0 = m1 |
13 | + "vld1.32 {d2, d3}, [%1]! \n\t" //q1 = m1+4 |
14 | + "vld1.32 {d4, d5}, [%1]! \n\t" //q2 = m1+8 |
15 | + "vld1.32 {d6, d7}, [%1] \n\t" //q3 = m1+12 |
16 | + "vld1.32 {d16, d17}, [%0]! \n\t" //q8 = m0 |
17 | + "vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m0+4 |
18 | + "vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m0+8 |
19 | + "vld1.32 {d22, d23}, [%0] \n\t" //q11 = m0+12 |
20 | + |
21 | + "vmul.f32 q12, q8, d0[0] \n\t" //q12 = q8 * d0[0] |
22 | + "vmul.f32 q13, q8, d2[0] \n\t" //q13 = q8 * d2[0] |
23 | + "vmul.f32 q14, q8, d4[0] \n\t" //q14 = q8 * d4[0] |
24 | + "vmul.f32 q15, q8, d6[0] \n\t" //q15 = q8 * d6[0] |
25 | + "vmla.f32 q12, q9, d0[1] \n\t" //q12 = q9 * d0[1] |
26 | + "vmla.f32 q13, q9, d2[1] \n\t" //q13 = q9 * d2[1] |
27 | + "vmla.f32 q14, q9, d4[1] \n\t" //q14 = q9 * d4[1] |
28 | + "vmla.f32 q15, q9, d6[1] \n\t" //q15 = q9 * d6[1] |
29 | + "vmla.f32 q12, q10, d1[0] \n\t" //q12 = q10 * d0[0] |
30 | + "vmla.f32 q13, q10, d3[0] \n\t" //q13 = q10 * d2[0] |
31 | + "vmla.f32 q14, q10, d5[0] \n\t" //q14 = q10 * d4[0] |
32 | + "vmla.f32 q15, q10, d7[0] \n\t" //q15 = q10 * d6[0] |
33 | + "vmla.f32 q12, q11, d1[1] \n\t" //q12 = q11 * d0[1] |
34 | + "vmla.f32 q13, q11, d3[1] \n\t" //q13 = q11 * d2[1] |
35 | + "vmla.f32 q14, q11, d5[1] \n\t" //q14 = q11 * d4[1] |
36 | + "vmla.f32 q15, q11, d7[1] \n\t" //q15 = q11 * d6[1] |
37 | + |
38 | + "vst1.32 {d24, d25}, [%2]! \n\t" //d = q12 |
39 | + "vst1.32 {d26, d27}, [%2]! \n\t" //d+4 = q13 |
40 | + "vst1.32 {d28, d29}, [%2]! \n\t" //d+8 = q14 |
41 | + "vst1.32 {d30, d31}, [%2] \n\t" //d+12 = q15 |
42 | + |
43 | + :"+r"(m0), "+r"(m1), "+r"(dest): |
44 | + : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", |
45 | + "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", |
46 | + "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", |
47 | + "memory" |
48 | + ); |
49 | +} |
50 | + |
51 | +void Normalize_neon(float v[3]) |
52 | +{ |
53 | + asm volatile ( |
54 | + "vld1.32 {d4}, [%0]! \n\t" //d4={x,y} |
55 | + "flds s10, [%0] \n\t" //d5[0] = z |
56 | + "sub %0, %0, #8 \n\t" //d5[0] = z |
57 | + "vmul.f32 d0, d4, d4 \n\t" //d0= d4*d4 |
58 | + "vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1] |
59 | + "vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d5*d5 |
60 | + |
61 | + "vmov.f32 d1, d0 \n\t" //d1 = d0 |
62 | + "vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0) |
63 | + "vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1 |
64 | + "vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2 |
65 | + "vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3 |
66 | + "vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1 |
67 | + "vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2 |
68 | + "vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4 |
69 | + |
70 | + "vmul.f32 q2, q2, d0[0] \n\t" //d0= d2*d4 |
71 | + "vst1.32 {d4}, [%0]! \n\t" //d2={x0,y0}, d3={z0, w0} |
72 | + "fsts s10, [%0] \n\t" //d2={x0,y0}, d3={z0, w0} |
73 | + |
74 | + :"+r"(v) : |
75 | + : "d0", "d1", "d2", "d3", "d4", "d5", "memory" |
76 | + ); |
77 | +} |
78 | + |
79 | +float DotProduct_neon( float v0[3], float v1[3] ) |
80 | +{ |
81 | + float dot; |
82 | + asm volatile ( |
83 | + "vld1.32 {d8}, [%1]! \n\t" //d8={x0,y0} |
84 | + "vld1.32 {d10}, [%2]! \n\t" //d10={x1,y1} |
85 | + "flds s18, [%1, #0] \n\t" //d9[0]={z0} |
86 | + "flds s22, [%2, #0] \n\t" //d11[0]={z1} |
87 | + "vmul.f32 d12, d8, d10 \n\t" //d0= d2*d4 |
88 | + "vpadd.f32 d12, d12, d12 \n\t" //d0 = d[0] + d[1] |
89 | + "vmla.f32 d12, d9, d11 \n\t" //d0 = d0 + d3*d5 |
90 | + "fmrs %0, s24 \n\t" //r0 = s0 |
91 | + : "=r"(dot), "+r"(v0), "+r"(v1): |
92 | + : "d8", "d9", "d10", "d11", "d12" |
93 | + |
94 | + ); |
95 | + return dot; |
96 | +} |
97 | + |
98 | +#endif |
99 | + |
100 | // 2008.03.29 H.Morii - added SSE 3DNOW! 3x3 1x3 matrix multiplication |
101 | // and 3DNOW! 4x4 4x4 matrix multiplication |
102 | // 2011-01-03 Balrog - removed because is in NASM format and not 64-bit compatible |
103 | // This will need fixing. |
104 | +#ifndef __ARM_NEON__ |
105 | MULMATRIX MulMatrices = MulMatricesC; |
106 | TRANSFORMVECTOR TransformVector = TransformVectorC; |
107 | TRANSFORMVECTOR InverseTransformVector = InverseTransformVectorC; |
108 | DOTPRODUCT DotProduct = DotProductC; |
109 | NORMALIZEVECTOR NormalizeVector = NormalizeVectorC; |
110 | +#endif |
111 | |
112 | void MulMatricesSSE(float m1[4][4],float m2[4][4],float r[4][4]) |
113 | { |
114 | @@ -361,6 +455,7 @@ |
115 | |
116 | void math_init() |
117 | { |
118 | +#ifndef __ARM_NEON__ |
119 | #ifndef _DEBUG |
120 | int IsSSE = FALSE; |
121 | #if defined(__GNUC__) && !defined(NO_ASM) && !defined(NOSSE) |
122 | @@ -429,4 +524,5 @@ |
123 | } |
124 | |
125 | #endif //_DEBUG |
126 | +#endif //__ARM_NEON__ |
127 | } |
128 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/3dmath.h ./Glide64/3dmath.h |
129 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/3dmath.h 2013-09-06 22:05:28.000000000 +0200 |
130 | +++ ./Glide64/3dmath.h 2013-09-14 19:01:12.000000000 +0200 |
131 | @@ -42,7 +42,22 @@ |
132 | void calc_sphere (VERTEX *v); |
133 | |
134 | void math_init(); |
135 | +#ifdef __ARM_NEON__ |
136 | +float DotProductC(register float *v1, register float *v2); |
137 | +void NormalizeVectorC(float *v); |
138 | +void TransformVectorC(float *src, float *dst, float mat[4][4]); |
139 | +void InverseTransformVectorC (float *src, float *dst, float mat[4][4]); |
140 | +void MulMatricesC(float m1[4][4],float m2[4][4],float r[4][4]); |
141 | +void MultMatrix_neon( float m0[4][4], float m1[4][4], float dest[4][4]); |
142 | +void Normalize_neon(float v[3]); |
143 | +float DotProduct_neon( float v0[3], float v1[3] ); |
144 | |
145 | +#define MulMatrices MulMatricesC //MultMatrix_neon |
146 | +#define TransformVector TransformVectorC |
147 | +#define InverseTransformVector InverseTransformVectorC |
148 | +#define DotProduct DotProductC //DotProduct_neon |
149 | +#define NormalizeVector NormalizeVectorC //Normalize_neon |
150 | +#else |
151 | typedef void (*MULMATRIX)(float m1[4][4],float m2[4][4],float r[4][4]); |
152 | extern MULMATRIX MulMatrices; |
153 | typedef void (*TRANSFORMVECTOR)(float *src,float *dst,float mat[4][4]); |
154 | @@ -52,3 +67,4 @@ |
155 | extern DOTPRODUCT DotProduct; |
156 | typedef void (*NORMALIZEVECTOR)(float *v); |
157 | extern NORMALIZEVECTOR NormalizeVector; |
158 | +#endif |
159 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/3dmathneon.cpp ./Glide64/3dmathneon.cpp |
160 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/3dmathneon.cpp 1970-01-01 01:00:00.000000000 +0100 |
161 | +++ ./Glide64/3dmathneon.cpp 2013-09-13 23:05:47.000000000 +0200 |
162 | @@ -0,0 +1,133 @@ |
163 | +#include "3dmath.h" |
164 | + |
165 | +static void MultMatrix_neon( float m0[4][4], float m1[4][4], float dest[4][4]) |
166 | +{ |
167 | + asm volatile ( |
168 | + "vld1.32 {d0, d1}, [%1]! \n\t" //q0 = m1 |
169 | + "vld1.32 {d2, d3}, [%1]! \n\t" //q1 = m1+4 |
170 | + "vld1.32 {d4, d5}, [%1]! \n\t" //q2 = m1+8 |
171 | + "vld1.32 {d6, d7}, [%1] \n\t" //q3 = m1+12 |
172 | + "vld1.32 {d16, d17}, [%0]! \n\t" //q8 = m0 |
173 | + "vld1.32 {d18, d19}, [%0]! \n\t" //q9 = m0+4 |
174 | + "vld1.32 {d20, d21}, [%0]! \n\t" //q10 = m0+8 |
175 | + "vld1.32 {d22, d23}, [%0] \n\t" //q11 = m0+12 |
176 | + |
177 | + "vmul.f32 q12, q8, d0[0] \n\t" //q12 = q8 * d0[0] |
178 | + "vmul.f32 q13, q8, d2[0] \n\t" //q13 = q8 * d2[0] |
179 | + "vmul.f32 q14, q8, d4[0] \n\t" //q14 = q8 * d4[0] |
180 | + "vmul.f32 q15, q8, d6[0] \n\t" //q15 = q8 * d6[0] |
181 | + "vmla.f32 q12, q9, d0[1] \n\t" //q12 = q9 * d0[1] |
182 | + "vmla.f32 q13, q9, d2[1] \n\t" //q13 = q9 * d2[1] |
183 | + "vmla.f32 q14, q9, d4[1] \n\t" //q14 = q9 * d4[1] |
184 | + "vmla.f32 q15, q9, d6[1] \n\t" //q15 = q9 * d6[1] |
185 | + "vmla.f32 q12, q10, d1[0] \n\t" //q12 = q10 * d0[0] |
186 | + "vmla.f32 q13, q10, d3[0] \n\t" //q13 = q10 * d2[0] |
187 | + "vmla.f32 q14, q10, d5[0] \n\t" //q14 = q10 * d4[0] |
188 | + "vmla.f32 q15, q10, d7[0] \n\t" //q15 = q10 * d6[0] |
189 | + "vmla.f32 q12, q11, d1[1] \n\t" //q12 = q11 * d0[1] |
190 | + "vmla.f32 q13, q11, d3[1] \n\t" //q13 = q11 * d2[1] |
191 | + "vmla.f32 q14, q11, d5[1] \n\t" //q14 = q11 * d4[1] |
192 | + "vmla.f32 q15, q11, d7[1] \n\t" //q15 = q11 * d6[1] |
193 | + |
194 | + "vst1.32 {d24, d25}, [%2]! \n\t" //d = q12 |
195 | + "vst1.32 {d26, d27}, [%2]! \n\t" //d+4 = q13 |
196 | + "vst1.32 {d28, d29}, [%2]! \n\t" //d+8 = q14 |
197 | + "vst1.32 {d30, d31}, [%2] \n\t" //d+12 = q15 |
198 | + |
199 | + :"+r"(m0), "+r"(m1), "+r"(dest): |
200 | + : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", |
201 | + "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", |
202 | + "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", |
203 | + "memory" |
204 | + ); |
205 | +} |
206 | + |
207 | +static void TransformVectorNormalize_neon(float vec[3], float mtx[4][4]) |
208 | +{ |
209 | + asm volatile ( |
210 | + "vld1.32 {d0}, [%1] \n\t" //Q0 = v |
211 | + "flds s2, [%1, #8] \n\t" //Q0 = v |
212 | + "vld1.32 {d18, d19}, [%0]! \n\t" //Q1 = m |
213 | + "vld1.32 {d20, d21}, [%0]! \n\t" //Q2 = m+4 |
214 | + "vld1.32 {d22, d23}, [%0] \n\t" //Q3 = m+8 |
215 | + |
216 | + "vmul.f32 q2, q9, d0[0] \n\t" //q2 = q9*Q0[0] |
217 | + "vmla.f32 q2, q10, d0[1] \n\t" //Q5 += Q1*Q0[1] |
218 | + "vmla.f32 q2, q11, d1[0] \n\t" //Q5 += Q2*Q0[2] |
219 | + |
220 | + "vmul.f32 d0, d4, d4 \n\t" //d0 = d0*d0 |
221 | + "vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1] |
222 | + "vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d1*d1 |
223 | + |
224 | + "vmov.f32 d1, d0 \n\t" //d1 = d0 |
225 | + "vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0) |
226 | + "vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1 |
227 | + "vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2 |
228 | + "vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3 |
229 | + "vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1 |
230 | + "vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2 |
231 | + "vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4 |
232 | + |
233 | + "vmul.f32 q2, q2, d0[0] \n\t" //d0= d2*d4 |
234 | + |
235 | + "vst1.32 {d4}, [%1] \n\t" //Q4 = m+12 |
236 | + "fsts s10, [%1, #8] \n\t" //Q4 = m+12 |
237 | + : "+r"(mtx): "r"(vec) |
238 | + : "d0","d1","d2","d3","d18","d19","d20","d21","d22", "d23", "memory" |
239 | + ); |
240 | +} |
241 | + |
242 | +static void Normalize_neon(float v[3]) |
243 | +{ |
244 | + asm volatile ( |
245 | + "vld1.32 {d4}, [%0]! \n\t" //d4={x,y} |
246 | + "flds s10, [%0] \n\t" //d5[0] = z |
247 | + "sub %0, %0, #8 \n\t" //d5[0] = z |
248 | + "vmul.f32 d0, d4, d4 \n\t" //d0= d4*d4 |
249 | + "vpadd.f32 d0, d0, d0 \n\t" //d0 = d[0] + d[1] |
250 | + "vmla.f32 d0, d5, d5 \n\t" //d0 = d0 + d5*d5 |
251 | + |
252 | + "vmov.f32 d1, d0 \n\t" //d1 = d0 |
253 | + "vrsqrte.f32 d0, d0 \n\t" //d0 = ~ 1.0 / sqrt(d0) |
254 | + "vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1 |
255 | + "vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d2) / 2 |
256 | + "vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d3 |
257 | + "vmul.f32 d2, d0, d1 \n\t" //d2 = d0 * d1 |
258 | + "vrsqrts.f32 d3, d2, d0 \n\t" //d3 = (3 - d0 * d3) / 2 |
259 | + "vmul.f32 d0, d0, d3 \n\t" //d0 = d0 * d4 |
260 | + |
261 | + "vmul.f32 q2, q2, d0[0] \n\t" //d0= d2*d4 |
262 | + "vst1.32 {d4}, [%0]! \n\t" //d2={x0,y0}, d3={z0, w0} |
263 | + "fsts s10, [%0] \n\t" //d2={x0,y0}, d3={z0, w0} |
264 | + |
265 | + :"+r"(v) : |
266 | + : "d0", "d1", "d2", "d3", "d4", "d5", "memory" |
267 | + ); |
268 | +} |
269 | + |
270 | +static float DotProduct_neon( float v0[3], float v1[3] ) |
271 | +{ |
272 | + float dot; |
273 | + asm volatile ( |
274 | + "vld1.32 {d8}, [%1]! \n\t" //d8={x0,y0} |
275 | + "vld1.32 {d10}, [%2]! \n\t" //d10={x1,y1} |
276 | + "flds s18, [%1, #0] \n\t" //d9[0]={z0} |
277 | + "flds s22, [%2, #0] \n\t" //d11[0]={z1} |
278 | + "vmul.f32 d12, d8, d10 \n\t" //d0= d2*d4 |
279 | + "vpadd.f32 d12, d12, d12 \n\t" //d0 = d[0] + d[1] |
280 | + "vmla.f32 d12, d9, d11 \n\t" //d0 = d0 + d3*d5 |
281 | + "fmrs %0, s24 \n\t" //r0 = s0 |
282 | + : "=r"(dot), "+r"(v0), "+r"(v1): |
283 | + : "d8", "d9", "d10", "d11", "d12" |
284 | + |
285 | + ); |
286 | + return dot; |
287 | +} |
288 | + |
289 | +void MathInitNeon() |
290 | +{ |
291 | + MulMatrices = MultMatrix_neon; |
292 | + //TransformVectorNormalize = TransformVectorNormalize_neon; |
293 | + NormalizeVector = Normalize_neon; |
294 | + DotProduct = DotProduct_neon; |
295 | +} |
296 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/Config.cpp ./Glide64/Config.cpp |
297 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/Config.cpp 2013-09-06 22:05:29.000000000 +0200 |
298 | +++ ./Glide64/Config.cpp 2013-09-07 10:51:27.000000000 +0200 |
299 | @@ -89,7 +89,7 @@ |
300 | { 640, 480 }, |
301 | { 800, 600 }, |
302 | { 960, 720 }, |
303 | - { 856, 480 }, |
304 | + { 800, 480 }, |
305 | { 512, 256 }, |
306 | { 1024, 768 }, |
307 | { 1280, 1024 }, |
308 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/CRC.cpp ./Glide64/CRC.cpp |
309 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/CRC.cpp 2013-09-06 22:05:28.000000000 +0200 |
310 | +++ ./Glide64/CRC.cpp 2013-09-08 13:12:00.000000000 +0200 |
311 | @@ -43,6 +43,7 @@ |
312 | // |
313 | //**************************************************************** |
314 | //* |
315 | + |
316 | #define CRC32_POLYNOMIAL 0x04C11DB7 |
317 | |
318 | unsigned int CRCTable[ 256 ]; |
319 | @@ -140,3 +141,4 @@ |
320 | return Crc32; |
321 | } |
322 | //*/ |
323 | + |
324 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/FBtoScreen.cpp ./Glide64/FBtoScreen.cpp |
325 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/FBtoScreen.cpp 2013-09-06 22:05:29.000000000 +0200 |
326 | +++ ./Glide64/FBtoScreen.cpp 2013-09-08 11:57:33.000000000 +0200 |
327 | @@ -165,12 +165,15 @@ |
328 | for (wxUint32 w = 0; w < 256; w++) |
329 | { |
330 | col = *(src++); |
331 | - r = (wxUint8)((col >> 24)&0xFF); |
332 | + r = (wxUint8)((col >> (24+3))&0x1F); |
333 | + g = (wxUint8)((col >> (16+2))&0x3F); |
334 | + b = (wxUint8)((col >> (8+3))&0x1F); |
335 | +/* r = (wxUint8)((col >> 24)&0xFF); |
336 | r = (wxUint8)((float)r / 255.0f * 31.0f); |
337 | g = (wxUint8)((col >> 16)&0xFF); |
338 | g = (wxUint8)((float)g / 255.0f * 63.0f); |
339 | b = (wxUint8)((col >> 8)&0xFF); |
340 | - b = (wxUint8)((float)b / 255.0f * 31.0f); |
341 | + b = (wxUint8)((float)b / 255.0f * 31.0f);*/ //*SEB* |
342 | *(dst++) = (r << 11) | (g << 5) | b; |
343 | } |
344 | src += (fb_info.width - 256); |
345 | @@ -261,12 +264,15 @@ |
346 | if (idx >= bound) |
347 | break; |
348 | c32 = src32[idx]; |
349 | - r = (wxUint8)((c32 >> 24)&0xFF); |
350 | + r = (wxUint8)((c32 >> (24+3))&0x1F); |
351 | + g = (wxUint8)((c32 >> (16+2))&0x3F); |
352 | + b = (wxUint8)((c32 >> (8+3))&0x1F); |
353 | +/* r = (wxUint8)((c32 >> 24)&0xFF); |
354 | r = (wxUint8)((float)r / 255.0f * 31.0f); |
355 | g = (wxUint8)((c32 >> 16)&0xFF); |
356 | g = (wxUint8)((float)g / 255.0f * 63.0f); |
357 | b = (wxUint8)((c32 >> 8)&0xFF); |
358 | - b = (wxUint8)((float)b / 255.0f * 31.0f); |
359 | + b = (wxUint8)((float)b / 255.0f * 31.0f);*/ //*SEB* |
360 | a = (c32&0xFF) ? 1 : 0; |
361 | *(dst++) = (a<<15) | (r << 10) | (g << 5) | b; |
362 | } |
363 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/Gfx_1.3.h ./Glide64/Gfx_1.3.h |
364 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/Gfx_1.3.h 2013-09-06 22:05:29.000000000 +0200 |
365 | +++ ./Glide64/Gfx_1.3.h 2013-09-08 16:22:57.000000000 +0200 |
366 | @@ -106,6 +106,8 @@ |
367 | // ** TAKE OUT BEFORE RELEASE!!! ** |
368 | //#define LOGGING // log of spec functions called |
369 | //#define LOG_KEY // says "Key!!!" in the log when space bar is pressed |
370 | +//#define EXT_LOGGING |
371 | +//#define PERFORMANCE |
372 | |
373 | //#define LOG_UCODE |
374 | |
375 | @@ -120,15 +122,15 @@ |
376 | |
377 | #define FPS // fps counter able? (not enabled necessarily) |
378 | |
379 | -#define LOGNOTKEY // Log if not pressing: |
380 | -#define LOGKEY 0x11 // this key (CONTROL) |
381 | +//#define LOGNOTKEY // Log if not pressing: |
382 | +//#define LOGKEY 0x11 // this key (CONTROL) |
383 | |
384 | //#define LOG_COMMANDS // log the whole 64-bit command as (0x........, 0x........) |
385 | |
386 | #define CATCH_EXCEPTIONS // catch exceptions so it doesn't freeze and will report |
387 | // "The gfx plugin has caused an exception" instead. |
388 | |
389 | -#define FLUSH // flush the file buffer. slower logging, but makes sure |
390 | +//#define FLUSH // flush the file buffer. slower logging, but makes sure |
391 | // the command is logged before continuing (in case of |
392 | // crash or exception, the log will not be cut short) |
393 | #ifndef _ENDUSER_RELEASE_ |
394 | @@ -144,7 +146,7 @@ |
395 | |
396 | |
397 | // Usually enabled |
398 | -#define LARGE_TEXTURE_HANDLING // allow large-textured objects to be split? |
399 | +//#define LARGE_TEXTURE_HANDLING // allow large-textured objects to be split? |
400 | |
401 | #ifdef ALTTAB_FIX |
402 | extern HHOOK hhkLowLevelKybd; |
403 | @@ -189,7 +191,6 @@ |
404 | |
405 | int CheckKeyPressed(int key, int mask); |
406 | |
407 | -//#define PERFORMANCE |
408 | #ifdef PERFORMANCE |
409 | extern int64 perf_cur; |
410 | extern int64 perf_next; |
411 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/Main.cpp ./Glide64/Main.cpp |
412 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/Main.cpp 2013-09-06 22:05:29.000000000 +0200 |
413 | +++ ./Glide64/Main.cpp 2013-09-15 17:06:29.000000000 +0200 |
414 | @@ -170,7 +170,7 @@ |
415 | // 60=0x0, 70=0x1, 72=0x2, 75=0x3, 80=0x4, 90=0x5, 100=0x6, 85=0x7, 120=0x8, none=0xff |
416 | |
417 | #ifdef PAULSCODE |
418 | -#include "ae_bridge.h" |
419 | +//#include "ae_bridge.h" |
420 | #include "FrameSkipper.h" |
421 | FrameSkipper frameSkipper; |
422 | #endif |
423 | @@ -1768,12 +1768,13 @@ |
424 | EXPORT void CALL RomClosed (void) |
425 | { |
426 | VLOG ("RomClosed ()\n"); |
427 | +printf("RomClosed ()\n"); |
428 | |
429 | CLOSE_RDP_LOG (); |
430 | CLOSE_RDP_E_LOG (); |
431 | rdp.window_changed = TRUE; |
432 | romopen = FALSE; |
433 | - if (fullscreen && evoodoo) |
434 | +// if (fullscreen && evoodoo)//*SEB* |
435 | ReleaseGfx (); |
436 | } |
437 | |
438 | @@ -1973,9 +1974,6 @@ |
439 | wxUint32 update_screen_count = 0; |
440 | EXPORT void CALL UpdateScreen (void) |
441 | { |
442 | -#ifdef PAULSCODE |
443 | - frameSkipper.update(); |
444 | -#endif |
445 | #ifdef LOG_KEY |
446 | if (CheckKeyPressed(G64_VK_SPACE, 0x0001)) |
447 | { |
448 | @@ -2020,6 +2018,9 @@ |
449 | no_dlist = true; |
450 | ClearCache (); |
451 | UpdateScreen(); |
452 | +#ifdef PAULSCODE |
453 | + frameSkipper.update(); |
454 | +#endif |
455 | return; |
456 | } |
457 | //*/ |
458 | @@ -2035,11 +2036,17 @@ |
459 | rdp.updatescreen = 1; |
460 | newSwapBuffers (); |
461 | } |
462 | +#ifdef PAULSCODE |
463 | + frameSkipper.update(); |
464 | +#endif |
465 | return; |
466 | } |
467 | //*/ |
468 | if (settings.swapmode == 0) |
469 | newSwapBuffers (); |
470 | +#ifdef PAULSCODE |
471 | + frameSkipper.update(); |
472 | +#endif |
473 | } |
474 | |
475 | static void DrawWholeFrameBufferToScreen() |
476 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/rdp.cpp ./Glide64/rdp.cpp |
477 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/rdp.cpp 2013-09-06 22:05:29.000000000 +0200 |
478 | +++ ./Glide64/rdp.cpp 2013-09-13 22:23:52.000000000 +0200 |
479 | @@ -56,6 +56,10 @@ |
480 | extern FrameSkipper frameSkipper; |
481 | #endif |
482 | |
483 | +#ifdef PERFORMANCE |
484 | +#include "ticks.h" |
485 | +#endif |
486 | + |
487 | /* |
488 | const int NumOfFormats = 3; |
489 | SCREEN_SHOT_FORMAT ScreenShotFormats[NumOfFormats] = { {wxT("BMP"), wxT("bmp"), wxBITMAP_TYPE_BMP}, {wxT("PNG"), wxT("png"), wxBITMAP_TYPE_PNG}, {wxT("JPEG"), wxT("jpeg"), wxBITMAP_TYPE_JPEG} }; |
490 | @@ -633,18 +637,21 @@ |
491 | |
492 | EXPORT void CALL ProcessDList(void) |
493 | { |
494 | - SoftLocker lock(mutexProcessDList); |
495 | +// SoftLocker lock(mutexProcessDList); |
496 | #ifdef PAULSCODE |
497 | - if (frameSkipper.willSkipNext() || !lock.IsOk()) //mutex is busy |
498 | + if (frameSkipper.willSkipNext() /*|| !lock.IsOk()*/) //mutex is busy |
499 | #else |
500 | - if (!lock.IsOk()) //mutex is busy |
501 | + if (/*!lock.IsOk()*/0) //mutex is busy |
502 | #endif |
503 | { |
504 | +// printf("Frameskip, reason=%s\n", (lock.IsOk())?"lock":"frameskip"); |
505 | if (!fullscreen) |
506 | drawNoFullscreenMessage(); |
507 | // Set an interrupt to allow the game to continue |
508 | *gfx.MI_INTR_REG |= 0x20; |
509 | gfx.CheckInterrupts(); |
510 | + *gfx.MI_INTR_REG |= 0x01; |
511 | + gfx.CheckInterrupts(); |
512 | return; |
513 | } |
514 | |
515 | @@ -717,7 +724,18 @@ |
516 | unimp.close(); |
517 | } |
518 | #endif |
519 | - |
520 | +/* |
521 | +#ifdef PAULSCODE |
522 | + if (frameSkipper.willSkipNext()) |
523 | + { |
524 | + *gfx.MI_INTR_REG |= 0x20; |
525 | + gfx.CheckInterrupts(); |
526 | + *gfx.MI_INTR_REG |= 0x01; |
527 | + gfx.CheckInterrupts(); |
528 | + return; |
529 | + } |
530 | +#endif |
531 | +*/ |
532 | //* Set states *// |
533 | if (settings.swapmode > 0) |
534 | SwapOK = TRUE; |
535 | @@ -818,7 +836,7 @@ |
536 | rdp.pc[rdp.pc_i] = (a+8) & BMASK; |
537 | |
538 | #ifdef PERFORMANCE |
539 | - perf_cur = wxDateTime::UNow(); |
540 | + perf_cur = ticksGetTicks(); |
541 | #endif |
542 | // Process this instruction |
543 | gfx_instruction[settings.ucode][rdp.cmd0>>24] (); |
544 | @@ -837,9 +855,13 @@ |
545 | } |
546 | |
547 | #ifdef PERFORMANCE |
548 | - perf_next = wxDateTime::UNow(); |
549 | - sprintf (out_buf, "perf %08lx: %016I64d\n", a-8, (perf_next-perf_cur).Format(_T("%l")).mb_str()); |
550 | + perf_next = ticksGetTicks(); |
551 | + sprintf (out_buf, "perf %08x: %lli\n", a-8, (perf_next-perf_cur)); |
552 | +#ifdef RDP_LOGGING |
553 | rdp_log << out_buf; |
554 | +#else |
555 | + printf(out_buf); |
556 | +#endif |
557 | #endif |
558 | |
559 | } while (!rdp.halt); |
560 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/Util.cpp ./Glide64/Util.cpp |
561 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glide64/Util.cpp 2013-09-06 22:05:29.000000000 +0200 |
562 | +++ ./Glide64/Util.cpp 2013-09-08 12:39:52.000000000 +0200 |
563 | @@ -289,29 +289,29 @@ |
564 | deltaZ = dzdx = 0; |
565 | if (linew == 0 && (fb_depth_render_enabled || (rdp.rm & 0xC00) == 0xC00)) |
566 | { |
567 | - double X0 = vtx[0]->sx / rdp.scale_x; |
568 | - double Y0 = vtx[0]->sy / rdp.scale_y; |
569 | - double X1 = vtx[1]->sx / rdp.scale_x; |
570 | - double Y1 = vtx[1]->sy / rdp.scale_y; |
571 | - double X2 = vtx[2]->sx / rdp.scale_x; |
572 | - double Y2 = vtx[2]->sy / rdp.scale_y; |
573 | - double diffy_02 = Y0 - Y2; |
574 | - double diffy_12 = Y1 - Y2; |
575 | - double diffx_02 = X0 - X2; |
576 | - double diffx_12 = X1 - X2; |
577 | - |
578 | - double denom = (diffx_02 * diffy_12 - diffx_12 * diffy_02); |
579 | - if(denom*denom > 0.0) |
580 | - { |
581 | - double diffz_02 = vtx[0]->sz - vtx[2]->sz; |
582 | - double diffz_12 = vtx[1]->sz - vtx[2]->sz; |
583 | - double fdzdx = (diffz_02 * diffy_12 - diffz_12 * diffy_02) / denom; |
584 | + float X0 = vtx[0]->sx / rdp.scale_x; |
585 | + float Y0 = vtx[0]->sy / rdp.scale_y; |
586 | + float X1 = vtx[1]->sx / rdp.scale_x; |
587 | + float Y1 = vtx[1]->sy / rdp.scale_y; |
588 | + float X2 = vtx[2]->sx / rdp.scale_x; |
589 | + float Y2 = vtx[2]->sy / rdp.scale_y; |
590 | + float diffy_02 = Y0 - Y2; |
591 | + float diffy_12 = Y1 - Y2; |
592 | + float diffx_02 = X0 - X2; |
593 | + float diffx_12 = X1 - X2; |
594 | + |
595 | + float denom = (diffx_02 * diffy_12 - diffx_12 * diffy_02); |
596 | + if(denom*denom > 0.0f) |
597 | + { |
598 | + float diffz_02 = vtx[0]->sz - vtx[2]->sz; |
599 | + float diffz_12 = vtx[1]->sz - vtx[2]->sz; |
600 | + float fdzdx = (diffz_02 * diffy_12 - diffz_12 * diffy_02) / denom; |
601 | if ((rdp.rm & 0xC00) == 0xC00) { |
602 | // Calculate deltaZ per polygon for Decal z-mode |
603 | - double fdzdy = (diffz_02 * diffx_12 - diffz_12 * diffx_02) / denom; |
604 | - double fdz = fabs(fdzdx) + fabs(fdzdy); |
605 | + float fdzdy = (diffz_02 * diffx_12 - diffz_12 * diffx_02) / denom; |
606 | + float fdz = fabs(fdzdx) + fabs(fdzdy); |
607 | if ((settings.hacks & hack_Zelda) && (rdp.rm & 0x800)) |
608 | - fdz *= 4.0; // Decal mode in Zelda sometimes needs mutiplied deltaZ to work correct, e.g. roads |
609 | + fdz *= 4.0f; // Decal mode in Zelda sometimes needs mutiplied deltaZ to work correct, e.g. roads |
610 | deltaZ = max(8, (int)fdz); |
611 | } |
612 | dzdx = (int)(fdzdx * 65536.0); |
613 | @@ -881,12 +881,12 @@ |
614 | //*/ |
615 | |
616 | typedef struct { |
617 | - double d; |
618 | - double x; |
619 | - double y; |
620 | + float d; //*SEB* was doubles |
621 | + float x; |
622 | + float y; |
623 | } LineEuqationType; |
624 | |
625 | -static double EvaLine(LineEuqationType &li, double x, double y) |
626 | +static float EvaLine(LineEuqationType &li, float x, float y) //*SEB* all double before |
627 | { |
628 | return li.x*x+li.y*y+li.d; |
629 | } |
630 | @@ -906,7 +906,7 @@ |
631 | } |
632 | |
633 | |
634 | -__inline double interp3p(float a, float b, float c, double r1, double r2) |
635 | +__inline float interp3p(float a, float b, float c, float r1, float r2) //*SEB* r1 and r2 and function was double |
636 | { |
637 | return (a)+(((b)+((c)-(b))*(r2))-(a))*(r1); |
638 | } |
639 | @@ -915,34 +915,34 @@ |
640 | (a+(((b)+((c)-(b))*(r2))-(a))*(r1)) |
641 | */ |
642 | |
643 | -static void InterpolateColors3(VERTEX &v1, VERTEX &v2, VERTEX &v3, VERTEX &out) |
644 | +static void InterpolateColors3(VERTEX &v1, VERTEX &v2, VERTEX &v3, VERTEX &out) //*SEB* all double before |
645 | { |
646 | |
647 | LineEuqationType line; |
648 | Create1LineEq(line, v2, v3, v1); |
649 | |
650 | - double aDot = (out.x*line.x + out.y*line.y); |
651 | - double bDot = (v1.sx*line.x + v1.sy*line.y); |
652 | + float aDot = (out.x*line.x + out.y*line.y); |
653 | + float bDot = (v1.sx*line.x + v1.sy*line.y); |
654 | |
655 | - double scale1 = ( - line.d - aDot) / ( bDot - aDot ); |
656 | + float scale1 = ( - line.d - aDot) / ( bDot - aDot ); |
657 | |
658 | - double tx = out.x + scale1 * (v1.sx - out.x); |
659 | - double ty = out.y + scale1 * (v1.sy - out.y); |
660 | + float tx = out.x + scale1 * (v1.sx - out.x); |
661 | + float ty = out.y + scale1 * (v1.sy - out.y); |
662 | |
663 | - double s1 = 101.0, s2 = 101.0; |
664 | - double den = tx - v1.sx; |
665 | - if (fabs(den) > 1.0) |
666 | + float s1 = 101.0, s2 = 101.0; |
667 | + float den = tx - v1.sx; |
668 | + if (fabsf(den) > 1.0) |
669 | s1 = (out.x-v1.sx)/den; |
670 | if (s1 > 100.0f) |
671 | s1 = (out.y-v1.sy)/(ty-v1.sy); |
672 | |
673 | den = v3.sx - v2.sx; |
674 | - if (fabs(den) > 1.0) |
675 | + if (fabsf(den) > 1.0) |
676 | s2 = (tx-v2.sx)/den; |
677 | if (s2 > 100.0f) |
678 | s2 =(ty-v2.sy)/(v3.sy-v2.sy); |
679 | |
680 | - double w = 1.0/interp3p(v1.oow,v2.oow,v3.oow,s1,s2); |
681 | + float w = 1.0/interp3p(v1.oow,v2.oow,v3.oow,s1,s2); |
682 | |
683 | out.r = real_to_char(interp3p(v1.r*v1.oow,v2.r*v2.oow,v3.r*v3.oow,s1,s2)*w); |
684 | out.g = real_to_char(interp3p(v1.g*v1.oow,v2.g*v2.oow,v3.g*v3.oow,s1,s2)*w); |
685 | @@ -976,8 +976,8 @@ |
686 | */ |
687 | float deltaS, deltaT; |
688 | float deltaX, deltaY; |
689 | - double deltaTexels, deltaPixels, lodFactor = 0; |
690 | - double intptr; |
691 | + float deltaTexels, deltaPixels, lodFactor = 0; //*SEB* double before |
692 | + float intptr; //*SEB* double before |
693 | float s_scale = rdp.tiles[rdp.cur_tile].width / 255.0f; |
694 | float t_scale = rdp.tiles[rdp.cur_tile].height / 255.0f; |
695 | if (settings.lodmode == 1) |
696 | @@ -1019,7 +1019,7 @@ |
697 | float lod_fraction = 1.0f; |
698 | if (lod_tile < rdp.cur_tile + rdp.mipmap_level) |
699 | { |
700 | - lod_fraction = max((float)modf(lodFactor / pow(2.,lod_tile),&intptr), rdp.prim_lodmin / 255.0f); |
701 | + lod_fraction = max((float)modff(lodFactor / powf(2.,lod_tile),&intptr), (float)rdp.prim_lodmin / 255.0f); |
702 | } |
703 | float detailmax; |
704 | if (cmb.dc0_detailmax < 0.5f) |
705 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/GlideHQ/TxDbg.cpp ./GlideHQ/TxDbg.cpp |
706 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/GlideHQ/TxDbg.cpp 2013-09-06 22:05:30.000000000 +0200 |
707 | +++ ./GlideHQ/TxDbg.cpp 2013-09-07 12:06:11.000000000 +0200 |
708 | @@ -28,6 +28,8 @@ |
709 | #include <stdarg.h> |
710 | #include <string> |
711 | |
712 | +#define _GLIBCXX_HAVE_BROKEN_VSWPRINTF 1 |
713 | + |
714 | TxDbg::TxDbg() |
715 | { |
716 | _level = DBG_LEVEL; |
717 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glitch64/combiner.cpp ./Glitch64/combiner.cpp |
718 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glitch64/combiner.cpp 2013-09-06 22:05:30.000000000 +0200 |
719 | +++ ./Glitch64/combiner.cpp 2013-09-14 10:16:36.000000000 +0200 |
720 | @@ -29,6 +29,8 @@ |
721 | #include "glide.h" |
722 | #include "main.h" |
723 | |
724 | +#define GLchar char |
725 | + |
726 | void vbo_draw(); |
727 | |
728 | static int fct[4], source0[4], operand0[4], source1[4], operand1[4], source2[4], operand2[4]; |
729 | @@ -117,10 +119,11 @@ |
730 | // using gl_FragCoord is terribly slow on ATI and varying variables don't work for some unknown |
731 | // reason, so we use the unused components of the texture2 coordinates |
732 | static const char* fragment_shader_dither = |
733 | -" float dithx = (gl_TexCoord[2].b + 1.0)*0.5*1000.0; \n" |
734 | +" \n" |
735 | +/*" float dithx = (gl_TexCoord[2].b + 1.0)*0.5*1000.0; \n" |
736 | " float dithy = (gl_TexCoord[2].a + 1.0)*0.5*1000.0; \n" |
737 | " if(texture2D(ditherTex, vec2((dithx-32.0*floor(dithx/32.0))/32.0, \n" |
738 | -" (dithy-32.0*floor(dithy/32.0))/32.0)).a > 0.5) discard; \n" |
739 | +" (dithy-32.0*floor(dithy/32.0))/32.0)).a > 0.5) discard; \n"*/ |
740 | ; |
741 | |
742 | static const char* fragment_shader_default = |
743 | @@ -165,11 +168,16 @@ |
744 | "} \n" |
745 | ; |
746 | |
747 | +static const char* fragment_shader_alt_end = |
748 | +" \n" |
749 | +"} \n" |
750 | +; |
751 | + |
752 | static const char* vertex_shader = |
753 | SHADER_HEADER |
754 | "#define Z_MAX 65536.0 \n" |
755 | "attribute highp vec4 aVertex; \n" |
756 | -"attribute highp vec4 aColor; \n" |
757 | +"attribute mediump vec4 aColor; \n" //*SEB* highp -> lowp |
758 | "attribute highp vec4 aMultiTexCoord0; \n" |
759 | "attribute highp vec4 aMultiTexCoord1; \n" |
760 | "attribute float aFog; \n" |
761 | @@ -245,7 +253,7 @@ |
762 | |
763 | // creating a fake texture |
764 | glBindTexture(GL_TEXTURE_2D, default_texture); |
765 | - glTexImage2D(GL_TEXTURE_2D, 0, 3, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); |
766 | + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); |
767 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
768 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
769 | |
770 | @@ -286,7 +294,7 @@ |
771 | strlen(fragment_shader_end)+1); |
772 | strcpy(fragment_shader, fragment_shader_header); |
773 | strcat(fragment_shader, fragment_shader_default); |
774 | - strcat(fragment_shader, fragment_shader_end); |
775 | + strcat(fragment_shader, fragment_shader_end); /*SEB*/ |
776 | glShaderSource(fragment_shader_object, 1, (const GLchar**)&fragment_shader, NULL); |
777 | free(fragment_shader); |
778 | |
779 | @@ -408,6 +416,7 @@ |
780 | int dither_enabled; |
781 | int blackandwhite0; |
782 | int blackandwhite1; |
783 | + int alpha_test; //*SEB* |
784 | GLuint fragment_shader_object; |
785 | GLuint program_object; |
786 | int texture0_location; |
787 | @@ -489,6 +498,8 @@ |
788 | int i; |
789 | int chroma_color_location; |
790 | int log_length; |
791 | + |
792 | + int noalpha; |
793 | |
794 | need_to_compile = 0; |
795 | |
796 | @@ -502,6 +513,7 @@ |
797 | prog.texture0_combinera == texture0_combinera_key && |
798 | prog.texture1_combinera == texture1_combinera_key && |
799 | prog.fog_enabled == fog_enabled && |
800 | + prog.alpha_test == alpha_test && //*SEB* |
801 | prog.chroma_enabled == chroma_enabled && |
802 | prog.dither_enabled == dither_enabled && |
803 | prog.blackandwhite0 == blackandwhite0 && |
804 | @@ -514,11 +526,13 @@ |
805 | } |
806 | } |
807 | |
808 | - if(shader_programs != NULL) |
809 | - shader_programs = (shader_program_key*)realloc(shader_programs, (number_of_programs+1)*sizeof(shader_program_key)); |
810 | + if(shader_programs != NULL) { |
811 | + if ((number_of_programs+1)>1024) |
812 | + shader_programs = (shader_program_key*)realloc(shader_programs, (number_of_programs+1)*sizeof(shader_program_key)); |
813 | + } |
814 | else |
815 | - shader_programs = (shader_program_key*)malloc(sizeof(shader_program_key)); |
816 | - //printf("number of shaders %d\n", number_of_programs); |
817 | + shader_programs = (shader_program_key*)malloc(sizeof(shader_program_key)*1024); |
818 | + //printf("number of shaders %d\n", number_of_programs); |
819 | |
820 | shader_programs[number_of_programs].color_combiner = color_combiner_key; |
821 | shader_programs[number_of_programs].alpha_combiner = alpha_combiner_key; |
822 | @@ -531,6 +545,7 @@ |
823 | shader_programs[number_of_programs].dither_enabled = dither_enabled; |
824 | shader_programs[number_of_programs].blackandwhite0 = blackandwhite0; |
825 | shader_programs[number_of_programs].blackandwhite1 = blackandwhite1; |
826 | + shader_programs[number_of_programs].alpha_test = alpha_test; //*SEB* |
827 | |
828 | if(chroma_enabled) |
829 | { |
830 | @@ -557,7 +572,10 @@ |
831 | strcat(fragment_shader, fragment_shader_color_combiner); |
832 | strcat(fragment_shader, fragment_shader_alpha_combiner); |
833 | if(fog_enabled) strcat(fragment_shader, fragment_shader_fog); |
834 | - strcat(fragment_shader, fragment_shader_end); |
835 | + if (alpha_test) |
836 | + strcat(fragment_shader, fragment_shader_end); |
837 | + else |
838 | + strcat(fragment_shader, fragment_shader_alt_end); //*SEB* |
839 | if(chroma_enabled) strcat(fragment_shader, fragment_shader_chroma); |
840 | |
841 | shader_programs[number_of_programs].fragment_shader_object = glCreateShader(GL_FRAGMENT_SHADER); |
842 | @@ -1719,7 +1737,7 @@ |
843 | glActiveTexture(GL_TEXTURE2); |
844 | glEnable(GL_TEXTURE_2D); |
845 | glBindTexture(GL_TEXTURE_2D, 33*1024*1024); |
846 | - glTexImage2D(GL_TEXTURE_2D, 0, 4, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); |
847 | + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); |
848 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
849 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
850 | glDisable(GL_TEXTURE_2D); |
851 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glitch64/geometry.cpp ./Glitch64/geometry.cpp |
852 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glitch64/geometry.cpp 2013-09-06 22:05:30.000000000 +0200 |
853 | +++ ./Glitch64/geometry.cpp 2013-09-12 22:13:33.000000000 +0200 |
854 | @@ -34,7 +34,7 @@ |
855 | #define VERTEX_SIZE sizeof(VERTEX) //Size of vertex struct |
856 | |
857 | #ifdef PAULSCODE |
858 | -#include "ae_bridge.h" |
859 | +//#include "ae_bridge.h" |
860 | static float polygonOffsetFactor; |
861 | static float polygonOffsetUnits; |
862 | #endif |
863 | @@ -338,8 +338,11 @@ |
864 | void FindBestDepthBias() |
865 | { |
866 | #ifdef PAULSCODE |
867 | - int hardwareType = Android_JNI_GetHardwareType(); |
868 | - Android_JNI_GetPolygonOffset(hardwareType, 1, &polygonOffsetFactor, &polygonOffsetUnits); |
869 | +/* int hardwareType = Android_JNI_GetHardwareType(); |
870 | + Android_JNI_GetPolygonOffset(hardwareType, 1, &polygonOffsetFactor, &polygonOffsetUnits);*/ |
871 | +// glPolygonOffset(0.2f, 0.2f); |
872 | + polygonOffsetFactor=0.2f; |
873 | + polygonOffsetUnits=0.2f; |
874 | #else |
875 | float f, bestz = 0.25f; |
876 | int x; |
877 | @@ -386,7 +389,11 @@ |
878 | if (level) |
879 | { |
880 | #ifdef PAULSCODE |
881 | - glPolygonOffset(polygonOffsetFactor, polygonOffsetUnits); |
882 | +// glPolygonOffset(polygonOffsetFactor, polygonOffsetUnits); |
883 | + if(w_buffer_mode) |
884 | + glPolygonOffset(1.0f, -(float)level*polygonOffsetUnits); |
885 | + else |
886 | + glPolygonOffset(0, (float)level*3.0f); |
887 | #else |
888 | if(w_buffer_mode) |
889 | glPolygonOffset(1.0f, -(float)level*zscale/255.0f); |
890 | @@ -408,13 +415,13 @@ |
891 | grDrawTriangle( const void *a, const void *b, const void *c ) |
892 | { |
893 | LOG("grDrawTriangle()\r\n\t"); |
894 | - |
895 | +/* |
896 | if(nvidia_viewport_hack && !render_to_texture) |
897 | { |
898 | glViewport(0, viewport_offset, viewport_width, viewport_height); |
899 | nvidia_viewport_hack = 0; |
900 | } |
901 | - |
902 | +*/ |
903 | reloadTexture(); |
904 | |
905 | if(need_to_compile) compile_shader(); |
906 | @@ -588,13 +595,13 @@ |
907 | { |
908 | void **pointers = (void**)pointers2; |
909 | LOG("grDrawVertexArray(%d,%d)\r\n", mode, Count); |
910 | - |
911 | +/* |
912 | if(nvidia_viewport_hack && !render_to_texture) |
913 | { |
914 | glViewport(0, viewport_offset, viewport_width, viewport_height); |
915 | nvidia_viewport_hack = 0; |
916 | } |
917 | - |
918 | +*/ |
919 | reloadTexture(); |
920 | |
921 | if(need_to_compile) compile_shader(); |
922 | @@ -612,13 +619,13 @@ |
923 | grDrawVertexArrayContiguous(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride) |
924 | { |
925 | LOG("grDrawVertexArrayContiguous(%d,%d,%d)\r\n", mode, Count, stride); |
926 | - |
927 | +/* |
928 | if(nvidia_viewport_hack && !render_to_texture) |
929 | { |
930 | glViewport(0, viewport_offset, viewport_width, viewport_height); |
931 | nvidia_viewport_hack = 0; |
932 | } |
933 | - |
934 | +*/ |
935 | if(stride != 156) |
936 | { |
937 | LOGINFO("Incompatible stride\n"); |
938 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glitch64/glitchmain.cpp ./Glitch64/glitchmain.cpp |
939 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glitch64/glitchmain.cpp 2013-09-06 22:05:30.000000000 +0200 |
940 | +++ ./Glitch64/glitchmain.cpp 2013-09-15 17:13:49.000000000 +0200 |
941 | @@ -656,6 +656,9 @@ |
942 | #ifdef _WIN32 |
943 | glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)wglGetProcAddress("glCompressedTexImage2DARB"); |
944 | #endif |
945 | +/*SEB*/ |
946 | + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); |
947 | + glPixelStorei(GL_PACK_ALIGNMENT, 1); |
948 | |
949 | |
950 | #ifdef _WIN32 |
951 | @@ -806,6 +809,7 @@ |
952 | fullscreen = 0; |
953 | } |
954 | #else |
955 | + CoreVideo_Quit(); |
956 | //SDL_QuitSubSystem(SDL_INIT_VIDEO); |
957 | //sleep(2); |
958 | #endif |
959 | @@ -823,7 +827,7 @@ |
960 | int i; |
961 | static int fbs_init = 0; |
962 | |
963 | - //printf("grTextureBufferExt(%d, %d, %d, %d, %d, %d, %d)\r\n", tmu, startAddress, lodmin, lodmax, aspect, fmt, evenOdd); |
964 | + //printf("grTextureBufferExt(%d, %d, %d, %d, %d, %d, %d)\r\n", tmu, startAddress, lodmin, lodmax, aspect, fmt, evenOdd); |
965 | LOG("grTextureBufferExt(%d, %d, %d, %d %d, %d, %d)\r\n", tmu, startAddress, lodmin, lodmax, aspect, fmt, evenOdd); |
966 | if (lodmin != lodmax) display_warning("grTextureBufferExt : loading more than one LOD"); |
967 | if (!use_fbo) { |
968 | @@ -907,8 +911,8 @@ |
969 | tmu_usage[rtmu].min = pBufferAddress; |
970 | if ((unsigned int) tmu_usage[rtmu].max < pBufferAddress+size) |
971 | tmu_usage[rtmu].max = pBufferAddress+size; |
972 | - // printf("tmu %d usage now %gMb - %gMb\n", |
973 | - // rtmu, tmu_usage[rtmu].min/1024.0f, tmu_usage[rtmu].max/1024.0f); |
974 | + //printf("tmu %d usage now %gMb - %gMb\n", |
975 | + // rtmu, tmu_usage[rtmu].min/1024.0f, tmu_usage[rtmu].max/1024.0f); |
976 | |
977 | |
978 | width = pBufferWidth; |
979 | @@ -927,14 +931,14 @@ |
980 | texbufs[i].fmt = fmt; |
981 | if (i == texbuf_i) |
982 | texbuf_i = (texbuf_i+1)&(NB_TEXBUFS-1); |
983 | - //printf("texbuf %x fmt %x\n", pBufferAddress, fmt); |
984 | + //printf("texbuf %x fmt %x\n", pBufferAddress, fmt); |
985 | |
986 | // ZIGGY it speeds things up to not delete the buffers |
987 | // a better thing would be to delete them *sometimes* |
988 | // remove_tex(pBufferAddress+1, pBufferAddress + size); |
989 | add_tex(pBufferAddress); |
990 | |
991 | - //printf("viewport %dx%d\n", width, height); |
992 | + //printf("viewport %dx%d\n", width, height); |
993 | if (height > screen_height) { |
994 | glViewport( 0, viewport_offset + screen_height - height, width, height); |
995 | } else |
996 | @@ -1009,7 +1013,6 @@ |
997 | } |
998 | } |
999 | } |
1000 | - |
1001 | remove_tex(pBufferAddress, pBufferAddress + width*height*2/*grTexFormatSize(fmt)*/); |
1002 | //create new FBO |
1003 | glGenFramebuffers( 1, &(fbs[nb_fb].fbid) ); |
1004 | @@ -1768,6 +1771,7 @@ |
1005 | GrLfbInfo_t *info ) |
1006 | { |
1007 | LOG("grLfbLock(%d,%d,%d,%d,%d)\r\n", type, buffer, writeMode, origin, pixelPipeline); |
1008 | +//printf("grLfbLock(%d,%d,%d,%d,%d)\r\n", type, buffer, writeMode, origin, pixelPipeline); |
1009 | if (type == GR_LFB_WRITE_ONLY) |
1010 | { |
1011 | display_warning("grLfbLock : write only"); |
1012 | @@ -1792,12 +1796,32 @@ |
1013 | if(buffer != GR_BUFFER_AUXBUFFER) |
1014 | { |
1015 | if (writeMode == GR_LFBWRITEMODE_888) { |
1016 | +/*SEB*/ |
1017 | + buf = (unsigned char*)malloc(width*height*4); |
1018 | //printf("LfbLock GR_LFBWRITEMODE_888\n"); |
1019 | info->lfbPtr = frameBuffer; |
1020 | info->strideInBytes = width*4; |
1021 | info->writeMode = GR_LFBWRITEMODE_888; |
1022 | info->origin = origin; |
1023 | //glReadPixels(0, viewport_offset, width, height, GL_BGRA, GL_UNSIGNED_BYTE, frameBuffer); |
1024 | + glReadPixels(0, viewport_offset, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buf); |
1025 | + |
1026 | +/*SEB*/ |
1027 | + unsigned char *p=buf; |
1028 | + for (j=0; j<height; j++) |
1029 | + { |
1030 | + short unsigned int *f=frameBuffer+(height-j-1)*width; |
1031 | + for (i=0; i<width; i++) |
1032 | + { |
1033 | + *(f++) = |
1034 | + (*(p) <<24) | |
1035 | + (*(p+1) <<16) | |
1036 | + (*(p+2) << 8) | |
1037 | + (0xff); |
1038 | + p+=4; |
1039 | + } |
1040 | + } |
1041 | + free(buf); |
1042 | } else { |
1043 | buf = (unsigned char*)malloc(width*height*4); |
1044 | |
1045 | @@ -1807,14 +1831,22 @@ |
1046 | info->origin = origin; |
1047 | glReadPixels(0, viewport_offset, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buf); |
1048 | |
1049 | +/*SEB*/ |
1050 | + unsigned char *p=buf; |
1051 | for (j=0; j<height; j++) |
1052 | { |
1053 | + short unsigned int *f=frameBuffer+(height-j-1)*width; |
1054 | for (i=0; i<width; i++) |
1055 | { |
1056 | - frameBuffer[(height-j-1)*width+i] = |
1057 | +/* frameBuffer[(height-j-1)*width+i] = |
1058 | ((buf[j*width*4+i*4+0] >> 3) << 11) | |
1059 | ((buf[j*width*4+i*4+1] >> 2) << 5) | |
1060 | - (buf[j*width*4+i*4+2] >> 3); |
1061 | + (buf[j*width*4+i*4+2] >> 3);*/ |
1062 | + *(f++) = |
1063 | + ((*(p) >> 3) << 11) | |
1064 | + ((*(p+1) >> 2) << 5) | |
1065 | + (*(p+2) >> 3); |
1066 | + p+=4; |
1067 | } |
1068 | } |
1069 | free(buf); |
1070 | @@ -1826,6 +1858,7 @@ |
1071 | info->strideInBytes = width*2; |
1072 | info->writeMode = GR_LFBWRITEMODE_ZA16; |
1073 | info->origin = origin; |
1074 | + //*SEB* *TODO* check alignment |
1075 | glReadPixels(0, viewport_offset, width, height, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, depthBuffer); |
1076 | } |
1077 | } |
1078 | @@ -1855,6 +1888,7 @@ |
1079 | unsigned short *frameBuffer = (unsigned short*)dst_data; |
1080 | unsigned short *depthBuffer = (unsigned short*)dst_data; |
1081 | LOG("grLfbReadRegion(%d,%d,%d,%d,%d,%d)\r\n", src_buffer, src_x, src_y, src_width, src_height, dst_stride); |
1082 | +//printf("grLfbReadRegion(%d,%d,%d,%d,%d,%d)\r\n", src_buffer, src_x, src_y, src_width, src_height, dst_stride); |
1083 | |
1084 | switch(src_buffer) |
1085 | { |
1086 | @@ -1876,15 +1910,22 @@ |
1087 | buf = (unsigned char*)malloc(src_width*src_height*4); |
1088 | |
1089 | glReadPixels(src_x, (viewport_offset)+height-src_y-src_height, src_width, src_height, GL_RGBA, GL_UNSIGNED_BYTE, buf); |
1090 | - |
1091 | for (j=0; j<src_height; j++) |
1092 | { |
1093 | +/*SEB*/ |
1094 | + unsigned char *p=buf+(src_height-j-1)*src_width*4; |
1095 | + unsigned short *f=frameBuffer+(j*dst_stride/2); |
1096 | for (i=0; i<src_width; i++) |
1097 | { |
1098 | - frameBuffer[j*(dst_stride/2)+i] = |
1099 | +/* frameBuffer[j*(dst_stride/2)+i] = |
1100 | ((buf[(src_height-j-1)*src_width*4+i*4+0] >> 3) << 11) | |
1101 | ((buf[(src_height-j-1)*src_width*4+i*4+1] >> 2) << 5) | |
1102 | - (buf[(src_height-j-1)*src_width*4+i*4+2] >> 3); |
1103 | + (buf[(src_height-j-1)*src_width*4+i*4+2] >> 3);*/ |
1104 | + *(f++) = |
1105 | + ((*(p) >> 3) << 11) | |
1106 | + ((*(p+1) >> 2) << 5) | |
1107 | + (*(p+2) >> 3); |
1108 | + p+=4; |
1109 | } |
1110 | } |
1111 | free(buf); |
1112 | @@ -1892,15 +1933,19 @@ |
1113 | else |
1114 | { |
1115 | buf = (unsigned char*)malloc(src_width*src_height*2); |
1116 | - |
1117 | - glReadPixels(src_x, (viewport_offset)+height-src_y-src_height, src_width, src_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, depthBuffer); |
1118 | +//*SEB read in buf, not depthBuffer. |
1119 | + glReadPixels(src_x, (viewport_offset)+height-src_y-src_height, src_width, src_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, buf); |
1120 | |
1121 | for (j=0;j<src_height; j++) |
1122 | { |
1123 | +//*SEB* |
1124 | + unsigned short *d=depthBuffer+j*dst_stride/2; |
1125 | + unsigned short *p=(unsigned short*)buf+(src_height-j-1)*src_width; //orignal look fishy. why *4??? |
1126 | for (i=0; i<src_width; i++) |
1127 | { |
1128 | - depthBuffer[j*(dst_stride/2)+i] = |
1129 | - ((unsigned short*)buf)[(src_height-j-1)*src_width*4+i*4]; |
1130 | +/* depthBuffer[j*(dst_stride/2)+i] = |
1131 | + ((unsigned short*)buf)[(src_height-j-1)*src_width*4+i*4];*/ |
1132 | + *(d++) = *(p++); //why *4 (prob. GL_PACK was=4), plus transcoding to short, that make *8 ??? |
1133 | } |
1134 | } |
1135 | free(buf); |
1136 | @@ -1923,6 +1968,7 @@ |
1137 | int texture_number; |
1138 | unsigned int tex_width = 1, tex_height = 1; |
1139 | LOG("grLfbWriteRegion(%d,%d,%d,%d,%d,%d,%d,%d)\r\n",dst_buffer, dst_x, dst_y, src_format, src_width, src_height, pixelPipeline, src_stride); |
1140 | +//printf("grLfbWriteRegion(%d,%d,%d,%d,%d,%d,%d,%d)\r\n",dst_buffer, dst_x, dst_y, src_format, src_width, src_height, pixelPipeline, src_stride); |
1141 | |
1142 | //glPushAttrib(GL_ALL_ATTRIB_BITS); |
1143 | |
1144 | @@ -1949,6 +1995,12 @@ |
1145 | glActiveTexture(texture_number); |
1146 | |
1147 | const unsigned int half_stride = src_stride / 2; |
1148 | + |
1149 | + const int comp_stride = half_stride - src_width; |
1150 | + const int comp_tex = (tex_width - src_width)*4; |
1151 | + unsigned short *f=frameBuffer; |
1152 | + unsigned char *p=buf; |
1153 | + |
1154 | switch(src_format) |
1155 | { |
1156 | case GR_LFB_SRC_FMT_1555: |
1157 | @@ -1956,12 +2008,20 @@ |
1158 | { |
1159 | for (i=0; i<src_width; i++) |
1160 | { |
1161 | - const unsigned int col = frameBuffer[j*half_stride+i]; |
1162 | +/* const unsigned int col = frameBuffer[j*half_stride+i]; |
1163 | buf[j*tex_width*4+i*4+0]=((col>>10)&0x1F)<<3; |
1164 | buf[j*tex_width*4+i*4+1]=((col>>5)&0x1F)<<3; |
1165 | buf[j*tex_width*4+i*4+2]=((col>>0)&0x1F)<<3; |
1166 | - buf[j*tex_width*4+i*4+3]= (col>>15) ? 0xFF : 0; |
1167 | + buf[j*tex_width*4+i*4+3]= (col>>15) ? 0xFF : 0;*/ |
1168 | + const unsigned int col = *(f++); |
1169 | + *(p)=((col>>10)&0x1F)<<3; |
1170 | + *(p+1)=((col>>5)&0x1F)<<3; |
1171 | + *(p+2)=((col>>0)&0x1F)<<3; |
1172 | + *(p+3)= (col>>15) ? 0xFF : 0; |
1173 | + p+=4; |
1174 | } |
1175 | + p+=comp_tex; |
1176 | + f+=comp_stride; |
1177 | } |
1178 | break; |
1179 | case GR_LFBWRITEMODE_555: |
1180 | @@ -1969,12 +2029,20 @@ |
1181 | { |
1182 | for (i=0; i<src_width; i++) |
1183 | { |
1184 | - const unsigned int col = frameBuffer[j*half_stride+i]; |
1185 | +/* const unsigned int col = frameBuffer[j*half_stride+i]; |
1186 | buf[j*tex_width*4+i*4+0]=((col>>10)&0x1F)<<3; |
1187 | buf[j*tex_width*4+i*4+1]=((col>>5)&0x1F)<<3; |
1188 | buf[j*tex_width*4+i*4+2]=((col>>0)&0x1F)<<3; |
1189 | - buf[j*tex_width*4+i*4+3]=0xFF; |
1190 | + buf[j*tex_width*4+i*4+3]=0xFF;*/ |
1191 | + const unsigned int col = *(f++); |
1192 | + *(p)=((col>>10)&0x1F)<<3; |
1193 | + *(p+1)=((col>>5)&0x1F)<<3; |
1194 | + *(p+2)=((col>>0)&0x1F)<<3; |
1195 | + *(p+3)=0xFF; |
1196 | + p+=4; |
1197 | } |
1198 | + p+=comp_tex; |
1199 | + f+=comp_stride; |
1200 | } |
1201 | break; |
1202 | case GR_LFBWRITEMODE_565: |
1203 | @@ -1982,12 +2050,20 @@ |
1204 | { |
1205 | for (i=0; i<src_width; i++) |
1206 | { |
1207 | - const unsigned int col = frameBuffer[j*half_stride+i]; |
1208 | +/* const unsigned int col = frameBuffer[j*half_stride+i]; |
1209 | buf[j*tex_width*4+i*4+0]=((col>>11)&0x1F)<<3; |
1210 | buf[j*tex_width*4+i*4+1]=((col>>5)&0x3F)<<2; |
1211 | buf[j*tex_width*4+i*4+2]=((col>>0)&0x1F)<<3; |
1212 | - buf[j*tex_width*4+i*4+3]=0xFF; |
1213 | + buf[j*tex_width*4+i*4+3]=0xFF;*/ |
1214 | + const unsigned int col = *(f++); |
1215 | + *(p)=((col>>11)&0x1F)<<3; |
1216 | + *(p+1)=((col>>5)&0x3F)<<2; |
1217 | + *(p+2)=((col>>0)&0x1F)<<3; |
1218 | + *(p+3)=0xFF; |
1219 | + p+=4; |
1220 | } |
1221 | + p+=comp_tex; |
1222 | + f+=comp_stride; |
1223 | } |
1224 | break; |
1225 | default: |
1226 | @@ -2006,7 +2082,7 @@ |
1227 | #endif |
1228 | |
1229 | glBindTexture(GL_TEXTURE_2D, default_texture); |
1230 | - glTexImage2D(GL_TEXTURE_2D, 0, 4, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf); |
1231 | + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf); |
1232 | free(buf); |
1233 | |
1234 | set_copy_shader(); |
1235 | diff -Naur ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glitch64/textures.cpp ./Glitch64/textures.cpp |
1236 | --- ../../../../git/mupen64plus-ae/jni/gles2glide64/src/Glitch64/textures.cpp 2013-09-06 22:05:31.000000000 +0200 |
1237 | +++ ./Glitch64/textures.cpp 2013-09-13 11:32:50.000000000 +0200 |
1238 | @@ -26,6 +26,7 @@ |
1239 | #include "glide.h" |
1240 | #include "main.h" |
1241 | #include <stdio.h> |
1242 | +#include <string.h> |
1243 | |
1244 | /* Napalm extensions to GrTextureFormat_t */ |
1245 | #define GR_TEXFMT_ARGB_CMP_FXT1 0x11 |
1246 | @@ -107,7 +108,7 @@ |
1247 | } |
1248 | glDeleteTextures(n, t); |
1249 | free(t); |
1250 | - //printf("RMVTEX nbtex is now %d (%06x - %06x)\n", nbTex, idmin, idmax); |
1251 | +//printf("RMVTEX nbtex is now %d (%06x - %06x)\n", nbTex, idmin, idmax); |
1252 | } |
1253 | |
1254 | |
1255 | @@ -115,7 +116,7 @@ |
1256 | { |
1257 | texlist *aux = list; |
1258 | texlist *aux2; |
1259 | - //printf("ADDTEX nbtex is now %d (%06x)\n", nbTex, id); |
1260 | +//printf("ADDTEX nbtex is now %d (%06x)\n", nbTex, id); |
1261 | if (list == NULL || id < list->id) |
1262 | { |
1263 | nbTex++; |
1264 | @@ -435,8 +436,11 @@ |
1265 | factor = -1; |
1266 | else |
1267 | factor = grTexFormat2GLPackedFmt(info->format, &gltexfmt, &glpixfmt, &glpackfmt); |
1268 | - |
1269 | +//printf("grTexDownloadMipmap, id=%x, size=%ix%i, format=%x\n", startAddress+1, width, height, info->format); |
1270 | if (factor < 0) { |
1271 | + gltexfmt = GL_RGBA; |
1272 | + glpixfmt = GL_RGBA; |
1273 | + glpackfmt = GL_UNSIGNED_BYTE; |
1274 | |
1275 | // VP fixed the texture conversions to be more accurate, also swapped |
1276 | // the for i/j loops so that is is less likely to break the memory cache |
1277 | @@ -444,7 +448,7 @@ |
1278 | switch(info->format) |
1279 | { |
1280 | case GR_TEXFMT_ALPHA_8: |
1281 | - for (i=0; i<height; i++) |
1282 | + /* for (i=0; i<height; i++) |
1283 | { |
1284 | for (j=0; j<width; j++) |
1285 | { |
1286 | @@ -457,10 +461,25 @@ |
1287 | } |
1288 | } |
1289 | factor = 1; |
1290 | - glformat = GL_RGBA; |
1291 | + glformat = GL_RGBA;*/ |
1292 | + |
1293 | + for (i=0; i<height; i++) |
1294 | + { |
1295 | + for (j=0; j<width; j++) |
1296 | + { |
1297 | + unsigned short texel = (unsigned short)((unsigned char*)info->data)[m]; |
1298 | + ((unsigned short*)texture)[n] = texel|(texel<<8); |
1299 | + m++; |
1300 | + n++; |
1301 | + } |
1302 | + } |
1303 | + |
1304 | + glformat = gltexfmt = glpixfmt = GL_LUMINANCE_ALPHA; |
1305 | + glpackfmt = GL_UNSIGNED_BYTE; |
1306 | + factor = 1; |
1307 | break; |
1308 | case GR_TEXFMT_INTENSITY_8: // I8 support - H.Morii |
1309 | - for (i=0; i<height; i++) |
1310 | +/* for (i=0; i<height; i++) |
1311 | { |
1312 | for (j=0; j<width; j++) |
1313 | { |
1314 | @@ -470,9 +489,13 @@ |
1315 | m++; |
1316 | n++; |
1317 | } |
1318 | - } |
1319 | + }*/ |
1320 | + factor = 1; |
1321 | +// glformat = GL_ALPHA; |
1322 | + memcpy(texture, info->data, width*height); |
1323 | + glformat = gltexfmt = glpixfmt = GL_LUMINANCE; |
1324 | + glpackfmt = GL_UNSIGNED_BYTE; |
1325 | factor = 1; |
1326 | - glformat = GL_ALPHA; |
1327 | break; |
1328 | case GR_TEXFMT_ALPHA_INTENSITY_44: |
1329 | #if 1 |
1330 | @@ -480,9 +503,9 @@ |
1331 | { |
1332 | for (j=0; j<width; j++) |
1333 | { |
1334 | - unsigned int texel = (unsigned int)((unsigned char*)info->data)[m]; |
1335 | +/* unsigned int texel = (unsigned int)((unsigned char*)info->data)[m]; |
1336 | #if 1 |
1337 | - /* accurate conversion */ |
1338 | + // accurate conversion |
1339 | unsigned int texel_hi = (texel & 0x000000F0) << 20; |
1340 | unsigned int texel_low = texel & 0x0000000F; |
1341 | texel_low |= (texel_low << 4); |
1342 | @@ -493,61 +516,90 @@ |
1343 | texel_hi |= ((texel_low << 16) | (texel_low << 8) | texel_low); |
1344 | #endif |
1345 | ((unsigned int*)texture)[n] = texel_hi; |
1346 | +*/ |
1347 | + unsigned char texel = ((unsigned char*)info->data)[m]; |
1348 | + unsigned short texel_hi = (texel & 0x000000F0) << 4; |
1349 | + unsigned short texel_low = texel & 0x0000000F; |
1350 | + texel_low |= (texel_low << 4); |
1351 | + texel_hi |= ((texel_hi << 4) | (texel_low)); |
1352 | + ((unsigned short*)texture)[n] = texel_hi; |
1353 | m++; |
1354 | n++; |
1355 | } |
1356 | } |
1357 | factor = 1; |
1358 | - glformat = GL_LUMINANCE_ALPHA; |
1359 | + glformat = gltexfmt = glpixfmt = GL_LUMINANCE_ALPHA; |
1360 | + glpackfmt = GL_UNSIGNED_BYTE; |
1361 | +// glformat = GL_LUMINANCE_ALPHA; |
1362 | #endif |
1363 | break; |
1364 | case GR_TEXFMT_RGB_565: |
1365 | - for (i=0; i<height; i++) |
1366 | +/* for (i=0; i<height; i++) |
1367 | { |
1368 | for (j=0; j<width; j++) |
1369 | - { |
1370 | - unsigned int texel = (unsigned int)((unsigned short*)info->data)[m]; |
1371 | + {*/ |
1372 | +/* unsigned int texel = (unsigned int)((unsigned short*)info->data)[m]; |
1373 | unsigned int B = texel & 0x0000F800; |
1374 | unsigned int G = texel & 0x000007E0; |
1375 | unsigned int R = texel & 0x0000001F; |
1376 | #if 0 |
1377 | - /* accurate conversion */ |
1378 | + // accurate conversion |
1379 | ((unsigned int*)texture)[n] = 0xFF000000 | (R << 19) | ((R >> 2) << 16) | (G << 5) | ((G >> 9) << 8) | (B >> 8) | (B >> 13); |
1380 | #else |
1381 | ((unsigned int*)texture)[n] = 0xFF000000 | (R << 19) | (G << 5) | (B >> 8); |
1382 | #endif |
1383 | +*/ |
1384 | +/* const unsigned short texel = ((unsigned short*)info->data)[m]; |
1385 | + const unsigned short B = (texel & 0xF800)>>11; |
1386 | + const unsigned short G = texel & 0x07E0; |
1387 | + const unsigned short R = (texel & 0x001F)<<11; |
1388 | + ((unsigned short*)texture)[n] = R|G|B; |
1389 | m++; |
1390 | n++; |
1391 | } |
1392 | - } |
1393 | + }*/ |
1394 | + memcpy(texture, info->data, width*height*2); |
1395 | factor = 2; |
1396 | - glformat = GL_RGB; |
1397 | +// glformat = GL_RGB; |
1398 | + glformat = gltexfmt = glpixfmt = GL_RGB; |
1399 | + glpackfmt = GL_UNSIGNED_SHORT_5_6_5; |
1400 | break; |
1401 | case GR_TEXFMT_ARGB_1555: |
1402 | for (i=0; i<height; i++) |
1403 | { |
1404 | for (j=0; j<width; j++) |
1405 | { |
1406 | - unsigned int texel = (unsigned int)((unsigned short*)info->data)[m]; |
1407 | +/* unsigned int texel = (unsigned int)((unsigned short*)info->data)[m]; |
1408 | unsigned int A = texel & 0x00008000 ? 0xFF000000 : 0; |
1409 | unsigned int B = texel & 0x00007C00; |
1410 | unsigned int G = texel & 0x000003E0; |
1411 | unsigned int R = texel & 0x0000001F; |
1412 | #if 0 |
1413 | - /* accurate conversion */ |
1414 | + // accurate conversion |
1415 | ((unsigned int*)texture)[n] = A | (R << 19) | ((R >> 2) << 16) | (G << 6) | ((G >> 8) << 8) | (B >> 7) | (B >> 12); |
1416 | #else |
1417 | ((unsigned int*)texture)[n] = A | (R << 19) | (G << 6) | (B >> 7); |
1418 | #endif |
1419 | +*/ |
1420 | + unsigned short texel = ((unsigned short*)info->data)[m]; |
1421 | + unsigned short A = (texel & 0x8000)>>15; |
1422 | + ((unsigned short*)texture)[n] = A|(texel&0x7fff)<<1; |
1423 | +/* |
1424 | + unsigned short B = (texel & 0x7C00)>>9; |
1425 | + unsigned short G = texel & 0x03E0<<1; |
1426 | + unsigned short R = (texel & 0x001F)<<11; |
1427 | + ((unsigned short*)texture)[n] = A|R|G|B;*/ |
1428 | m++; |
1429 | n++; |
1430 | } |
1431 | } |
1432 | factor = 2; |
1433 | - glformat = GL_RGBA; |
1434 | +// glformat = GL_RGBA; |
1435 | + glformat = gltexfmt = glpixfmt = GL_RGBA; |
1436 | + glpackfmt = GL_UNSIGNED_SHORT_5_5_5_1; |
1437 | break; |
1438 | case GR_TEXFMT_ALPHA_INTENSITY_88: |
1439 | - for (i=0; i<height; i++) |
1440 | +/* for (i=0; i<height; i++) |
1441 | { |
1442 | for (j=0; j<width; j++) |
1443 | { |
1444 | @@ -557,9 +609,12 @@ |
1445 | m++; |
1446 | n++; |
1447 | } |
1448 | - } |
1449 | + }*/ |
1450 | + memcpy(texture, info->data, width*height*2); |
1451 | factor = 2; |
1452 | glformat = GL_LUMINANCE_ALPHA; |
1453 | + glformat = gltexfmt = glpixfmt = GL_LUMINANCE_ALPHA; |
1454 | + glpackfmt = GL_UNSIGNED_BYTE; |
1455 | break; |
1456 | case GR_TEXFMT_ARGB_4444: |
1457 | |
1458 | @@ -567,23 +622,29 @@ |
1459 | { |
1460 | for (j=0; j<width; j++) |
1461 | { |
1462 | - unsigned int texel = (unsigned int)((unsigned short*)info->data)[m]; |
1463 | +/* unsigned int texel = (unsigned int)((unsigned short*)info->data)[m]; |
1464 | unsigned int A = texel & 0x0000F000; |
1465 | unsigned int B = texel & 0x00000F00; |
1466 | unsigned int G = texel & 0x000000F0; |
1467 | unsigned int R = texel & 0x0000000F; |
1468 | #if 0 |
1469 | - /* accurate conversion */ |
1470 | + // accurate conversion |
1471 | ((unsigned int*)texture)[n] = (A << 16) | (A << 12) | (R << 20) | (R << 16) | (G << 8) | (G << 4) | (B >> 4) | (B >> 8); |
1472 | #else |
1473 | ((unsigned int*)texture)[n] = (A << 16) | (R << 20) | (G << 8) | (B >> 4); |
1474 | #endif |
1475 | +*/ |
1476 | + unsigned short texel = ((unsigned short*)info->data)[m]; |
1477 | + unsigned int A = (texel & 0xF000)>>12; |
1478 | + ((unsigned short*)texture)[n] = A|(texel&0x0fff)<<4; |
1479 | m++; |
1480 | n++; |
1481 | } |
1482 | } |
1483 | factor = 2; |
1484 | glformat = GL_RGBA; |
1485 | + glformat = gltexfmt = glpixfmt = GL_RGBA; |
1486 | + glpackfmt = GL_UNSIGNED_SHORT_4_4_4_4; |
1487 | break; |
1488 | case GR_TEXFMT_ARGB_8888: |
1489 | for (i=0; i<height; i++) |
1490 | @@ -650,7 +711,9 @@ |
1491 | if (largest_supported_anisotropy > 1.0f) |
1492 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_supported_anisotropy); |
1493 | |
1494 | - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); |
1495 | +//*SEB* glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); |
1496 | +//printf("new texture, id=%x, size=%ix%i, fmt=%x/%x\n", startAddress+1, width, height, gltexfmt, glpackfmt); |
1497 | + glTexImage2D(GL_TEXTURE_2D, 0, gltexfmt, width, height, 0, glpixfmt, glpackfmt, texture); |
1498 | /* |
1499 | switch(info->format) |
1500 | { |