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)38static 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