1 #ifndef _GRAPHICS_HLE_MICROCODE_ZSORT_H
2 #define _GRAPHICS_HLE_MICROCODE_ZSORT_H
3 
4 #include <stdint.h>
5 
6 #include <retro_inline.h>
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #define	GZM_USER0		0
13 #define	GZM_USER1		2
14 #define	GZM_MMTX		   4
15 #define	GZM_PMTX		   6
16 #define	GZM_MPMTX		8
17 #define	GZM_OTHERMODE	10
18 #define	GZM_VIEWPORT	12
19 #define	GZF_LOAD		   0
20 #define	GZF_SAVE		   1
21 
22 #define	ZH_NULL		   0
23 #define	ZH_SHTRI	      1
24 #define	ZH_TXTRI	      2
25 #define	ZH_SHQUAD	   3
26 #define	ZH_TXQUAD	   4
27 
28 typedef float M44[4][4];
29 
30 typedef struct
31 {
32    float view_scale[2];
33    float view_trans[2];
34    float scale_x;
35    float scale_y;
36 } ZSORTRDP;
37 
ZSort_Calc_invw(int _w)38 static INLINE int ZSort_Calc_invw (int _w)
39 {
40    int count, neg;
41    union
42    {
43       int32_t W;
44       uint32_t UW;
45       int16_t HW[2];
46       uint16_t UHW[2];
47    } Result;
48 
49    Result.W = _w;
50 
51    if (Result.UW == 0)
52       Result.UW = 0x7FFFFFFF;
53    else
54    {
55       if (Result.W < 0)
56       {
57          neg = true;
58          if (Result.UHW[1] == 0xFFFF && Result.HW[0] < 0)
59             Result.W = ~Result.W + 1;
60          else
61             Result.W = ~Result.W;
62       }
63       else
64          neg = false;
65 
66       for (count = 31; count > 0; --count)
67       {
68          if ((Result.W & (1 << count)))
69          {
70             Result.W &= (0xFFC00000 >> (31 - count) );
71             count = 0;
72          }
73       }
74 
75       Result.W = 0x7FFFFFFF / Result.W;
76       for (count = 31; count > 0; --count)
77       {
78          if ((Result.W & (1 << count)))
79          {
80             Result.W &= (0xFFFF8000 >> (31 - count) );
81             count = 0;
82          }
83       }
84 
85       if (neg == true)
86          Result.W = ~Result.W;
87    }
88    return Result.W;
89 }
90 
91 #ifdef __cplusplus
92 }
93 #endif
94 
95 #endif
96