GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / 2xSAI.cpp
1 #include "Types.h"
2 //#include "GBI.h"
3
4 static 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
18 static 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
33 static 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
47 static 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
57 static 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
67 static 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
77 static 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
90 static 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
107 static 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
120 void _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
296 void _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
472 void _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