GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / 2xSAI.cpp
CommitLineData
34cf4058 1#include "Types.h"
2//#include "GBI.h"
3
4static inline s16 GetResult1( u32 A, u32 B, u32 C, u32 D, u32 E )
5{
6 s16 x = 0;
7 s16 y = 0;
8 s16 r = 0;
9
10 if (A == C) x += 1; else if (B == C) y += 1;
11 if (A == D) x += 1; else if (B == D) y += 1;
12 if (x <= 1) r += 1;
13 if (y <= 1) r -= 1;
14
15 return r;
16}
17
18static inline s16 GetResult2( u32 A, u32 B, u32 C, u32 D, u32 E)
19{
20 s16 x = 0;
21 s16 y = 0;
22 s16 r = 0;
23
24 if (A == C) x += 1; else if (B == C) y += 1;
25 if (A == D) x += 1; else if (B == D) y += 1;
26 if (x <= 1) r -= 1;
27 if (y <= 1) r += 1;
28
29 return r;
30}
31
32
33static inline s16 GetResult( u32 A, u32 B, u32 C, u32 D )
34{
35 s16 x = 0;
36 s16 y = 0;
37 s16 r = 0;
38
39 if (A == C) x += 1; else if (B == C) y += 1;
40 if (A == D) x += 1; else if (B == D) y += 1;
41 if (x <= 1) r += 1;
42 if (y <= 1) r -= 1;
43
44 return r;
45}
46
47static inline u16 INTERPOLATE4444( u16 A, u16 B)
48{
49 if (A != B)
50 return ((A & 0xEEEE) >> 1) +
51 (((B & 0xEEEE) >> 1) |
52 (A & B & 0x1111));
53 else
54 return A;
55}
56
57static inline u16 INTERPOLATE5551( u16 A, u16 B)
58{
59 if (A != B)
60 return ((A & 0xF7BC) >> 1) +
61 (((B & 0xF7BC) >> 1) |
62 (A & B & 0x0843));
63 else
64 return A;
65}
66
67static inline u32 INTERPOLATE8888( u32 A, u32 B)
68{
69 if (A != B)
70 return ((A & 0xFEFEFEFE) >> 1) +
71 (((B & 0xFEFEFEFE) >> 1) |
72 (A & B & 0x01010101));
73 else
74 return A;
75}
76
77static inline u16 Q_INTERPOLATE4444( u16 A, u16 B, u16 C, u16 D)
78{
79 u16 x = ((A & 0xCCCC) >> 2) +
80 ((B & 0xCCCC) >> 2) +
81 ((C & 0xCCCC) >> 2) +
82 ((D & 0xCCCC) >> 2);
83 u16 y = (((A & 0x3333) +
84 (B & 0x3333) +
85 (C & 0x3333) +
86 (D & 0x3333)) >> 2) & 0x3333;
87 return x | y;
88}
89
90static inline u16 Q_INTERPOLATE5551( u16 A, u16 B, u16 C, u16 D)
91{
92 u16 x = ((A & 0xE738) >> 2) +
93 ((B & 0xE738) >> 2) +
94 ((C & 0xE738) >> 2) +
95 ((D & 0xE738) >> 2);
96 u16 y = (((A & 0x18C6) +
97 (B & 0x18C6) +
98 (C & 0x18C6) +
99 (D & 0x18C6)) >> 2) & 0x18C6;
100 u16 z = ((A & 0x0001) +
101 (B & 0x0001) +
102 (C & 0x0001) +
103 (D & 0x0001)) > 2 ? 1 : 0;
104 return x | y | z;
105}
106
107static inline u32 Q_INTERPOLATE8888( u32 A, u32 B, u32 C, u32 D)
108{
109 u32 x = ((A & 0xFCFCFCFC) >> 2) +
110 ((B & 0xFCFCFCFC) >> 2) +
111 ((C & 0xFCFCFCFC) >> 2) +
112 ((D & 0xFCFCFCFC) >> 2);
113 u32 y = (((A & 0x03030303) +
114 (B & 0x03030303) +
115 (C & 0x03030303) +
116 (D & 0x03030303)) >> 2) & 0x03030303;
117 return x | y;
118}
119
120void _2xSaI4444( u16 *srcPtr, u16 *destPtr, u16 width, u16 height, s32 clampS, s32 clampT )
121{
122 u16 destWidth = width << 1;
123 //u16 destHeight = height << 1;
124
125 u32 colorA, colorB, colorC, colorD,
126 colorE, colorF, colorG, colorH,
127 colorI, colorJ, colorK, colorL,
128 colorM, colorN, colorO, colorP;
129 u32 product, product1, product2;
130
131 s16 row0, row1, row2, row3;
132 s16 col0, col1, col2, col3;
133
134 for (u16 y = 0; y < height; y++)
135 {
136 if (y > 0)
137 row0 = -width;
138 else
139 row0 = clampT ? 0 : (height - 1) * width;
140
141 row1 = 0;
142
143 if (y < height - 1)
144 {
145 row2 = width;
146
147 if (y < height - 2)
148 row3 = width << 1;
149 else
150 row3 = clampT ? width : -y * width;
151 }
152 else
153 {
154 row2 = clampT ? 0 : -y * width;
155 row3 = clampT ? 0 : (1 - y) * width;
156 }
157
158 for (u16 x = 0; x < width; x++)
159 {
160 if (x > 0)
161 col0 = -1;
162 else
163 col0 = clampS ? 0 : width - 1;
164
165 col1 = 0;
166
167 if (x < width - 1)
168 {
169 col2 = 1;
170
171 if (x < width - 2)
172 col3 = 2;
173 else
174 col3 = clampS ? 1 : -x;
175 }
176 else
177 {
178 col2 = clampS ? 0 : -x;
179 col3 = clampS ? 0 : 1 - x;
180 }
181
182//---------------------------------------
183// Map of the pixels: I|E F|J
184// G|A B|K
185// H|C D|L
186// M|N O|P
187 colorI = *(srcPtr + col0 + row0);
188 colorE = *(srcPtr + col1 + row0);
189 colorF = *(srcPtr + col2 + row0);
190 colorJ = *(srcPtr + col3 + row0);
191
192 colorG = *(srcPtr + col0 + row1);
193 colorA = *(srcPtr + col1 + row1);
194 colorB = *(srcPtr + col2 + row1);
195 colorK = *(srcPtr + col3 + row1);
196
197 colorH = *(srcPtr + col0 + row2);
198 colorC = *(srcPtr + col1 + row2);
199 colorD = *(srcPtr + col2 + row2);
200 colorL = *(srcPtr + col3 + row2);
201
202 colorM = *(srcPtr + col0 + row3);
203 colorN = *(srcPtr + col1 + row3);
204 colorO = *(srcPtr + col2 + row3);
205 colorP = *(srcPtr + col3 + row3);
206
207 if ((colorA == colorD) && (colorB != colorC))
208 {
209 if ( ((colorA == colorE) && (colorB == colorL)) ||
210 ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) )
211 product = colorA;
212 else
213 product = INTERPOLATE4444(colorA, colorB);
214
215 if (((colorA == colorG) && (colorC == colorO)) ||
216 ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) )
217 product1 = colorA;
218 else
219 product1 = INTERPOLATE4444(colorA, colorC);
220
221 product2 = colorA;
222 }
223 else if ((colorB == colorC) && (colorA != colorD))
224 {
225 if (((colorB == colorF) && (colorA == colorH)) ||
226 ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) )
227 product = colorB;
228 else
229 product = INTERPOLATE4444(colorA, colorB);
230
231 if (((colorC == colorH) && (colorA == colorF)) ||
232 ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) )
233 product1 = colorC;
234 else
235 product1 = INTERPOLATE4444(colorA, colorC);
236 product2 = colorB;
237 }
238 else if ((colorA == colorD) && (colorB == colorC))
239 {
240 if (colorA == colorB)
241 {
242 product = colorA;
243 product1 = colorA;
244 product2 = colorA;
245 }
246 else
247 {
248 s16 r = 0;
249 product1 = INTERPOLATE4444(colorA, colorC);
250 product = INTERPOLATE4444(colorA, colorB);
251
252 r += GetResult1 (colorA, colorB, colorG, colorE, colorI);
253 r += GetResult2 (colorB, colorA, colorK, colorF, colorJ);
254 r += GetResult2 (colorB, colorA, colorH, colorN, colorM);
255 r += GetResult1 (colorA, colorB, colorL, colorO, colorP);
256
257 if (r > 0)
258 product2 = colorA;
259 else if (r < 0)
260 product2 = colorB;
261 else
262 product2 = Q_INTERPOLATE4444(colorA, colorB, colorC, colorD);
263 }
264 }
265 else
266 {
267 product2 = Q_INTERPOLATE4444(colorA, colorB, colorC, colorD);
268
269 if ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ))
270 product = colorA;
271 else if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI))
272 product = colorB;
273 else
274 product = INTERPOLATE4444(colorA, colorB);
275
276 if ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM))
277 product1 = colorA;
278 else if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI))
279 product1 = colorC;
280 else
281 product1 = INTERPOLATE4444(colorA, colorC);
282 }
283
284 destPtr[0] = colorA;
285 destPtr[1] = product;
286 destPtr[destWidth] = product1;
287 destPtr[destWidth + 1] = product2;
288
289 srcPtr++;
290 destPtr += 2;
291 }
292 destPtr += destWidth;
293 }
294}
295
296void _2xSaI5551( u16 *srcPtr, u16 *destPtr, u16 width, u16 height, s32 clampS, s32 clampT )
297{
298 u16 destWidth = width << 1;
299 //u16 destHeight = height << 1;
300
301 u32 colorA, colorB, colorC, colorD,
302 colorE, colorF, colorG, colorH,
303 colorI, colorJ, colorK, colorL,
304 colorM, colorN, colorO, colorP;
305 u32 product, product1, product2;
306
307 s16 row0, row1, row2, row3;
308 s16 col0, col1, col2, col3;
309
310 for (u16 y = 0; y < height; y++)
311 {
312 if (y > 0)
313 row0 = -width;
314 else
315 row0 = clampT ? 0 : (height - 1) * width;
316
317 row1 = 0;
318
319 if (y < height - 1)
320 {
321 row2 = width;
322
323 if (y < height - 2)
324 row3 = width << 1;
325 else
326 row3 = clampT ? width : -y * width;
327 }
328 else
329 {
330 row2 = clampT ? 0 : -y * width;
331 row3 = clampT ? 0 : (1 - y) * width;
332 }
333
334 for (u16 x = 0; x < width; x++)
335 {
336 if (x > 0)
337 col0 = -1;
338 else
339 col0 = clampS ? 0 : width - 1;
340
341 col1 = 0;
342
343 if (x < width - 1)
344 {
345 col2 = 1;
346
347 if (x < width - 2)
348 col3 = 2;
349 else
350 col3 = clampS ? 1 : -x;
351 }
352 else
353 {
354 col2 = clampS ? 0 : -x;
355 col3 = clampS ? 0 : 1 - x;
356 }
357
358//---------------------------------------
359// Map of the pixels: I|E F|J
360// G|A B|K
361// H|C D|L
362// M|N O|P
363 colorI = *(srcPtr + col0 + row0);
364 colorE = *(srcPtr + col1 + row0);
365 colorF = *(srcPtr + col2 + row0);
366 colorJ = *(srcPtr + col3 + row0);
367
368 colorG = *(srcPtr + col0 + row1);
369 colorA = *(srcPtr + col1 + row1);
370 colorB = *(srcPtr + col2 + row1);
371 colorK = *(srcPtr + col3 + row1);
372
373 colorH = *(srcPtr + col0 + row2);
374 colorC = *(srcPtr + col1 + row2);
375 colorD = *(srcPtr + col2 + row2);
376 colorL = *(srcPtr + col3 + row2);
377
378 colorM = *(srcPtr + col0 + row3);
379 colorN = *(srcPtr + col1 + row3);
380 colorO = *(srcPtr + col2 + row3);
381 colorP = *(srcPtr + col3 + row3);
382
383 if ((colorA == colorD) && (colorB != colorC))
384 {
385 if ( ((colorA == colorE) && (colorB == colorL)) ||
386 ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) )
387 product = colorA;
388 else
389 product = INTERPOLATE5551(colorA, colorB);
390
391 if (((colorA == colorG) && (colorC == colorO)) ||
392 ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) )
393 product1 = colorA;
394 else
395 product1 = INTERPOLATE5551(colorA, colorC);
396
397 product2 = colorA;
398 }
399 else if ((colorB == colorC) && (colorA != colorD))
400 {
401 if (((colorB == colorF) && (colorA == colorH)) ||
402 ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) )
403 product = colorB;
404 else
405 product = INTERPOLATE5551(colorA, colorB);
406
407 if (((colorC == colorH) && (colorA == colorF)) ||
408 ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) )
409 product1 = colorC;
410 else
411 product1 = INTERPOLATE5551(colorA, colorC);
412 product2 = colorB;
413 }
414 else if ((colorA == colorD) && (colorB == colorC))
415 {
416 if (colorA == colorB)
417 {
418 product = colorA;
419 product1 = colorA;
420 product2 = colorA;
421 }
422 else
423 {
424 s16 r = 0;
425 product1 = INTERPOLATE5551(colorA, colorC);
426 product = INTERPOLATE5551(colorA, colorB);
427
428 r += GetResult1 (colorA, colorB, colorG, colorE, colorI);
429 r += GetResult2 (colorB, colorA, colorK, colorF, colorJ);
430 r += GetResult2 (colorB, colorA, colorH, colorN, colorM);
431 r += GetResult1 (colorA, colorB, colorL, colorO, colorP);
432
433 if (r > 0)
434 product2 = colorA;
435 else if (r < 0)
436 product2 = colorB;
437 else
438 product2 = Q_INTERPOLATE5551(colorA, colorB, colorC, colorD);
439 }
440 }
441 else
442 {
443 product2 = Q_INTERPOLATE5551(colorA, colorB, colorC, colorD);
444
445 if ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ))
446 product = colorA;
447 else if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI))
448 product = colorB;
449 else
450 product = INTERPOLATE5551(colorA, colorB);
451
452 if ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM))
453 product1 = colorA;
454 else if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI))
455 product1 = colorC;
456 else
457 product1 = INTERPOLATE5551(colorA, colorC);
458 }
459
460 destPtr[0] = colorA;
461 destPtr[1] = product;
462 destPtr[destWidth] = product1;
463 destPtr[destWidth + 1] = product2;
464
465 srcPtr++;
466 destPtr += 2;
467 }
468 destPtr += destWidth;
469 }
470}
471
472void _2xSaI8888( u32 *srcPtr, u32 *destPtr, u16 width, u16 height, s32 clampS, s32 clampT )
473{
474 u16 destWidth = width << 1;
475 //u16 destHeight = height << 1;
476
477 u32 colorA, colorB, colorC, colorD,
478 colorE, colorF, colorG, colorH,
479 colorI, colorJ, colorK, colorL,
480 colorM, colorN, colorO, colorP;
481 u32 product, product1, product2;
482
483 s16 row0, row1, row2, row3;
484 s16 col0, col1, col2, col3;
485
486 for (u16 y = 0; y < height; y++)
487 {
488 if (y > 0)
489 row0 = -width;
490 else
491 row0 = clampT ? 0 : (height - 1) * width;
492
493 row1 = 0;
494
495 if (y < height - 1)
496 {
497 row2 = width;
498
499 if (y < height - 2)
500 row3 = width << 1;
501 else
502 row3 = clampT ? width : -y * width;
503 }
504 else
505 {
506 row2 = clampT ? 0 : -y * width;
507 row3 = clampT ? 0 : (1 - y) * width;
508 }
509
510 for (u16 x = 0; x < width; x++)
511 {
512 if (x > 0)
513 col0 = -1;
514 else
515 col0 = clampS ? 0 : width - 1;
516
517 col1 = 0;
518
519 if (x < width - 1)
520 {
521 col2 = 1;
522
523 if (x < width - 2)
524 col3 = 2;
525 else
526 col3 = clampS ? 1 : -x;
527 }
528 else
529 {
530 col2 = clampS ? 0 : -x;
531 col3 = clampS ? 0 : 1 - x;
532 }
533
534//---------------------------------------
535// Map of the pixels: I|E F|J
536// G|A B|K
537// H|C D|L
538// M|N O|P
539 colorI = *(srcPtr + col0 + row0);
540 colorE = *(srcPtr + col1 + row0);
541 colorF = *(srcPtr + col2 + row0);
542 colorJ = *(srcPtr + col3 + row0);
543
544 colorG = *(srcPtr + col0 + row1);
545 colorA = *(srcPtr + col1 + row1);
546 colorB = *(srcPtr + col2 + row1);
547 colorK = *(srcPtr + col3 + row1);
548
549 colorH = *(srcPtr + col0 + row2);
550 colorC = *(srcPtr + col1 + row2);
551 colorD = *(srcPtr + col2 + row2);
552 colorL = *(srcPtr + col3 + row2);
553
554 colorM = *(srcPtr + col0 + row3);
555 colorN = *(srcPtr + col1 + row3);
556 colorO = *(srcPtr + col2 + row3);
557 colorP = *(srcPtr + col3 + row3);
558
559 if ((colorA == colorD) && (colorB != colorC))
560 {
561 if ( ((colorA == colorE) && (colorB == colorL)) ||
562 ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) )
563 product = colorA;
564 else
565 product = INTERPOLATE8888(colorA, colorB);
566
567 if (((colorA == colorG) && (colorC == colorO)) ||
568 ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) )
569 product1 = colorA;
570 else
571 product1 = INTERPOLATE8888(colorA, colorC);
572
573 product2 = colorA;
574 }
575 else if ((colorB == colorC) && (colorA != colorD))
576 {
577 if (((colorB == colorF) && (colorA == colorH)) ||
578 ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) )
579 product = colorB;
580 else
581 product = INTERPOLATE8888(colorA, colorB);
582
583 if (((colorC == colorH) && (colorA == colorF)) ||
584 ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) )
585 product1 = colorC;
586 else
587 product1 = INTERPOLATE8888(colorA, colorC);
588 product2 = colorB;
589 }
590 else if ((colorA == colorD) && (colorB == colorC))
591 {
592 if (colorA == colorB)
593 {
594 product = colorA;
595 product1 = colorA;
596 product2 = colorA;
597 }
598 else
599 {
600 s16 r = 0;
601 product1 = INTERPOLATE8888(colorA, colorC);
602 product = INTERPOLATE8888(colorA, colorB);
603
604 r += GetResult1 (colorA, colorB, colorG, colorE, colorI);
605 r += GetResult2 (colorB, colorA, colorK, colorF, colorJ);
606 r += GetResult2 (colorB, colorA, colorH, colorN, colorM);
607 r += GetResult1 (colorA, colorB, colorL, colorO, colorP);
608
609 if (r > 0)
610 product2 = colorA;
611 else if (r < 0)
612 product2 = colorB;
613 else
614 product2 = Q_INTERPOLATE8888(colorA, colorB, colorC, colorD);
615 }
616 }
617 else
618 {
619 product2 = Q_INTERPOLATE8888(colorA, colorB, colorC, colorD);
620
621 if ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ))
622 product = colorA;
623 else if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI))
624 product = colorB;
625 else
626 product = INTERPOLATE8888(colorA, colorB);
627
628 if ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM))
629 product1 = colorA;
630 else if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI))
631 product1 = colorC;
632 else
633 product1 = INTERPOLATE8888(colorA, colorC);
634 }
635
636 destPtr[0] = colorA;
637 destPtr[1] = product;
638 destPtr[destWidth] = product1;
639 destPtr[destWidth + 1] = product2;
640
641 srcPtr++;
642 destPtr += 2;
643 }
644 destPtr += destWidth;
645 }
646}
647