diff --git a/____osDequeueThread_8c.html b/____osDequeueThread_8c.html index e11edd67a..c3b741746 100644 --- a/____osDequeueThread_8c.html +++ b/____osDequeueThread_8c.html @@ -127,9 +127,9 @@ Functions Variables struct __osThreadTail __osThreadTail = { NULL, -1 }   -OSThread__osRunQueue = (OSThread *) &__osThreadTail +OSThread__osRunQueue = (OSThread*) &__osThreadTail   -OSThread__osActiveQueue = (OSThread *) &__osThreadTail +OSThread__osActiveQueue = (OSThread*) &__osThreadTail   OSThread__osRunningThread = { 0 }   @@ -171,7 +171,7 @@ Here is the caller graph for this function:
- +
OSThread* __osActiveQueue = (OSThread *) &__osThreadTailOSThread* __osActiveQueue = (OSThread*) &__osThreadTail
@@ -213,7 +213,7 @@ Here is the caller graph for this function:
- +
OSThread* __osRunQueue = (OSThread *) &__osThreadTailOSThread* __osRunQueue = (OSThread*) &__osThreadTail
diff --git a/ceremony__and__credits_8c.html b/ceremony__and__credits_8c.html index 6b21a23ec..6d2150823 100644 --- a/ceremony__and__credits_8c.html +++ b/ceremony__and__credits_8c.html @@ -1011,7 +1011,7 @@ Here is the caller graph for this function:
-
Todo
Cast to normal Camera? Or from CinematicCamera?
+
Todo
Cast to normal Camera? Or from CinematicCamera?
Here is the call graph for this function:
@@ -1298,7 +1298,7 @@ Here is the caller graph for this function:
-
Todo
Does this match as a return of s8?
+
Todo
Does this match as a return of s8?
Here is the call graph for this function:
@@ -2370,7 +2370,7 @@ Here is the call graph for this function:
-
Todo
What does this even do?
+
Todo
What does this even do?
Here is the call graph for this function:
diff --git a/ceremony__and__credits_8h.html b/ceremony__and__credits_8h.html index a35bb0644..79ec91008 100644 --- a/ceremony__and__credits_8h.html +++ b/ceremony__and__credits_8h.html @@ -965,7 +965,7 @@ Here is the caller graph for this function:
-
Todo
Cast to normal Camera? Or from CinematicCamera?
+
Todo
Cast to normal Camera? Or from CinematicCamera?
Here is the call graph for this function:
@@ -2207,7 +2207,7 @@ Here is the call graph for this function:
-
Todo
What does this even do?
+
Todo
What does this even do?
Here is the call graph for this function:
diff --git a/code__80091750_8c.html b/code__80091750_8c.html index 398b5c73a..a90d48a58 100644 --- a/code__80091750_8c.html +++ b/code__80091750_8c.html @@ -1923,7 +1923,7 @@ Here is the caller graph for this function:
-
Todo
These sizes need to be sizeof() for shiftability if possible
+
Todo
These sizes need to be sizeof() for shiftability if possible
Here is the call graph for this function:
@@ -12601,7 +12601,7 @@ Here is the caller graph for this function:
-
Todo
Move gGfxPool out of main.h
+
Todo
Move gGfxPool out of main.h
diff --git a/code__80091750_8h.html b/code__80091750_8h.html index 54e286799..e032656e6 100644 --- a/code__80091750_8h.html +++ b/code__80091750_8h.html @@ -2033,7 +2033,7 @@ Here is the caller graph for this function:
-
Todo
These sizes need to be sizeof() for shiftability if possible
+
Todo
These sizes need to be sizeof() for shiftability if possible
Here is the call graph for this function:
@@ -13035,7 +13035,7 @@ Here is the caller graph for this function:
-
Todo
Move gGfxPool out of main.h
+
Todo
Move gGfxPool out of main.h
diff --git a/code__80281780_8c.html b/code__80281780_8c.html index f5030e958..148e939d2 100644 --- a/code__80281780_8c.html +++ b/code__80281780_8c.html @@ -169,7 +169,7 @@ Variables
-
Todo
confirm this.
+
Todo
confirm this.
Here is the call graph for this function:
diff --git a/code__80281780_8h.html b/code__80281780_8h.html index a5cfadc93..3f3eb911a 100644 --- a/code__80281780_8h.html +++ b/code__80281780_8h.html @@ -170,7 +170,7 @@ Variables
-
Todo
confirm this.
+
Todo
confirm this.
Here is the call graph for this function:
diff --git a/controller_8h.html b/controller_8h.html index 7f445b25b..6859a5994 100644 --- a/controller_8h.html +++ b/controller_8h.html @@ -255,10 +255,10 @@ Functions   s32 __osContRamWrite (OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int force)   -void __osContGetInitData (u8 *pattern, OSContStatus *data) -  -void __osPackRequestData (u8 cmd) -  +void __osContGetInitData (u8 *bitpattern, OSContStatus *status) +  +void __osPackRequestData (u8 command) +  void __osPfsRequestData (u8 cmd)   void __osPfsGetInitData (u8 *pattern, OSContStatus *data) @@ -942,8 +942,8 @@ Here is the caller graph for this function:
- -

◆ __osContGetInitData()

+ +

◆ __osContGetInitData()

@@ -951,19 +951,19 @@ Here is the caller graph for this function:
void __osContGetInitData ( - u8 * pattern, + u8 * bitpattern, - OSContStatus * data ) + OSContStatus * status )
Here is the caller graph for this function:
-
+
@@ -1149,8 +1149,8 @@ Here is the caller graph for this function: - -

◆ __osPackRequestData()

+ +

◆ __osPackRequestData()

@@ -1158,7 +1158,7 @@ Here is the caller graph for this function:
void __osPackRequestData ( - u8 cmd) + u8 command) @@ -1166,7 +1166,7 @@ Here is the caller graph for this function:
Here is the caller graph for this function:
-
+
diff --git a/controller_8h.js b/controller_8h.js index 64bfbf7d3..fe51c828e 100644 --- a/controller_8h.js +++ b/controller_8h.js @@ -50,13 +50,13 @@ var controller_8h = [ "__osCheckPackId", "controller_8h.html#a8bbcf22ecc22c4334a757e19a0815195", null ], [ "__osContAddressCrc", "controller_8h.html#a5ab8a1ce418d27ff12d648c447c8ab6e", null ], [ "__osContDataCrc", "controller_8h.html#a3da2a6d11716fef869b6be888c9b7263", null ], - [ "__osContGetInitData", "controller_8h.html#a3d74e172e33f530214ca936729a10003", null ], + [ "__osContGetInitData", "controller_8h.html#a5f809ab121e597f82f55d34864ece3be", null ], [ "__osContRamRead", "controller_8h.html#a594f9ee5edd6c2fb8070576da1fd06e0", null ], [ "__osContRamWrite", "controller_8h.html#ac0f1bb81601cedc5fc5868fc7e500b88", null ], [ "__osEepStatus", "controller_8h.html#a8e53a603dc8223f6f83d874f7fbc85af", null ], [ "__osGetId", "controller_8h.html#aab452241c8ea115165a20157fc64fb9e", null ], [ "__osIdCheckSum", "controller_8h.html#a0f7db56e72f44b8a2e596b0e8a702866", null ], - [ "__osPackRequestData", "controller_8h.html#a0c521ee50049b1ceb34042ba602a6dce", null ], + [ "__osPackRequestData", "controller_8h.html#a84898251e87ca68eef2914979815bd4c", null ], [ "__osPfsDeclearPage", "controller_8h.html#a12a746a3baa07de1c6d2791949388a4c", null ], [ "__osPfsGetInitData", "controller_8h.html#ab19dc53e7991a55743de1b757bec850e", null ], [ "__osPfsGetStatus", "controller_8h.html#a4896a625ad888852615bb2f10831aeb7", null ], diff --git a/controller_8h_a3d74e172e33f530214ca936729a10003_icgraph.map b/controller_8h_a5f809ab121e597f82f55d34864ece3be_icgraph.map similarity index 100% rename from controller_8h_a3d74e172e33f530214ca936729a10003_icgraph.map rename to controller_8h_a5f809ab121e597f82f55d34864ece3be_icgraph.map diff --git a/controller_8h_a3d74e172e33f530214ca936729a10003_icgraph.md5 b/controller_8h_a5f809ab121e597f82f55d34864ece3be_icgraph.md5 similarity index 100% rename from controller_8h_a3d74e172e33f530214ca936729a10003_icgraph.md5 rename to controller_8h_a5f809ab121e597f82f55d34864ece3be_icgraph.md5 diff --git a/controller_8h_a3d74e172e33f530214ca936729a10003_icgraph.svg b/controller_8h_a5f809ab121e597f82f55d34864ece3be_icgraph.svg similarity index 99% rename from controller_8h_a3d74e172e33f530214ca936729a10003_icgraph.svg rename to controller_8h_a5f809ab121e597f82f55d34864ece3be_icgraph.svg index 2b8abf1e2..798249f5c 100644 --- a/controller_8h_a3d74e172e33f530214ca936729a10003_icgraph.svg +++ b/controller_8h_a5f809ab121e597f82f55d34864ece3be_icgraph.svg @@ -186,7 +186,7 @@ var sectionId = 'dynsection-10'; - + - + 151s32 __osBlockSum(OSPfs* pfs, u8 page_no, u16* sum, u8 bank);
152s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer);
153s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force);
-
154void __osContGetInitData(u8* pattern, OSContStatus* data);
-
155void __osPackRequestData(u8 cmd);
+
154void __osContGetInitData(u8* bitpattern, OSContStatus* status);
+
155void __osPackRequestData(u8 command);
156void __osPfsRequestData(u8 cmd);
157void __osPfsGetInitData(u8* pattern, OSContStatus* data);
158u8 __osContAddressCrc(u16 addr);
@@ -337,20 +337,20 @@ $(function(){initNavTree('controller_8h_source.html',''); initResizable(true); }
196 if (ret != 0) \
197 return ret;
-
__osPackRequestData
void __osPackRequestData(u8 cmd)
Definition osContInit.c:69
__osIdCheckSum
s32 __osIdCheckSum(u16 *ptr, u16 *csum, u16 *icsum)
Definition contpfs.c:17
__osPfsPifRam
OSPifRam __osPfsPifRam
Definition osPfsIsPlug.c:6
__osEepromTimerQ
OSMesgQueue __osEepromTimerQ
__osPfsDeclearPage
s32 __osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page)
Definition osPfsAllocateFile.c:112
-
__osContGetInitData
void __osContGetInitData(u8 *pattern, OSContStatus *data)
Definition osContInit.c:48
__osContDataCrc
u8 __osContDataCrc(u8 *data)
Definition crc.c:23
__osPfsGetStatus
s32 __osPfsGetStatus(OSMesgQueue *queue, int channel)
Definition osPfsInit.c:27
__osPfsSelectBank
s32 __osPfsSelectBank(OSPfs *pfs)
Definition contpfs.c:270
__osContRamRead
s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer)
Definition contramread.c:8
__osContAddressCrc
u8 __osContAddressCrc(u16 addr)
Definition crc.c:3
+
__osContGetInitData
void __osContGetInitData(u8 *bitpattern, OSContStatus *status)
Definition osContInit.c:48
__osContPifRam
OSPifRam __osContPifRam
Definition osContInit.c:12
__osEepromTimer
OSTimer __osEepromTimer
__osSumcalc
u16 __osSumcalc(u8 *ptr, int length)
Definition contpfs.c:4
+
__osPackRequestData
void __osPackRequestData(u8 command)
Definition osContInit.c:69
__osCheckId
s32 __osCheckId(OSPfs *pfs)
Definition contpfs.c:188
__osCheckPackId
s32 __osCheckPackId(OSPfs *pfs, __OSPackId *temp)
Definition contpfs.c:110
__osEepStatus
s32 __osEepStatus(OSMesgQueue *, OSContStatus *)
Definition osEepromWrite.c:85
diff --git a/doxygen_crawl.html b/doxygen_crawl.html index 2a9fa85e8..01f4a199a 100644 --- a/doxygen_crawl.html +++ b/doxygen_crawl.html @@ -9,8 +9,8 @@ - + @@ -57,7 +57,6 @@ - @@ -72,6 +71,7 @@ + @@ -168,8 +168,8 @@ - + @@ -242,10 +242,10 @@ + - @@ -368,37 +368,37 @@ - + - - + + - + - + @@ -408,12 +408,12 @@ - + @@ -426,8 +426,8 @@ - + @@ -502,17 +502,17 @@ + - - + - + @@ -521,9 +521,9 @@ + - @@ -550,15 +550,15 @@ - - + - + + @@ -629,13 +629,13 @@ + - + - @@ -643,9 +643,9 @@ + - @@ -661,8 +661,8 @@ - + @@ -704,10 +704,10 @@ + - @@ -722,10 +722,10 @@ + - @@ -740,11 +740,11 @@ - - + + @@ -797,8 +797,8 @@ - + @@ -808,6 +808,7 @@ + @@ -816,16 +817,15 @@ - - - + + @@ -835,22 +835,22 @@ + - + - - - + + @@ -867,18 +867,18 @@ - + + - @@ -896,6 +896,7 @@ + @@ -904,15 +905,14 @@ - - + @@ -922,21 +922,21 @@ + - + - + - @@ -967,12 +967,13 @@ - + + @@ -983,20 +984,20 @@ - - + - - + + + @@ -1005,15 +1006,15 @@ - - - + + + @@ -1023,14 +1024,12 @@ - - @@ -1040,6 +1039,7 @@ + @@ -1047,8 +1047,8 @@ - + @@ -8619,7 +8619,6 @@ - @@ -8630,7 +8629,6 @@ - @@ -8640,6 +8638,7 @@ + @@ -8649,6 +8648,7 @@ + diff --git a/gbi_8h_source.html b/gbi_8h_source.html index 9e29736a7..946ff9752 100644 --- a/gbi_8h_source.html +++ b/gbi_8h_source.html @@ -2294,2094 +2294,2097 @@ $(function(){initNavTree('gbi_8h_source.html',''); initResizable(true); });
2102/***
2103 *** 1 Quadrangle
2104 ***/
-
2105#define gSP1Quadrangle(v0, v1, v2, v3, flag) \
-
2106 { { Gfx* _g = (Gfx*) (pkt); \
-
2107 \
-
2108 _g->words.w0 = _SHIFTL(G_QUAD, 24, 8); \
-
2109 _g->words.w1 = __gsSP1Quadrangle_w1(v0, v1, v2, v3); \
-
2110 } \
-
2111 }
-
2112
-
2113#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
-
2114 { \
-
2115 { _SHIFTL(G_QUAD, 24, 8), __gsSP1Quadrangle_w1(v0, v1, v2, v3) } \
-
2116 }
-
2117#else
-
2118/***
-
2119 *** 1 Quadrangle
-
2120 ***/
-
2121#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \
-
2122 { \
-
2123 Gfx* _g = (Gfx*) (pkt); \
-
2124 \
-
2125 _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \
-
2126 _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \
-
2127 }
-
2128
-
2129#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
-
2130 { \
-
2131 { \
-
2132 (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \
-
2133 __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \
-
2134 } \
-
2135 }
-
2136#endif
-
2137#endif /* F3DEX_GBI_2 */
-
2138
-
2139#if (defined(F3DLP_GBI) || defined(F3DEX_GBI))
-
2140/***
-
2141 *** 2 Triangles
-
2142 ***/
-
2143#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \
-
2144 { \
-
2145 Gfx* _g = (Gfx*) (pkt); \
-
2146 \
-
2147 _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Triangle_w1f(v00, v01, v02, flag0)); \
-
2148 _g->words.w1 = __gsSP1Triangle_w1f(v10, v11, v12, flag1); \
-
2149 }
-
2150
-
2151#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
-
2152 { \
-
2153 { \
-
2154 (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Triangle_w1f(v00, v01, v02, flag0)), \
-
2155 __gsSP1Triangle_w1f(v10, v11, v12, flag1) \
-
2156 } \
-
2157 }
-
2158#else
-
2159#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \
-
2160 { \
-
2161 gSP1Triangle(pkt, v00, v01, v02, flag0); \
-
2162 gSP1Triangle(pkt, v10, v11, v12, flag1); \
-
2163 }
-
2164#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
-
2165 gsSP1Triangle(v00, v01, v02, flag0), gsSP1Triangle(v10, v11, v12, flag1)
-
2166#endif /* F3DEX_GBI/F3DLP_GBI */
-
2167
-
2168#ifndef F3D_OLD
-
2169#if (defined(F3DEX_GBI) || defined(F3DLP_GBI))
-
2170#define gSPCullDisplayList(pkt, vstart, vend) \
-
2171 { \
-
2172 Gfx* _g = (Gfx*) (pkt); \
-
2173 \
-
2174 _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | _SHIFTL((vstart) * 2, 0, 16); \
-
2175 _g->words.w1 = _SHIFTL((vend) * 2, 0, 16); \
-
2176 }
-
2177
-
2178#define gsSPCullDisplayList(vstart, vend) \
-
2179 { \
-
2180 { _SHIFTL(G_CULLDL, 24, 8) | _SHIFTL((vstart) * 2, 0, 16), _SHIFTL((vend) * 2, 0, 16) } \
-
2181 }
-
2182#endif
-
2183#else /* F3D_OLD */
-
2184#define gSPCullDisplayList(pkt, vstart, vend) \
-
2185 { \
-
2186 Gfx* _g = (Gfx*) (pkt); \
-
2187 \
-
2188 _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart)) * 40); \
-
2189 _g->words.w1 = (unsigned int) ((0x0f & ((vend) + 1)) * 40); \
-
2190 }
-
2191
-
2192#define gsSPCullDisplayList(vstart, vend) \
-
2193 { \
-
2194 { _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart)) * 40), ((0x0f & ((vend) + 1)) * 40) } \
-
2195 }
-
2196#endif
-
2197
-
2198#define gSPSegment(pkt, segment, base) gMoveWd(pkt, G_MW_SEGMENT, (segment) * 4, base)
-
2199#define gsSPSegment(segment, base) gsMoveWd(G_MW_SEGMENT, (segment) * 4, base)
-
2200
-
2201/*
-
2202 * Clipping Macros
-
2203 */
-
2204#define FR_NEG_FRUSTRATIO_1 0x00000001
-
2205#define FR_POS_FRUSTRATIO_1 0x0000ffff
-
2206#define FR_NEG_FRUSTRATIO_2 0x00000002
-
2207#define FR_POS_FRUSTRATIO_2 0x0000fffe
-
2208#define FR_NEG_FRUSTRATIO_3 0x00000003
-
2209#define FR_POS_FRUSTRATIO_3 0x0000fffd
-
2210#define FR_NEG_FRUSTRATIO_4 0x00000004
-
2211#define FR_POS_FRUSTRATIO_4 0x0000fffc
-
2212#define FR_NEG_FRUSTRATIO_5 0x00000005
-
2213#define FR_POS_FRUSTRATIO_5 0x0000fffb
-
2214#define FR_NEG_FRUSTRATIO_6 0x00000006
-
2215#define FR_POS_FRUSTRATIO_6 0x0000fffa
-
2216/*
-
2217 * r should be one of: FRUSTRATIO_1, FRUSTRATIO_2, FRUSTRATIO_3, ... FRUSTRATIO_6
-
2218 */
-
2219#define gSPClipRatio(pkt, r) \
-
2220 { \
-
2221 gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r); \
-
2222 gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r); \
-
2223 gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r); \
-
2224 gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r); \
-
2225 }
-
2226
-
2227#define gsSPClipRatio(r) \
-
2228 gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r), gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r), \
-
2229 gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r), gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r)
-
2230
-
2231/*
-
2232 * Insert values into Matrix
-
2233 *
-
2234 * where = element of matrix (byte offset)
-
2235 * num = new element (32 bit value replacing 2 int or 2 frac matrix
-
2236 * componants
-
2237 */
-
2238#ifdef F3DEX_GBI_2
-
2239#define gSPInsertMatrix(pkt, where, num) ERROR !!gSPInsertMatrix is no longer supported.
-
2240#define gsSPInsertMatrix(where, num) ERROR !!gsSPInsertMatrix is no longer supported.
-
2241#else
-
2242#define gSPInsertMatrix(pkt, where, num) gMoveWd(pkt, G_MW_MATRIX, where, num)
-
2243#define gsSPInsertMatrix(where, num) gsMoveWd(G_MW_MATRIX, where, num)
-
2244#endif
-
2245
-
2246/*
-
2247 * Load new matrix directly
-
2248 *
-
2249 * mptr = pointer to matrix
-
2250 */
-
2251#ifdef F3DEX_GBI_2
-
2252#define gSPForceMatrix(pkt, mptr) \
-
2253 { \
-
2254 gDma2p((pkt), G_MOVEMEM, (mptr), sizeof(Mtx), G_MV_MATRIX, 0); \
-
2255 gMoveWd((pkt), G_MW_FORCEMTX, 0, 0x00010000); \
-
2256 }
-
2257#define gsSPForceMatrix(mptr) \
-
2258 gsDma2p(G_MOVEMEM, (mptr), sizeof(Mtx), G_MV_MATRIX, 0), gsMoveWd(G_MW_FORCEMTX, 0, 0x00010000)
-
2259
-
2260#else /* F3DEX_GBI_2 */
-
2261#define gSPForceMatrix(pkt, mptr) \
-
2262 { \
-
2263 gDma1p(pkt, G_MOVEMEM, mptr, 16, G_MV_MATRIX_1); \
-
2264 gDma1p(pkt, G_MOVEMEM, (char*) (mptr) + 16, 16, G_MV_MATRIX_2); \
-
2265 gDma1p(pkt, G_MOVEMEM, (char*) (mptr) + 32, 16, G_MV_MATRIX_3); \
-
2266 gDma1p(pkt, G_MOVEMEM, (char*) (mptr) + 48, 16, G_MV_MATRIX_4); \
-
2267 }
-
2268#define gsSPForceMatrix(mptr) \
-
2269 gsDma1p(G_MOVEMEM, mptr, 16, G_MV_MATRIX_1), gsDma1p(G_MOVEMEM, (char*) (mptr) + 16, 16, G_MV_MATRIX_2), \
-
2270 gsDma1p(G_MOVEMEM, (char*) (mptr) + 32, 16, G_MV_MATRIX_3), \
-
2271 gsDma1p(G_MOVEMEM, (char*) (mptr) + 48, 16, G_MV_MATRIX_4)
-
2272#endif /* F3DEX_GBI_2 */
-
2273
-
2274/*
-
2275 * Insert values into Points
-
2276 *
-
2277 * point = point number 0-15
-
2278 * where = which element of point to modify (byte offset into point)
-
2279 * num = new value (32 bit)
-
2280 */
-
2281#if (defined(F3DEX_GBI) || defined(F3DLP_GBI))
-
2282#define gSPModifyVertex(pkt, vtx, where, val) \
-
2283 { \
-
2284 Gfx* _g = (Gfx*) (pkt); \
-
2285 _g->words.w0 = (_SHIFTL(G_MODIFYVTX, 24, 8) | _SHIFTL((where), 16, 8) | _SHIFTL((vtx) * 2, 0, 16)); \
-
2286 _g->words.w1 = (unsigned int) (val); \
-
2287 }
-
2288#define gsSPModifyVertex(vtx, where, val) \
-
2289 { \
-
2290 { _SHIFTL(G_MODIFYVTX, 24, 8) | _SHIFTL((where), 16, 8) | _SHIFTL((vtx) * 2, 0, 16), (unsigned int) (val) } \
-
2291 }
-
2292#else
-
2293#define gSPModifyVertex(pkt, vtx, where, val) gMoveWd(pkt, G_MW_POINTS, (vtx) * 40 + (where), val)
-
2294#define gsSPModifyVertex(vtx, where, val) gsMoveWd(G_MW_POINTS, (vtx) * 40 + (where), val)
-
2295#endif
-
2296
-
2297#if (defined(F3DEX_GBI) || defined(F3DLP_GBI))
-
2298/*
-
2299 * gSPBranchLessZ Branch DL if (vtx.z) less than or equal (zval).
-
2300 *
-
2301 * dl = DL branch to
-
2302 * vtx = Vertex
-
2303 * zval = Screen depth
-
2304 * near = Near plane
-
2305 * far = Far plane
-
2306 * flag = G_BZ_PERSP or G_BZ_ORTHO
-
2307 */
-
2308
-
2309#define G_BZ_PERSP 0
-
2310#define G_BZ_ORTHO 1
-
2311
-
2312#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \
-
2313 (((unsigned int) FTOFIX32( \
-
2314 ((flag) == G_BZ_PERSP ? (1.0f - (float) (near) / (float) (zval)) / (1.0f - (float) (near) / (float) (far)) \
-
2315 : ((float) (zval) - (float) (near)) / ((float) (far) - (float) (near))))) * \
-
2316 (((int) ((zmax) - (zmin))) & ~1) + \
-
2317 (int) FTOFIX32(zmin))
-
2318
-
2319#define G_DEPTOZS(zval, near, far, flag) G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ)
+
2105#define gSP1Quadrangle(v0, v1, v2, v3, flag) \
+
2106 { \
+
2107 { \
+
2108 Gfx* _g = (Gfx*) (pkt); \
+
2109 \
+
2110 _g->words.w0 = _SHIFTL(G_QUAD, 24, 8); \
+
2111 _g->words.w1 = __gsSP1Quadrangle_w1(v0, v1, v2, v3); \
+
2112 } \
+
2113 }
+
2114
+
2115#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
+
2116 { \
+
2117 { _SHIFTL(G_QUAD, 24, 8), __gsSP1Quadrangle_w1(v0, v1, v2, v3) } \
+
2118 }
+
2119#else
+
2120/***
+
2121 *** 1 Quadrangle
+
2122 ***/
+
2123#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \
+
2124 { \
+
2125 Gfx* _g = (Gfx*) (pkt); \
+
2126 \
+
2127 _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \
+
2128 _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \
+
2129 }
+
2130
+
2131#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
+
2132 { \
+
2133 { \
+
2134 (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \
+
2135 __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \
+
2136 } \
+
2137 }
+
2138#endif
+
2139#endif /* F3DEX_GBI_2 */
+
2140
+
2141#if (defined(F3DLP_GBI) || defined(F3DEX_GBI))
+
2142/***
+
2143 *** 2 Triangles
+
2144 ***/
+
2145#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \
+
2146 { \
+
2147 Gfx* _g = (Gfx*) (pkt); \
+
2148 \
+
2149 _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Triangle_w1f(v00, v01, v02, flag0)); \
+
2150 _g->words.w1 = __gsSP1Triangle_w1f(v10, v11, v12, flag1); \
+
2151 }
+
2152
+
2153#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
+
2154 { \
+
2155 { \
+
2156 (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Triangle_w1f(v00, v01, v02, flag0)), \
+
2157 __gsSP1Triangle_w1f(v10, v11, v12, flag1) \
+
2158 } \
+
2159 }
+
2160#else
+
2161#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \
+
2162 { \
+
2163 gSP1Triangle(pkt, v00, v01, v02, flag0); \
+
2164 gSP1Triangle(pkt, v10, v11, v12, flag1); \
+
2165 }
+
2166#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
+
2167 gsSP1Triangle(v00, v01, v02, flag0), gsSP1Triangle(v10, v11, v12, flag1)
+
2168#endif /* F3DEX_GBI/F3DLP_GBI */
+
2169
+
2170#ifndef F3D_OLD
+
2171#if (defined(F3DEX_GBI) || defined(F3DLP_GBI))
+
2172#define gSPCullDisplayList(pkt, vstart, vend) \
+
2173 { \
+
2174 Gfx* _g = (Gfx*) (pkt); \
+
2175 \
+
2176 _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | _SHIFTL((vstart) * 2, 0, 16); \
+
2177 _g->words.w1 = _SHIFTL((vend) * 2, 0, 16); \
+
2178 }
+
2179
+
2180#define gsSPCullDisplayList(vstart, vend) \
+
2181 { \
+
2182 { _SHIFTL(G_CULLDL, 24, 8) | _SHIFTL((vstart) * 2, 0, 16), _SHIFTL((vend) * 2, 0, 16) } \
+
2183 }
+
2184#endif
+
2185#else /* F3D_OLD */
+
2186#define gSPCullDisplayList(pkt, vstart, vend) \
+
2187 { \
+
2188 Gfx* _g = (Gfx*) (pkt); \
+
2189 \
+
2190 _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart)) * 40); \
+
2191 _g->words.w1 = (unsigned int) ((0x0f & ((vend) + 1)) * 40); \
+
2192 }
+
2193
+
2194#define gsSPCullDisplayList(vstart, vend) \
+
2195 { \
+
2196 { _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart)) * 40), ((0x0f & ((vend) + 1)) * 40) } \
+
2197 }
+
2198#endif
+
2199
+
2200#define gSPSegment(pkt, segment, base) gMoveWd(pkt, G_MW_SEGMENT, (segment) * 4, base)
+
2201#define gsSPSegment(segment, base) gsMoveWd(G_MW_SEGMENT, (segment) * 4, base)
+
2202
+
2203/*
+
2204 * Clipping Macros
+
2205 */
+
2206#define FR_NEG_FRUSTRATIO_1 0x00000001
+
2207#define FR_POS_FRUSTRATIO_1 0x0000ffff
+
2208#define FR_NEG_FRUSTRATIO_2 0x00000002
+
2209#define FR_POS_FRUSTRATIO_2 0x0000fffe
+
2210#define FR_NEG_FRUSTRATIO_3 0x00000003
+
2211#define FR_POS_FRUSTRATIO_3 0x0000fffd
+
2212#define FR_NEG_FRUSTRATIO_4 0x00000004
+
2213#define FR_POS_FRUSTRATIO_4 0x0000fffc
+
2214#define FR_NEG_FRUSTRATIO_5 0x00000005
+
2215#define FR_POS_FRUSTRATIO_5 0x0000fffb
+
2216#define FR_NEG_FRUSTRATIO_6 0x00000006
+
2217#define FR_POS_FRUSTRATIO_6 0x0000fffa
+
2218/*
+
2219 * r should be one of: FRUSTRATIO_1, FRUSTRATIO_2, FRUSTRATIO_3, ... FRUSTRATIO_6
+
2220 */
+
2221#define gSPClipRatio(pkt, r) \
+
2222 { \
+
2223 gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r); \
+
2224 gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r); \
+
2225 gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r); \
+
2226 gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r); \
+
2227 }
+
2228
+
2229#define gsSPClipRatio(r) \
+
2230 gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r), gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r), \
+
2231 gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r), gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r)
+
2232
+
2233/*
+
2234 * Insert values into Matrix
+
2235 *
+
2236 * where = element of matrix (byte offset)
+
2237 * num = new element (32 bit value replacing 2 int or 2 frac matrix
+
2238 * componants
+
2239 */
+
2240#ifdef F3DEX_GBI_2
+
2241#define gSPInsertMatrix(pkt, where, num) ERROR !!gSPInsertMatrix is no longer supported.
+
2242#define gsSPInsertMatrix(where, num) ERROR !!gsSPInsertMatrix is no longer supported.
+
2243#else
+
2244#define gSPInsertMatrix(pkt, where, num) gMoveWd(pkt, G_MW_MATRIX, where, num)
+
2245#define gsSPInsertMatrix(where, num) gsMoveWd(G_MW_MATRIX, where, num)
+
2246#endif
+
2247
+
2248/*
+
2249 * Load new matrix directly
+
2250 *
+
2251 * mptr = pointer to matrix
+
2252 */
+
2253#ifdef F3DEX_GBI_2
+
2254#define gSPForceMatrix(pkt, mptr) \
+
2255 { \
+
2256 gDma2p((pkt), G_MOVEMEM, (mptr), sizeof(Mtx), G_MV_MATRIX, 0); \
+
2257 gMoveWd((pkt), G_MW_FORCEMTX, 0, 0x00010000); \
+
2258 }
+
2259#define gsSPForceMatrix(mptr) \
+
2260 gsDma2p(G_MOVEMEM, (mptr), sizeof(Mtx), G_MV_MATRIX, 0), gsMoveWd(G_MW_FORCEMTX, 0, 0x00010000)
+
2261
+
2262#else /* F3DEX_GBI_2 */
+
2263#define gSPForceMatrix(pkt, mptr) \
+
2264 { \
+
2265 gDma1p(pkt, G_MOVEMEM, mptr, 16, G_MV_MATRIX_1); \
+
2266 gDma1p(pkt, G_MOVEMEM, (char*) (mptr) + 16, 16, G_MV_MATRIX_2); \
+
2267 gDma1p(pkt, G_MOVEMEM, (char*) (mptr) + 32, 16, G_MV_MATRIX_3); \
+
2268 gDma1p(pkt, G_MOVEMEM, (char*) (mptr) + 48, 16, G_MV_MATRIX_4); \
+
2269 }
+
2270#define gsSPForceMatrix(mptr) \
+
2271 gsDma1p(G_MOVEMEM, mptr, 16, G_MV_MATRIX_1), gsDma1p(G_MOVEMEM, (char*) (mptr) + 16, 16, G_MV_MATRIX_2), \
+
2272 gsDma1p(G_MOVEMEM, (char*) (mptr) + 32, 16, G_MV_MATRIX_3), \
+
2273 gsDma1p(G_MOVEMEM, (char*) (mptr) + 48, 16, G_MV_MATRIX_4)
+
2274#endif /* F3DEX_GBI_2 */
+
2275
+
2276/*
+
2277 * Insert values into Points
+
2278 *
+
2279 * point = point number 0-15
+
2280 * where = which element of point to modify (byte offset into point)
+
2281 * num = new value (32 bit)
+
2282 */
+
2283#if (defined(F3DEX_GBI) || defined(F3DLP_GBI))
+
2284#define gSPModifyVertex(pkt, vtx, where, val) \
+
2285 { \
+
2286 Gfx* _g = (Gfx*) (pkt); \
+
2287 _g->words.w0 = (_SHIFTL(G_MODIFYVTX, 24, 8) | _SHIFTL((where), 16, 8) | _SHIFTL((vtx) * 2, 0, 16)); \
+
2288 _g->words.w1 = (unsigned int) (val); \
+
2289 }
+
2290#define gsSPModifyVertex(vtx, where, val) \
+
2291 { \
+
2292 { _SHIFTL(G_MODIFYVTX, 24, 8) | _SHIFTL((where), 16, 8) | _SHIFTL((vtx) * 2, 0, 16), (unsigned int) (val) } \
+
2293 }
+
2294#else
+
2295#define gSPModifyVertex(pkt, vtx, where, val) gMoveWd(pkt, G_MW_POINTS, (vtx) * 40 + (where), val)
+
2296#define gsSPModifyVertex(vtx, where, val) gsMoveWd(G_MW_POINTS, (vtx) * 40 + (where), val)
+
2297#endif
+
2298
+
2299#if (defined(F3DEX_GBI) || defined(F3DLP_GBI))
+
2300/*
+
2301 * gSPBranchLessZ Branch DL if (vtx.z) less than or equal (zval).
+
2302 *
+
2303 * dl = DL branch to
+
2304 * vtx = Vertex
+
2305 * zval = Screen depth
+
2306 * near = Near plane
+
2307 * far = Far plane
+
2308 * flag = G_BZ_PERSP or G_BZ_ORTHO
+
2309 */
+
2310
+
2311#define G_BZ_PERSP 0
+
2312#define G_BZ_ORTHO 1
+
2313
+
2314#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \
+
2315 (((unsigned int) FTOFIX32( \
+
2316 ((flag) == G_BZ_PERSP ? (1.0f - (float) (near) / (float) (zval)) / (1.0f - (float) (near) / (float) (far)) \
+
2317 : ((float) (zval) - (float) (near)) / ((float) (far) - (float) (near))))) * \
+
2318 (((int) ((zmax) - (zmin))) & ~1) + \
+
2319 (int) FTOFIX32(zmin))
2320
-
2321#define gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, zmin, zmax) \
-
2322 { \
-
2323 Gfx* _g = (Gfx*) (pkt); \
-
2324 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
-
2325 _g->words.w1 = (uintptr_t) (dl); \
-
2326 _g = (Gfx*) (pkt); \
-
2327 _g->words.w0 = (_SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12)); \
-
2328 _g->words.w1 = G_DEPTOZSrg(zval, near, far, flag, zmin, zmax); \
-
2329 }
-
2330
-
2331#define gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, zmin, zmax) \
-
2332 { { \
-
2333 _SHIFTL(G_RDPHALF_1, 24, 8), \
-
2334 (uintptr_t) (dl), \
-
2335 } }, \
-
2336 { \
-
2337 { \
-
2338 _SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12), \
-
2339 G_DEPTOZSrg(zval, near, far, flag, zmin, zmax), \
-
2340 } \
-
2341 }
-
2342
-
2343#define gSPBranchLessZ(pkt, dl, vtx, zval, near, far, flag) \
-
2344 gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, 0, G_MAXZ)
-
2345#define gsSPBranchLessZ(dl, vtx, zval, near, far, flag) gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, 0, G_MAXZ)
-
2346
-
2347/*
-
2348 * gSPBranchLessZraw Branch DL if (vtx.z) less than or equal (raw zval).
-
2349 *
-
2350 * dl = DL branch to
-
2351 * vtx = Vertex
-
2352 * zval = Raw value of screen depth
-
2353 */
-
2354#define gSPBranchLessZraw(pkt, dl, vtx, zval) \
-
2355 { \
-
2356 Gfx* _g = (Gfx*) (pkt); \
-
2357 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
-
2358 _g->words.w1 = (uintptr_t) (dl); \
-
2359 _g = (Gfx*) (pkt); \
-
2360 _g->words.w0 = (_SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12)); \
-
2361 _g->words.w1 = (unsigned int) (zval); \
-
2362 }
-
2363
-
2364#define gsSPBranchLessZraw(dl, vtx, zval) \
-
2365 { { \
-
2366 _SHIFTL(G_RDPHALF_1, 24, 8), \
-
2367 (uintptr_t) (dl), \
-
2368 } }, \
-
2369 { \
-
2370 { \
-
2371 _SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12), \
-
2372 (unsigned int) (zval), \
-
2373 } \
-
2374 }
-
2375
-
2376/*
-
2377 * gSPLoadUcode RSP loads specified ucode.
-
2378 *
-
2379 * uc_start = ucode text section start
-
2380 * uc_dstart = ucode data section start
-
2381 */
-
2382#define gSPLoadUcodeEx(pkt, uc_start, uc_dstart, uc_dsize) \
-
2383 { \
-
2384 Gfx* _g = (Gfx*) (pkt); \
-
2385 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
-
2386 _g->words.w1 = (uintptr_t) (uc_dstart); \
-
2387 _g = (Gfx*) (pkt); \
-
2388 _g->words.w0 = (_SHIFTL(G_LOAD_UCODE, 24, 8) | _SHIFTL((int) (uc_dsize) - 1, 0, 16)); \
-
2389 _g->words.w1 = (uintptr_t) (uc_start); \
-
2390 }
-
2391
-
2392#define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \
-
2393 { { \
-
2394 _SHIFTL(G_RDPHALF_1, 24, 8), \
-
2395 (uintptr_t) (uc_dstart), \
-
2396 } }, \
-
2397 { \
-
2398 { _SHIFTL(G_LOAD_UCODE, 24, 8) | _SHIFTL((int) (uc_dsize) - 1, 0, 16), (uintptr_t) (uc_start), } \
-
2399 }
-
2400
-
2401#define gSPLoadUcode(pkt, uc_start, uc_dstart) gSPLoadUcodeEx((pkt), (uc_start), (uc_dstart), SP_UCODE_DATA_SIZE)
-
2402#define gsSPLoadUcode(uc_start, uc_dstart) gsSPLoadUcodeEx((uc_start), (uc_dstart), SP_UCODE_DATA_SIZE)
-
2403
-
2404#define gSPLoadUcodeL(pkt, ucode) \
-
2405 gSPLoadUcode((pkt), OS_K0_TO_PHYSICAL(&##ucode##TextStart), OS_K0_TO_PHYSICAL(&##ucode##DataStart))
-
2406#define gsSPLoadUcodeL(ucode) \
-
2407 gsSPLoadUcode(OS_K0_TO_PHYSICAL(&##ucode##TextStart), OS_K0_TO_PHYSICAL(&##ucode##DataStart))
-
2408#endif
-
2409
-
2410#ifdef F3DEX_GBI_2
-
2411/*
-
2412 * gSPDma_io DMA to/from DMEM/IMEM for DEBUG.
-
2413 */
-
2414#define gSPDma_io(pkt, flag, dmem, dram, size) \
-
2415 { \
-
2416 Gfx* _g = (Gfx*) (pkt); \
-
2417 _g->words.w0 = _SHIFTL(G_DMA_IO, 24, 8) | _SHIFTL((flag), 23, 1) | _SHIFTL((dmem) / 8, 13, 10) | \
-
2418 _SHIFTL((size) - 1, 0, 12); \
-
2419 _g->words.w1 = (uintptr_t) (dram); \
-
2420 }
-
2421
-
2422#define gsSPDma_io(flag, dmem, dram, size) \
-
2423 { \
-
2424 { \
-
2425 _SHIFTL(G_DMA_IO, 24, 8) | _SHIFTL((flag), 23, 1) | _SHIFTL((dmem) / 8, 13, 10) | \
-
2426 _SHIFTL((size) - 1, 0, 12), \
-
2427 (uintptr_t) (dram) \
-
2428 } \
-
2429 }
-
2430
-
2431#define gSPDmaRead(pkt, dmem, dram, size) gSPDma_io((pkt), 0, (dmem), (dram), (size))
-
2432#define gsSPDmaRead(dmem, dram, size) gsSPDma_io(0, (dmem), (dram), (size))
-
2433#define gSPDmaWrite(pkt, dmem, dram, size) gSPDma_io((pkt), 1, (dmem), (dram), (size))
-
2434#define gsSPDmaWrite(dmem, dram, size) gsSPDma_io(1, (dmem), (dram), (size))
-
2435#endif
-
2436
-
2437/*
-
2438 * Lighting Macros
-
2439 */
-
2440#ifdef F3DEX_GBI_2
-
2441#define NUML(n) ((n) * 24)
-
2442#else
-
2443#define NUML(n) (((n) + 1) * 32 + 0x80000000)
-
2444#endif
-
2445#define NUMLIGHTS_0 1
-
2446#define NUMLIGHTS_1 1
-
2447#define NUMLIGHTS_2 2
-
2448#define NUMLIGHTS_3 3
-
2449#define NUMLIGHTS_4 4
-
2450#define NUMLIGHTS_5 5
-
2451#define NUMLIGHTS_6 6
-
2452#define NUMLIGHTS_7 7
-
2453/*
-
2454 * n should be one of: NUMLIGHTS_0, NUMLIGHTS_1, ..., NUMLIGHTS_7
-
2455 * NOTE: in addition to the number of directional lights specified,
-
2456 * there is always 1 ambient light
-
2457 */
-
2458#define gSPNumLights(pkt, n) gMoveWd(pkt, G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
-
2459#define gsSPNumLights(n) gsMoveWd(G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
-
2460
-
2461#define LIGHT_1 1
-
2462#define LIGHT_2 2
-
2463#define LIGHT_3 3
-
2464#define LIGHT_4 4
-
2465#define LIGHT_5 5
-
2466#define LIGHT_6 6
-
2467#define LIGHT_7 7
-
2468#define LIGHT_8 8
-
2469/*
-
2470 * l should point to a Light struct
-
2471 * n should be one of: LIGHT_1, LIGHT_2, ..., LIGHT_8
-
2472 * NOTE: the highest numbered light is always the ambient light (eg if there are
-
2473 * 3 directional lights defined: gsSPNumLights(NUMLIGHTS_3), then lights
-
2474 * LIGHT_1 through LIGHT_3 will be the directional lights and light
-
2475 * LIGHT_4 will be the ambient light.
-
2476 */
-
2477#ifdef F3DEX_GBI_2
-
2478#define gSPLight(pkt, l, n) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, (n) * 24 + 24)
-
2479#define gsSPLight(l, n) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, (n) * 24 + 24)
-
2480#else /* F3DEX_GBI_2 */
-
2481#define gSPLight(pkt, l, n) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), ((n) - 1) * 2 + G_MV_L0)
-
2482#define gsSPLight(l, n) gsDma1p(G_MOVEMEM, l, sizeof(Light), ((n) - 1) * 2 + G_MV_L0)
-
2483#endif /* F3DEX_GBI_2 */
-
2484
-
2485/*
-
2486 * gSPLightColor changes color of light without recalculating light direction
-
2487 * col is a 32 bit word with r,g,b,a (alpha is ignored)
-
2488 * n should be one of LIGHT_1, LIGHT_2, ..., LIGHT_8
-
2489 */
-
2490#define gSPLightColor(pkt, n, col) \
-
2491 { \
-
2492 gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_a##n, col); \
-
2493 gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_b##n, col); \
-
2494 }
-
2495#define gsSPLightColor(n, col) gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##n, col), gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##n, col)
-
2496
-
2497/* These macros use a structure "name" which is init'd with the gdSPDefLights macros*/
+
2321#define G_DEPTOZS(zval, near, far, flag) G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ)
+
2322
+
2323#define gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, zmin, zmax) \
+
2324 { \
+
2325 Gfx* _g = (Gfx*) (pkt); \
+
2326 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
+
2327 _g->words.w1 = (uintptr_t) (dl); \
+
2328 _g = (Gfx*) (pkt); \
+
2329 _g->words.w0 = (_SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12)); \
+
2330 _g->words.w1 = G_DEPTOZSrg(zval, near, far, flag, zmin, zmax); \
+
2331 }
+
2332
+
2333#define gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, zmin, zmax) \
+
2334 { { \
+
2335 _SHIFTL(G_RDPHALF_1, 24, 8), \
+
2336 (uintptr_t) (dl), \
+
2337 } }, \
+
2338 { \
+
2339 { \
+
2340 _SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12), \
+
2341 G_DEPTOZSrg(zval, near, far, flag, zmin, zmax), \
+
2342 } \
+
2343 }
+
2344
+
2345#define gSPBranchLessZ(pkt, dl, vtx, zval, near, far, flag) \
+
2346 gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, 0, G_MAXZ)
+
2347#define gsSPBranchLessZ(dl, vtx, zval, near, far, flag) gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, 0, G_MAXZ)
+
2348
+
2349/*
+
2350 * gSPBranchLessZraw Branch DL if (vtx.z) less than or equal (raw zval).
+
2351 *
+
2352 * dl = DL branch to
+
2353 * vtx = Vertex
+
2354 * zval = Raw value of screen depth
+
2355 */
+
2356#define gSPBranchLessZraw(pkt, dl, vtx, zval) \
+
2357 { \
+
2358 Gfx* _g = (Gfx*) (pkt); \
+
2359 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
+
2360 _g->words.w1 = (uintptr_t) (dl); \
+
2361 _g = (Gfx*) (pkt); \
+
2362 _g->words.w0 = (_SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12)); \
+
2363 _g->words.w1 = (unsigned int) (zval); \
+
2364 }
+
2365
+
2366#define gsSPBranchLessZraw(dl, vtx, zval) \
+
2367 { { \
+
2368 _SHIFTL(G_RDPHALF_1, 24, 8), \
+
2369 (uintptr_t) (dl), \
+
2370 } }, \
+
2371 { \
+
2372 { \
+
2373 _SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12), \
+
2374 (unsigned int) (zval), \
+
2375 } \
+
2376 }
+
2377
+
2378/*
+
2379 * gSPLoadUcode RSP loads specified ucode.
+
2380 *
+
2381 * uc_start = ucode text section start
+
2382 * uc_dstart = ucode data section start
+
2383 */
+
2384#define gSPLoadUcodeEx(pkt, uc_start, uc_dstart, uc_dsize) \
+
2385 { \
+
2386 Gfx* _g = (Gfx*) (pkt); \
+
2387 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
+
2388 _g->words.w1 = (uintptr_t) (uc_dstart); \
+
2389 _g = (Gfx*) (pkt); \
+
2390 _g->words.w0 = (_SHIFTL(G_LOAD_UCODE, 24, 8) | _SHIFTL((int) (uc_dsize) - 1, 0, 16)); \
+
2391 _g->words.w1 = (uintptr_t) (uc_start); \
+
2392 }
+
2393
+
2394#define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \
+
2395 { { \
+
2396 _SHIFTL(G_RDPHALF_1, 24, 8), \
+
2397 (uintptr_t) (uc_dstart), \
+
2398 } }, \
+
2399 { \
+
2400 { _SHIFTL(G_LOAD_UCODE, 24, 8) | _SHIFTL((int) (uc_dsize) - 1, 0, 16), (uintptr_t) (uc_start), } \
+
2401 }
+
2402
+
2403#define gSPLoadUcode(pkt, uc_start, uc_dstart) gSPLoadUcodeEx((pkt), (uc_start), (uc_dstart), SP_UCODE_DATA_SIZE)
+
2404#define gsSPLoadUcode(uc_start, uc_dstart) gsSPLoadUcodeEx((uc_start), (uc_dstart), SP_UCODE_DATA_SIZE)
+
2405
+
2406#define gSPLoadUcodeL(pkt, ucode) \
+
2407 gSPLoadUcode((pkt), OS_K0_TO_PHYSICAL(&##ucode##TextStart), OS_K0_TO_PHYSICAL(&##ucode##DataStart))
+
2408#define gsSPLoadUcodeL(ucode) \
+
2409 gsSPLoadUcode(OS_K0_TO_PHYSICAL(&##ucode##TextStart), OS_K0_TO_PHYSICAL(&##ucode##DataStart))
+
2410#endif
+
2411
+
2412#ifdef F3DEX_GBI_2
+
2413/*
+
2414 * gSPDma_io DMA to/from DMEM/IMEM for DEBUG.
+
2415 */
+
2416#define gSPDma_io(pkt, flag, dmem, dram, size) \
+
2417 { \
+
2418 Gfx* _g = (Gfx*) (pkt); \
+
2419 _g->words.w0 = _SHIFTL(G_DMA_IO, 24, 8) | _SHIFTL((flag), 23, 1) | _SHIFTL((dmem) / 8, 13, 10) | \
+
2420 _SHIFTL((size) - 1, 0, 12); \
+
2421 _g->words.w1 = (uintptr_t) (dram); \
+
2422 }
+
2423
+
2424#define gsSPDma_io(flag, dmem, dram, size) \
+
2425 { \
+
2426 { \
+
2427 _SHIFTL(G_DMA_IO, 24, 8) | _SHIFTL((flag), 23, 1) | _SHIFTL((dmem) / 8, 13, 10) | \
+
2428 _SHIFTL((size) - 1, 0, 12), \
+
2429 (uintptr_t) (dram) \
+
2430 } \
+
2431 }
+
2432
+
2433#define gSPDmaRead(pkt, dmem, dram, size) gSPDma_io((pkt), 0, (dmem), (dram), (size))
+
2434#define gsSPDmaRead(dmem, dram, size) gsSPDma_io(0, (dmem), (dram), (size))
+
2435#define gSPDmaWrite(pkt, dmem, dram, size) gSPDma_io((pkt), 1, (dmem), (dram), (size))
+
2436#define gsSPDmaWrite(dmem, dram, size) gsSPDma_io(1, (dmem), (dram), (size))
+
2437#endif
+
2438
+
2439/*
+
2440 * Lighting Macros
+
2441 */
+
2442#ifdef F3DEX_GBI_2
+
2443#define NUML(n) ((n) * 24)
+
2444#else
+
2445#define NUML(n) (((n) + 1) * 32 + 0x80000000)
+
2446#endif
+
2447#define NUMLIGHTS_0 1
+
2448#define NUMLIGHTS_1 1
+
2449#define NUMLIGHTS_2 2
+
2450#define NUMLIGHTS_3 3
+
2451#define NUMLIGHTS_4 4
+
2452#define NUMLIGHTS_5 5
+
2453#define NUMLIGHTS_6 6
+
2454#define NUMLIGHTS_7 7
+
2455/*
+
2456 * n should be one of: NUMLIGHTS_0, NUMLIGHTS_1, ..., NUMLIGHTS_7
+
2457 * NOTE: in addition to the number of directional lights specified,
+
2458 * there is always 1 ambient light
+
2459 */
+
2460#define gSPNumLights(pkt, n) gMoveWd(pkt, G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
+
2461#define gsSPNumLights(n) gsMoveWd(G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
+
2462
+
2463#define LIGHT_1 1
+
2464#define LIGHT_2 2
+
2465#define LIGHT_3 3
+
2466#define LIGHT_4 4
+
2467#define LIGHT_5 5
+
2468#define LIGHT_6 6
+
2469#define LIGHT_7 7
+
2470#define LIGHT_8 8
+
2471/*
+
2472 * l should point to a Light struct
+
2473 * n should be one of: LIGHT_1, LIGHT_2, ..., LIGHT_8
+
2474 * NOTE: the highest numbered light is always the ambient light (eg if there are
+
2475 * 3 directional lights defined: gsSPNumLights(NUMLIGHTS_3), then lights
+
2476 * LIGHT_1 through LIGHT_3 will be the directional lights and light
+
2477 * LIGHT_4 will be the ambient light.
+
2478 */
+
2479#ifdef F3DEX_GBI_2
+
2480#define gSPLight(pkt, l, n) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, (n) * 24 + 24)
+
2481#define gsSPLight(l, n) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, (n) * 24 + 24)
+
2482#else /* F3DEX_GBI_2 */
+
2483#define gSPLight(pkt, l, n) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), ((n) - 1) * 2 + G_MV_L0)
+
2484#define gsSPLight(l, n) gsDma1p(G_MOVEMEM, l, sizeof(Light), ((n) - 1) * 2 + G_MV_L0)
+
2485#endif /* F3DEX_GBI_2 */
+
2486
+
2487/*
+
2488 * gSPLightColor changes color of light without recalculating light direction
+
2489 * col is a 32 bit word with r,g,b,a (alpha is ignored)
+
2490 * n should be one of LIGHT_1, LIGHT_2, ..., LIGHT_8
+
2491 */
+
2492#define gSPLightColor(pkt, n, col) \
+
2493 { \
+
2494 gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_a##n, col); \
+
2495 gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_b##n, col); \
+
2496 }
+
2497#define gsSPLightColor(n, col) gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##n, col), gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##n, col)
2498
-
2499#define gSPSetLights0(pkt, name) \
-
2500 { \
-
2501 gSPNumLights(pkt, NUMLIGHTS_0); \
-
2502 gSPLight(pkt, &name.l[0], 1); \
-
2503 gSPLight(pkt, &name.a, 2); \
-
2504 }
-
2505#define gsSPSetLights0(name) gsSPNumLights(NUMLIGHTS_0), gsSPLight(&name.l[0], 1), gsSPLight(&name.a, 2)
-
2506
-
2507#define gSPSetLights1(pkt, name) \
-
2508 { \
-
2509 gSPNumLights(pkt, NUMLIGHTS_1); \
-
2510 gSPLight(pkt, &name.l[0], 1); \
-
2511 gSPLight(pkt, &name.a, 2); \
-
2512 }
-
2513#define gsSPSetLights1(name) gsSPNumLights(NUMLIGHTS_1), gsSPLight(&name.l[0], 1), gsSPLight(&name.a, 2)
-
2514
-
2515#define gSPSetLights2(pkt, name) \
-
2516 { \
-
2517 gSPNumLights(pkt, NUMLIGHTS_2); \
-
2518 gSPLight(pkt, &name.l[0], 1); \
-
2519 gSPLight(pkt, &name.l[1], 2); \
-
2520 gSPLight(pkt, &name.a, 3); \
-
2521 }
-
2522#define gsSPSetLights2(name) \
-
2523 gsSPNumLights(NUMLIGHTS_2), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.a, 3)
-
2524
-
2525#define gSPSetLights3(pkt, name) \
-
2526 { \
-
2527 gSPNumLights(pkt, NUMLIGHTS_3); \
-
2528 gSPLight(pkt, &name.l[0], 1); \
-
2529 gSPLight(pkt, &name.l[1], 2); \
-
2530 gSPLight(pkt, &name.l[2], 3); \
-
2531 gSPLight(pkt, &name.a, 4); \
-
2532 }
-
2533#define gsSPSetLights3(name) \
-
2534 gsSPNumLights(NUMLIGHTS_3), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
-
2535 gsSPLight(&name.a, 4)
-
2536
-
2537#define gSPSetLights4(pkt, name) \
-
2538 { \
-
2539 gSPNumLights(pkt, NUMLIGHTS_4); \
-
2540 gSPLight(pkt, &name.l[0], 1); \
-
2541 gSPLight(pkt, &name.l[1], 2); \
-
2542 gSPLight(pkt, &name.l[2], 3); \
-
2543 gSPLight(pkt, &name.l[3], 4); \
-
2544 gSPLight(pkt, &name.a, 5); \
-
2545 }
-
2546#define gsSPSetLights4(name) \
-
2547 gsSPNumLights(NUMLIGHTS_4), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
-
2548 gsSPLight(&name.l[3], 4), gsSPLight(&name.a, 5)
-
2549
-
2550#define gSPSetLights5(pkt, name) \
-
2551 { \
-
2552 gSPNumLights(pkt, NUMLIGHTS_5); \
-
2553 gSPLight(pkt, &name.l[0], 1); \
-
2554 gSPLight(pkt, &name.l[1], 2); \
-
2555 gSPLight(pkt, &name.l[2], 3); \
-
2556 gSPLight(pkt, &name.l[3], 4); \
-
2557 gSPLight(pkt, &name.l[4], 5); \
-
2558 gSPLight(pkt, &name.a, 6); \
-
2559 }
-
2560
-
2561#define gsSPSetLights5(name) \
-
2562 gsSPNumLights(NUMLIGHTS_5), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
-
2563 gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.a, 6)
-
2564
-
2565#define gSPSetLights6(pkt, name) \
-
2566 { \
-
2567 gSPNumLights(pkt, NUMLIGHTS_6); \
-
2568 gSPLight(pkt, &name.l[0], 1); \
-
2569 gSPLight(pkt, &name.l[1], 2); \
-
2570 gSPLight(pkt, &name.l[2], 3); \
-
2571 gSPLight(pkt, &name.l[3], 4); \
-
2572 gSPLight(pkt, &name.l[4], 5); \
-
2573 gSPLight(pkt, &name.l[5], 6); \
-
2574 gSPLight(pkt, &name.a, 7); \
-
2575 }
-
2576
-
2577#define gsSPSetLights6(name) \
-
2578 gsSPNumLights(NUMLIGHTS_6), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
-
2579 gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.l[5], 6), gsSPLight(&name.a, 7)
-
2580
-
2581#define gSPSetLights7(pkt, name) \
-
2582 { \
-
2583 gSPNumLights(pkt, NUMLIGHTS_7); \
-
2584 gSPLight(pkt, &name.l[0], 1); \
-
2585 gSPLight(pkt, &name.l[1], 2); \
-
2586 gSPLight(pkt, &name.l[2], 3); \
-
2587 gSPLight(pkt, &name.l[3], 4); \
-
2588 gSPLight(pkt, &name.l[4], 5); \
-
2589 gSPLight(pkt, &name.l[5], 6); \
-
2590 gSPLight(pkt, &name.l[6], 7); \
-
2591 gSPLight(pkt, &name.a, 8); \
-
2592 }
-
2593
-
2594#define gsSPSetLights7(name) \
-
2595 gsSPNumLights(NUMLIGHTS_7), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
-
2596 gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.l[5], 6), gsSPLight(&name.l[6], 7), \
-
2597 gsSPLight(&name.a, 8)
-
2598
-
2599/*
-
2600 * Reflection/Hiliting Macros
-
2601 */
-
2602#ifdef F3DEX_GBI_2
-
2603#define gSPLookAtX(pkt, l) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX)
-
2604#define gsSPLookAtX(l) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX)
-
2605#define gSPLookAtY(pkt, l) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY)
-
2606#define gsSPLookAtY(l) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY)
-
2607#else /* F3DEX_GBI_2 */
-
2608#define gSPLookAtX(pkt, l) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATX)
-
2609#define gsSPLookAtX(l) gsDma1p(G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATX)
-
2610#define gSPLookAtY(pkt, l) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATY)
-
2611#define gsSPLookAtY(l) gsDma1p(G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATY)
-
2612#endif /* F3DEX_GBI_2 */
-
2613
-
2614#define gSPLookAt(pkt, la) { gSPLookAtX(pkt, la) gSPLookAtY(pkt, (char*) (la) + 16) }
-
2615#define gsSPLookAt(la) gsSPLookAtX(la), gsSPLookAtY((char*) (la) + 16)
-
2616
-
2617#define gDPSetHilite1Tile(pkt, tile, hilite, width, height) \
-
2618 gDPSetTileSize(pkt, tile, (hilite)->h.x1 & 0xfff, (hilite)->h.y1 & 0xfff, \
-
2619 ((((width) - 1) * 4) + (hilite)->h.x1) & 0xfff, ((((height) - 1) * 4) + (hilite)->h.y1) & 0xfff)
-
2620
-
2621#define gDPSetHilite2Tile(pkt, tile, hilite, width, height) \
-
2622 gDPSetTileSize(pkt, tile, (hilite)->h.x2 & 0xfff, (hilite)->h.y2 & 0xfff, \
-
2623 ((((width) - 1) * 4) + (hilite)->h.x2) & 0xfff, ((((height) - 1) * 4) + (hilite)->h.y2) & 0xfff)
-
2624
-
2625/*
-
2626 * FOG macros
-
2627 * fm = z multiplier
-
2628 * fo = z offset
-
2629 * FOG FORMULA: alpha(fog) = (eyespace z) * fm + fo CLAMPED 0 to 255
-
2630 * note: (eyespace z) ranges -1 to 1
-
2631 *
-
2632 * Alternate method of setting fog:
-
2633 * min, max: range 0 to 1000: 0=nearplane, 1000=farplane
-
2634 * min is where fog begins (usually less than max and often 0)
-
2635 * max is where fog is thickest (usually 1000)
-
2636 *
-
2637 */
-
2638#define gSPFogFactor(pkt, fm, fo) gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16)))
-
2639
-
2640#define gsSPFogFactor(fm, fo) gsMoveWd(G_MW_FOG, G_MWO_FOG, (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16)))
-
2641
-
2642#define gSPFogPosition(pkt, min, max) \
-
2643 gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \
-
2644 (_SHIFTL((128000 / ((max) - (min))), 16, 16) | _SHIFTL(((500 - (min)) * 256 / ((max) - (min))), 0, 16)))
-
2645
-
2646#define gsSPFogPosition(min, max) \
-
2647 gsMoveWd(G_MW_FOG, G_MWO_FOG, \
-
2648 (_SHIFTL((128000 / ((max) - (min))), 16, 16) | _SHIFTL(((500 - (min)) * 256 / ((max) - (min))), 0, 16)))
-
2649
-
2650#ifdef F3DEX_GBI_2
-
2651/*
-
2652 * Macros to turn texture on/off
-
2653 */
-
2654#define gSPTexture(pkt, s, t, level, tile, on) \
-
2655 { \
-
2656 Gfx* _g = (Gfx*) (pkt); \
-
2657 \
-
2658 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | \
-
2659 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 1, 7)); \
-
2660 _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \
-
2661 }
-
2662#define gsSPTexture(s, t, level, tile, on) \
-
2663 { \
-
2664 { \
-
2665 (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | \
-
2666 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 1, 7)), \
-
2667 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \
-
2668 } \
-
2669 }
-
2670/*
-
2671 * Different version of SPTexture macro, has an additional parameter
-
2672 * which is currently reserved in the microcode.
-
2673 */
-
2674#define gSPTextureL(pkt, s, t, level, xparam, tile, on) \
-
2675 { \
-
2676 Gfx* _g = (Gfx*) (pkt); \
-
2677 \
-
2678 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | \
-
2679 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 1, 7)); \
-
2680 _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \
-
2681 }
-
2682#define gsSPTextureL(s, t, level, xparam, tile, on) \
-
2683 { \
-
2684 { \
-
2685 (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | _SHIFTL((tile), 8, 3) | \
-
2686 _SHIFTL((on), 1, 7)), \
-
2687 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \
-
2688 } \
-
2689 }
-
2690#else
-
2691/*
-
2692 * Macros to turn texture on/off
-
2693 */
-
2694#define gSPTexture(pkt, s, t, level, tile, on) \
-
2695 { \
-
2696 Gfx* _g = (Gfx*) (pkt); \
-
2697 \
-
2698 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | \
-
2699 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 0, 8)); \
-
2700 _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \
-
2701 }
-
2702#define gsSPTexture(s, t, level, tile, on) \
-
2703 { \
-
2704 { \
-
2705 (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | \
-
2706 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 0, 8)), \
-
2707 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \
-
2708 } \
-
2709 }
-
2710/*
-
2711 * Different version of SPTexture macro, has an additional parameter
-
2712 * which is currently reserved in the microcode.
-
2713 */
-
2714#define gSPTextureL(pkt, s, t, level, xparam, tile, on) \
-
2715 { \
-
2716 Gfx* _g = (Gfx*) (pkt); \
-
2717 \
-
2718 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | \
-
2719 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 0, 8)); \
-
2720 _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \
-
2721 }
-
2722#define gsSPTextureL(s, t, level, xparam, tile, on) \
-
2723 { \
-
2724 { \
-
2725 (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | _SHIFTL((tile), 8, 3) | \
-
2726 _SHIFTL((on), 0, 8)), \
-
2727 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \
-
2728 } \
-
2729 }
-
2730#endif
-
2731
-
2732#ifndef F3D_OLD
-
2733#define gSPPerspNormalize(pkt, s) gMoveWd(pkt, G_MW_PERSPNORM, 0, (s))
-
2734#define gsSPPerspNormalize(s) gsMoveWd(G_MW_PERSPNORM, 0, (s))
-
2735#else
-
2736#define gSPPerspNormalize(pkt, s) \
-
2737 { \
-
2738 Gfx* _g = (Gfx*) (pkt); \
-
2739 \
-
2740 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
-
2741 _g->words.w1 = (s); \
-
2742 }
-
2743#define gsSPPerspNormalize(s) \
-
2744 { \
-
2745 { _SHIFTL(G_RDPHALF_1, 24, 8), (s) } \
-
2746 }
-
2747#endif
-
2748
-
2749#ifdef F3DEX_GBI_2
-
2750#define gSPPopMatrixN(pkt, n, num) gDma2p((pkt), G_POPMTX, (num) * 64, 64, 2, 0)
-
2751#define gsSPPopMatrixN(n, num) gsDma2p(G_POPMTX, (num) * 64, 64, 2, 0)
-
2752#define gSPPopMatrix(pkt, n) gSPPopMatrixN((pkt), (n), 1)
-
2753#define gsSPPopMatrix(n) gsSPPopMatrixN((n), 1)
-
2754#else /* F3DEX_GBI_2 */
-
2755#define gSPPopMatrix(pkt, n) gImmp1(pkt, G_POPMTX, n)
-
2756#define gsSPPopMatrix(n) gsImmp1(G_POPMTX, n)
-
2757#endif /* F3DEX_GBI_2 */
-
2758
-
2759#define gSPEndDisplayList(pkt) \
-
2760 { \
-
2761 Gfx* _g = (Gfx*) (pkt); \
-
2762 \
-
2763 _g->words.w0 = _SHIFTL(G_ENDDL, 24, 8); \
-
2764 _g->words.w1 = 0; \
-
2765 }
-
2766
-
2767#define gsSPEndDisplayList() \
-
2768 { \
-
2769 { _SHIFTL(G_ENDDL, 24, 8), 0 } \
-
2770 }
-
2771
-
2772#ifdef F3DEX_GBI_2
-
2773/*
-
2774 * One gSPGeometryMode(pkt,c,s) GBI is equal to these two GBIs.
-
2775 *
-
2776 * gSPClearGeometryMode(pkt,c)
-
2777 * gSPSetGeometryMode(pkt,s)
+
2499/* These macros use a structure "name" which is init'd with the gdSPDefLights macros*/
+
2500
+
2501#define gSPSetLights0(pkt, name) \
+
2502 { \
+
2503 gSPNumLights(pkt, NUMLIGHTS_0); \
+
2504 gSPLight(pkt, &name.l[0], 1); \
+
2505 gSPLight(pkt, &name.a, 2); \
+
2506 }
+
2507#define gsSPSetLights0(name) gsSPNumLights(NUMLIGHTS_0), gsSPLight(&name.l[0], 1), gsSPLight(&name.a, 2)
+
2508
+
2509#define gSPSetLights1(pkt, name) \
+
2510 { \
+
2511 gSPNumLights(pkt, NUMLIGHTS_1); \
+
2512 gSPLight(pkt, &name.l[0], 1); \
+
2513 gSPLight(pkt, &name.a, 2); \
+
2514 }
+
2515#define gsSPSetLights1(name) gsSPNumLights(NUMLIGHTS_1), gsSPLight(&name.l[0], 1), gsSPLight(&name.a, 2)
+
2516
+
2517#define gSPSetLights2(pkt, name) \
+
2518 { \
+
2519 gSPNumLights(pkt, NUMLIGHTS_2); \
+
2520 gSPLight(pkt, &name.l[0], 1); \
+
2521 gSPLight(pkt, &name.l[1], 2); \
+
2522 gSPLight(pkt, &name.a, 3); \
+
2523 }
+
2524#define gsSPSetLights2(name) \
+
2525 gsSPNumLights(NUMLIGHTS_2), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.a, 3)
+
2526
+
2527#define gSPSetLights3(pkt, name) \
+
2528 { \
+
2529 gSPNumLights(pkt, NUMLIGHTS_3); \
+
2530 gSPLight(pkt, &name.l[0], 1); \
+
2531 gSPLight(pkt, &name.l[1], 2); \
+
2532 gSPLight(pkt, &name.l[2], 3); \
+
2533 gSPLight(pkt, &name.a, 4); \
+
2534 }
+
2535#define gsSPSetLights3(name) \
+
2536 gsSPNumLights(NUMLIGHTS_3), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
+
2537 gsSPLight(&name.a, 4)
+
2538
+
2539#define gSPSetLights4(pkt, name) \
+
2540 { \
+
2541 gSPNumLights(pkt, NUMLIGHTS_4); \
+
2542 gSPLight(pkt, &name.l[0], 1); \
+
2543 gSPLight(pkt, &name.l[1], 2); \
+
2544 gSPLight(pkt, &name.l[2], 3); \
+
2545 gSPLight(pkt, &name.l[3], 4); \
+
2546 gSPLight(pkt, &name.a, 5); \
+
2547 }
+
2548#define gsSPSetLights4(name) \
+
2549 gsSPNumLights(NUMLIGHTS_4), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
+
2550 gsSPLight(&name.l[3], 4), gsSPLight(&name.a, 5)
+
2551
+
2552#define gSPSetLights5(pkt, name) \
+
2553 { \
+
2554 gSPNumLights(pkt, NUMLIGHTS_5); \
+
2555 gSPLight(pkt, &name.l[0], 1); \
+
2556 gSPLight(pkt, &name.l[1], 2); \
+
2557 gSPLight(pkt, &name.l[2], 3); \
+
2558 gSPLight(pkt, &name.l[3], 4); \
+
2559 gSPLight(pkt, &name.l[4], 5); \
+
2560 gSPLight(pkt, &name.a, 6); \
+
2561 }
+
2562
+
2563#define gsSPSetLights5(name) \
+
2564 gsSPNumLights(NUMLIGHTS_5), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
+
2565 gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.a, 6)
+
2566
+
2567#define gSPSetLights6(pkt, name) \
+
2568 { \
+
2569 gSPNumLights(pkt, NUMLIGHTS_6); \
+
2570 gSPLight(pkt, &name.l[0], 1); \
+
2571 gSPLight(pkt, &name.l[1], 2); \
+
2572 gSPLight(pkt, &name.l[2], 3); \
+
2573 gSPLight(pkt, &name.l[3], 4); \
+
2574 gSPLight(pkt, &name.l[4], 5); \
+
2575 gSPLight(pkt, &name.l[5], 6); \
+
2576 gSPLight(pkt, &name.a, 7); \
+
2577 }
+
2578
+
2579#define gsSPSetLights6(name) \
+
2580 gsSPNumLights(NUMLIGHTS_6), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
+
2581 gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.l[5], 6), gsSPLight(&name.a, 7)
+
2582
+
2583#define gSPSetLights7(pkt, name) \
+
2584 { \
+
2585 gSPNumLights(pkt, NUMLIGHTS_7); \
+
2586 gSPLight(pkt, &name.l[0], 1); \
+
2587 gSPLight(pkt, &name.l[1], 2); \
+
2588 gSPLight(pkt, &name.l[2], 3); \
+
2589 gSPLight(pkt, &name.l[3], 4); \
+
2590 gSPLight(pkt, &name.l[4], 5); \
+
2591 gSPLight(pkt, &name.l[5], 6); \
+
2592 gSPLight(pkt, &name.l[6], 7); \
+
2593 gSPLight(pkt, &name.a, 8); \
+
2594 }
+
2595
+
2596#define gsSPSetLights7(name) \
+
2597 gsSPNumLights(NUMLIGHTS_7), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \
+
2598 gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.l[5], 6), gsSPLight(&name.l[6], 7), \
+
2599 gsSPLight(&name.a, 8)
+
2600
+
2601/*
+
2602 * Reflection/Hiliting Macros
+
2603 */
+
2604#ifdef F3DEX_GBI_2
+
2605#define gSPLookAtX(pkt, l) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX)
+
2606#define gsSPLookAtX(l) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX)
+
2607#define gSPLookAtY(pkt, l) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY)
+
2608#define gsSPLookAtY(l) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY)
+
2609#else /* F3DEX_GBI_2 */
+
2610#define gSPLookAtX(pkt, l) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATX)
+
2611#define gsSPLookAtX(l) gsDma1p(G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATX)
+
2612#define gSPLookAtY(pkt, l) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATY)
+
2613#define gsSPLookAtY(l) gsDma1p(G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATY)
+
2614#endif /* F3DEX_GBI_2 */
+
2615
+
2616#define gSPLookAt(pkt, la) \
+
2617 { gSPLookAtX(pkt, la) gSPLookAtY(pkt, (char*) (la) + 16) }
+
2618#define gsSPLookAt(la) gsSPLookAtX(la), gsSPLookAtY((char*) (la) + 16)
+
2619
+
2620#define gDPSetHilite1Tile(pkt, tile, hilite, width, height) \
+
2621 gDPSetTileSize(pkt, tile, (hilite)->h.x1 & 0xfff, (hilite)->h.y1 & 0xfff, \
+
2622 ((((width) - 1) * 4) + (hilite)->h.x1) & 0xfff, ((((height) - 1) * 4) + (hilite)->h.y1) & 0xfff)
+
2623
+
2624#define gDPSetHilite2Tile(pkt, tile, hilite, width, height) \
+
2625 gDPSetTileSize(pkt, tile, (hilite)->h.x2 & 0xfff, (hilite)->h.y2 & 0xfff, \
+
2626 ((((width) - 1) * 4) + (hilite)->h.x2) & 0xfff, ((((height) - 1) * 4) + (hilite)->h.y2) & 0xfff)
+
2627
+
2628/*
+
2629 * FOG macros
+
2630 * fm = z multiplier
+
2631 * fo = z offset
+
2632 * FOG FORMULA: alpha(fog) = (eyespace z) * fm + fo CLAMPED 0 to 255
+
2633 * note: (eyespace z) ranges -1 to 1
+
2634 *
+
2635 * Alternate method of setting fog:
+
2636 * min, max: range 0 to 1000: 0=nearplane, 1000=farplane
+
2637 * min is where fog begins (usually less than max and often 0)
+
2638 * max is where fog is thickest (usually 1000)
+
2639 *
+
2640 */
+
2641#define gSPFogFactor(pkt, fm, fo) gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16)))
+
2642
+
2643#define gsSPFogFactor(fm, fo) gsMoveWd(G_MW_FOG, G_MWO_FOG, (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16)))
+
2644
+
2645#define gSPFogPosition(pkt, min, max) \
+
2646 gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \
+
2647 (_SHIFTL((128000 / ((max) - (min))), 16, 16) | _SHIFTL(((500 - (min)) * 256 / ((max) - (min))), 0, 16)))
+
2648
+
2649#define gsSPFogPosition(min, max) \
+
2650 gsMoveWd(G_MW_FOG, G_MWO_FOG, \
+
2651 (_SHIFTL((128000 / ((max) - (min))), 16, 16) | _SHIFTL(((500 - (min)) * 256 / ((max) - (min))), 0, 16)))
+
2652
+
2653#ifdef F3DEX_GBI_2
+
2654/*
+
2655 * Macros to turn texture on/off
+
2656 */
+
2657#define gSPTexture(pkt, s, t, level, tile, on) \
+
2658 { \
+
2659 Gfx* _g = (Gfx*) (pkt); \
+
2660 \
+
2661 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | \
+
2662 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 1, 7)); \
+
2663 _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \
+
2664 }
+
2665#define gsSPTexture(s, t, level, tile, on) \
+
2666 { \
+
2667 { \
+
2668 (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | \
+
2669 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 1, 7)), \
+
2670 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \
+
2671 } \
+
2672 }
+
2673/*
+
2674 * Different version of SPTexture macro, has an additional parameter
+
2675 * which is currently reserved in the microcode.
+
2676 */
+
2677#define gSPTextureL(pkt, s, t, level, xparam, tile, on) \
+
2678 { \
+
2679 Gfx* _g = (Gfx*) (pkt); \
+
2680 \
+
2681 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | \
+
2682 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 1, 7)); \
+
2683 _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \
+
2684 }
+
2685#define gsSPTextureL(s, t, level, xparam, tile, on) \
+
2686 { \
+
2687 { \
+
2688 (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | _SHIFTL((tile), 8, 3) | \
+
2689 _SHIFTL((on), 1, 7)), \
+
2690 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \
+
2691 } \
+
2692 }
+
2693#else
+
2694/*
+
2695 * Macros to turn texture on/off
+
2696 */
+
2697#define gSPTexture(pkt, s, t, level, tile, on) \
+
2698 { \
+
2699 Gfx* _g = (Gfx*) (pkt); \
+
2700 \
+
2701 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | \
+
2702 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 0, 8)); \
+
2703 _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \
+
2704 }
+
2705#define gsSPTexture(s, t, level, tile, on) \
+
2706 { \
+
2707 { \
+
2708 (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | \
+
2709 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 0, 8)), \
+
2710 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \
+
2711 } \
+
2712 }
+
2713/*
+
2714 * Different version of SPTexture macro, has an additional parameter
+
2715 * which is currently reserved in the microcode.
+
2716 */
+
2717#define gSPTextureL(pkt, s, t, level, xparam, tile, on) \
+
2718 { \
+
2719 Gfx* _g = (Gfx*) (pkt); \
+
2720 \
+
2721 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | \
+
2722 _SHIFTL((tile), 8, 3) | _SHIFTL((on), 0, 8)); \
+
2723 _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \
+
2724 }
+
2725#define gsSPTextureL(s, t, level, xparam, tile, on) \
+
2726 { \
+
2727 { \
+
2728 (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | _SHIFTL((tile), 8, 3) | \
+
2729 _SHIFTL((on), 0, 8)), \
+
2730 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \
+
2731 } \
+
2732 }
+
2733#endif
+
2734
+
2735#ifndef F3D_OLD
+
2736#define gSPPerspNormalize(pkt, s) gMoveWd(pkt, G_MW_PERSPNORM, 0, (s))
+
2737#define gsSPPerspNormalize(s) gsMoveWd(G_MW_PERSPNORM, 0, (s))
+
2738#else
+
2739#define gSPPerspNormalize(pkt, s) \
+
2740 { \
+
2741 Gfx* _g = (Gfx*) (pkt); \
+
2742 \
+
2743 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
+
2744 _g->words.w1 = (s); \
+
2745 }
+
2746#define gsSPPerspNormalize(s) \
+
2747 { \
+
2748 { _SHIFTL(G_RDPHALF_1, 24, 8), (s) } \
+
2749 }
+
2750#endif
+
2751
+
2752#ifdef F3DEX_GBI_2
+
2753#define gSPPopMatrixN(pkt, n, num) gDma2p((pkt), G_POPMTX, (num) * 64, 64, 2, 0)
+
2754#define gsSPPopMatrixN(n, num) gsDma2p(G_POPMTX, (num) * 64, 64, 2, 0)
+
2755#define gSPPopMatrix(pkt, n) gSPPopMatrixN((pkt), (n), 1)
+
2756#define gsSPPopMatrix(n) gsSPPopMatrixN((n), 1)
+
2757#else /* F3DEX_GBI_2 */
+
2758#define gSPPopMatrix(pkt, n) gImmp1(pkt, G_POPMTX, n)
+
2759#define gsSPPopMatrix(n) gsImmp1(G_POPMTX, n)
+
2760#endif /* F3DEX_GBI_2 */
+
2761
+
2762#define gSPEndDisplayList(pkt) \
+
2763 { \
+
2764 Gfx* _g = (Gfx*) (pkt); \
+
2765 \
+
2766 _g->words.w0 = _SHIFTL(G_ENDDL, 24, 8); \
+
2767 _g->words.w1 = 0; \
+
2768 }
+
2769
+
2770#define gsSPEndDisplayList() \
+
2771 { \
+
2772 { _SHIFTL(G_ENDDL, 24, 8), 0 } \
+
2773 }
+
2774
+
2775#ifdef F3DEX_GBI_2
+
2776/*
+
2777 * One gSPGeometryMode(pkt,c,s) GBI is equal to these two GBIs.
2778 *
-
2779 * gSPLoadGeometryMode(pkt, word) sets GeometryMode directly.
-
2780 */
-
2781#define gSPGeometryMode(pkt, c, s) \
-
2782 { \
-
2783 Gfx* _g = (Gfx*) (pkt); \
-
2784 _g->words.w0 = _SHIFTL(G_GEOMETRYMODE, 24, 8) | _SHIFTL(~(u32) (c), 0, 24); \
-
2785 _g->words.w1 = (u32) (s); \
-
2786 }
-
2787
-
2788#define gsSPGeometryMode(c, s) \
-
2789 { \
-
2790 { (_SHIFTL(G_GEOMETRYMODE, 24, 8) | _SHIFTL(~(u32) (c), 0, 24)), (u32) (s) } \
-
2791 }
-
2792#define gSPSetGeometryMode(pkt, word) gSPGeometryMode((pkt), 0, (word))
-
2793#define gsSPSetGeometryMode(word) gsSPGeometryMode(0, (word))
-
2794#define gSPClearGeometryMode(pkt, word) gSPGeometryMode((pkt), (word), 0)
-
2795#define gsSPClearGeometryMode(word) gsSPGeometryMode((word), 0)
-
2796#define gSPLoadGeometryMode(pkt, word) gSPGeometryMode((pkt), -1, (word))
-
2797#define gsSPLoadGeometryMode(word) gsSPGeometryMode(-1, (word))
-
2798#define gsSPGeometryModeSetFirst(c, s) gsSPGeometryMode(c, s)
-
2799#else /* F3DEX_GBI_2 */
-
2800#define gSPSetGeometryMode(pkt, word) \
-
2801 { \
-
2802 Gfx* _g = (Gfx*) (pkt); \
-
2803 \
-
2804 _g->words.w0 = _SHIFTL(G_SETGEOMETRYMODE, 24, 8); \
-
2805 _g->words.w1 = (unsigned int) (word); \
-
2806 }
-
2807
-
2808#define gsSPSetGeometryMode(word) \
-
2809 { \
-
2810 { _SHIFTL(G_SETGEOMETRYMODE, 24, 8), (unsigned int) (word) } \
-
2811 }
-
2812
-
2813#define gSPClearGeometryMode(pkt, word) \
-
2814 { \
-
2815 Gfx* _g = (Gfx*) (pkt); \
-
2816 \
-
2817 _g->words.w0 = _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8); \
-
2818 _g->words.w1 = (unsigned int) (word); \
-
2819 }
-
2820
-
2821#define gsSPClearGeometryMode(word) \
-
2822 { \
-
2823 { _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8), (unsigned int) (word) } \
-
2824 }
-
2825
-
2826/*
-
2827 * gsSPGeometryMode
-
2828 * In Fast3DEX2 it is better to use this, as the RSP geometry mode
-
2829 * is able to be set and cleared in a single command.
-
2830 */
-
2831#define gsSPGeometryMode(c, s) gsSPClearGeometryMode(c), gsSPSetGeometryMode(s)
-
2832#define gsSPGeometryModeSetFirst(c, s) gsSPSetGeometryMode(s), gsSPClearGeometryMode(c)
-
2833#endif /* F3DEX_GBI_2 */
-
2834
-
2835#ifdef F3DEX_GBI_2
-
2836#define gSPSetOtherMode(pkt, cmd, sft, len, data) \
-
2837 { \
-
2838 Gfx* _g = (Gfx*) (pkt); \
-
2839 _g->words.w0 = (_SHIFTL(cmd, 24, 8) | _SHIFTL(32 - (sft) - (len), 8, 8) | _SHIFTL((len) - 1, 0, 8)); \
-
2840 _g->words.w1 = (unsigned int) (data); \
-
2841 }
-
2842
-
2843#define gsSPSetOtherMode(cmd, sft, len, data) \
-
2844 { \
-
2845 { _SHIFTL(cmd, 24, 8) | _SHIFTL(32 - (sft) - (len), 8, 8) | _SHIFTL((len) - 1, 0, 8), (unsigned int) (data) } \
-
2846 }
-
2847#else
-
2848#define gSPSetOtherMode(pkt, cmd, sft, len, data) \
-
2849 { \
-
2850 Gfx* _g = (Gfx*) (pkt); \
-
2851 \
-
2852 _g->words.w0 = (_SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(len, 0, 8)); \
-
2853 _g->words.w1 = (unsigned int) (data); \
-
2854 }
-
2855
-
2856#define gsSPSetOtherMode(cmd, sft, len, data) \
-
2857 { \
-
2858 { _SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(len, 0, 8), (unsigned int) (data) } \
-
2859 }
-
2860#endif
-
2861
-
2862/*
-
2863 * RDP setothermode register commands - register shadowed in RSP
-
2864 */
-
2865#define gDPPipelineMode(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode)
-
2866#define gsDPPipelineMode(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode)
-
2867
-
2868#define gDPSetCycleType(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type)
-
2869#define gsDPSetCycleType(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type)
+
2779 * gSPClearGeometryMode(pkt,c)
+
2780 * gSPSetGeometryMode(pkt,s)
+
2781 *
+
2782 * gSPLoadGeometryMode(pkt, word) sets GeometryMode directly.
+
2783 */
+
2784#define gSPGeometryMode(pkt, c, s) \
+
2785 { \
+
2786 Gfx* _g = (Gfx*) (pkt); \
+
2787 _g->words.w0 = _SHIFTL(G_GEOMETRYMODE, 24, 8) | _SHIFTL(~(u32) (c), 0, 24); \
+
2788 _g->words.w1 = (u32) (s); \
+
2789 }
+
2790
+
2791#define gsSPGeometryMode(c, s) \
+
2792 { \
+
2793 { (_SHIFTL(G_GEOMETRYMODE, 24, 8) | _SHIFTL(~(u32) (c), 0, 24)), (u32) (s) } \
+
2794 }
+
2795#define gSPSetGeometryMode(pkt, word) gSPGeometryMode((pkt), 0, (word))
+
2796#define gsSPSetGeometryMode(word) gsSPGeometryMode(0, (word))
+
2797#define gSPClearGeometryMode(pkt, word) gSPGeometryMode((pkt), (word), 0)
+
2798#define gsSPClearGeometryMode(word) gsSPGeometryMode((word), 0)
+
2799#define gSPLoadGeometryMode(pkt, word) gSPGeometryMode((pkt), -1, (word))
+
2800#define gsSPLoadGeometryMode(word) gsSPGeometryMode(-1, (word))
+
2801#define gsSPGeometryModeSetFirst(c, s) gsSPGeometryMode(c, s)
+
2802#else /* F3DEX_GBI_2 */
+
2803#define gSPSetGeometryMode(pkt, word) \
+
2804 { \
+
2805 Gfx* _g = (Gfx*) (pkt); \
+
2806 \
+
2807 _g->words.w0 = _SHIFTL(G_SETGEOMETRYMODE, 24, 8); \
+
2808 _g->words.w1 = (unsigned int) (word); \
+
2809 }
+
2810
+
2811#define gsSPSetGeometryMode(word) \
+
2812 { \
+
2813 { _SHIFTL(G_SETGEOMETRYMODE, 24, 8), (unsigned int) (word) } \
+
2814 }
+
2815
+
2816#define gSPClearGeometryMode(pkt, word) \
+
2817 { \
+
2818 Gfx* _g = (Gfx*) (pkt); \
+
2819 \
+
2820 _g->words.w0 = _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8); \
+
2821 _g->words.w1 = (unsigned int) (word); \
+
2822 }
+
2823
+
2824#define gsSPClearGeometryMode(word) \
+
2825 { \
+
2826 { _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8), (unsigned int) (word) } \
+
2827 }
+
2828
+
2829/*
+
2830 * gsSPGeometryMode
+
2831 * In Fast3DEX2 it is better to use this, as the RSP geometry mode
+
2832 * is able to be set and cleared in a single command.
+
2833 */
+
2834#define gsSPGeometryMode(c, s) gsSPClearGeometryMode(c), gsSPSetGeometryMode(s)
+
2835#define gsSPGeometryModeSetFirst(c, s) gsSPSetGeometryMode(s), gsSPClearGeometryMode(c)
+
2836#endif /* F3DEX_GBI_2 */
+
2837
+
2838#ifdef F3DEX_GBI_2
+
2839#define gSPSetOtherMode(pkt, cmd, sft, len, data) \
+
2840 { \
+
2841 Gfx* _g = (Gfx*) (pkt); \
+
2842 _g->words.w0 = (_SHIFTL(cmd, 24, 8) | _SHIFTL(32 - (sft) - (len), 8, 8) | _SHIFTL((len) - 1, 0, 8)); \
+
2843 _g->words.w1 = (unsigned int) (data); \
+
2844 }
+
2845
+
2846#define gsSPSetOtherMode(cmd, sft, len, data) \
+
2847 { \
+
2848 { _SHIFTL(cmd, 24, 8) | _SHIFTL(32 - (sft) - (len), 8, 8) | _SHIFTL((len) - 1, 0, 8), (unsigned int) (data) } \
+
2849 }
+
2850#else
+
2851#define gSPSetOtherMode(pkt, cmd, sft, len, data) \
+
2852 { \
+
2853 Gfx* _g = (Gfx*) (pkt); \
+
2854 \
+
2855 _g->words.w0 = (_SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(len, 0, 8)); \
+
2856 _g->words.w1 = (unsigned int) (data); \
+
2857 }
+
2858
+
2859#define gsSPSetOtherMode(cmd, sft, len, data) \
+
2860 { \
+
2861 { _SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(len, 0, 8), (unsigned int) (data) } \
+
2862 }
+
2863#endif
+
2864
+
2865/*
+
2866 * RDP setothermode register commands - register shadowed in RSP
+
2867 */
+
2868#define gDPPipelineMode(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode)
+
2869#define gsDPPipelineMode(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode)
2870
-
2871#define gDPSetTexturePersp(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type)
-
2872#define gsDPSetTexturePersp(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type)
+
2871#define gDPSetCycleType(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type)
+
2872#define gsDPSetCycleType(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type)
2873
-
2874#define gDPSetTextureDetail(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type)
-
2875#define gsDPSetTextureDetail(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type)
+
2874#define gDPSetTexturePersp(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type)
+
2875#define gsDPSetTexturePersp(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type)
2876
-
2877#define gDPSetTextureLOD(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type)
-
2878#define gsDPSetTextureLOD(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type)
+
2877#define gDPSetTextureDetail(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type)
+
2878#define gsDPSetTextureDetail(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type)
2879
-
2880#define gDPSetTextureLUT(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type)
-
2881#define gsDPSetTextureLUT(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type)
+
2880#define gDPSetTextureLOD(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type)
+
2881#define gsDPSetTextureLOD(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type)
2882
-
2883#define gDPSetTextureFilter(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type)
-
2884#define gsDPSetTextureFilter(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type)
+
2883#define gDPSetTextureLUT(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type)
+
2884#define gsDPSetTextureLUT(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type)
2885
-
2886#define gDPSetTextureConvert(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type)
-
2887#define gsDPSetTextureConvert(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type)
+
2886#define gDPSetTextureFilter(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type)
+
2887#define gsDPSetTextureFilter(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type)
2888
-
2889#define gDPSetCombineKey(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type)
-
2890#define gsDPSetCombineKey(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type)
+
2889#define gDPSetTextureConvert(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type)
+
2890#define gsDPSetTextureConvert(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type)
2891
-
2892#ifndef _HW_VERSION_1
-
2893#define gDPSetColorDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode)
-
2894#define gsDPSetColorDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode)
-
2895#else
-
2896#define gDPSetColorDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode)
-
2897#define gsDPSetColorDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode)
-
2898#endif
-
2899
-
2900#ifndef _HW_VERSION_1
-
2901#define gDPSetAlphaDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode)
-
2902#define gsDPSetAlphaDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode)
-
2903#endif
-
2904
-
2905/* 'blendmask' is not supported anymore.
-
2906 * The bits are reserved for future use.
-
2907 * Fri May 26 13:45:55 PDT 1995
-
2908 */
-
2909#define gDPSetBlendMask(pkt, mask) gDPNoOp(pkt)
-
2910#define gsDPSetBlendMask(mask) gsDPNoOp()
-
2911
-
2912#define gDPSetAlphaCompare(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type)
-
2913#define gsDPSetAlphaCompare(type) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type)
+
2892#define gDPSetCombineKey(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type)
+
2893#define gsDPSetCombineKey(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type)
+
2894
+
2895#ifndef _HW_VERSION_1
+
2896#define gDPSetColorDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode)
+
2897#define gsDPSetColorDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode)
+
2898#else
+
2899#define gDPSetColorDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode)
+
2900#define gsDPSetColorDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode)
+
2901#endif
+
2902
+
2903#ifndef _HW_VERSION_1
+
2904#define gDPSetAlphaDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode)
+
2905#define gsDPSetAlphaDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode)
+
2906#endif
+
2907
+
2908/* 'blendmask' is not supported anymore.
+
2909 * The bits are reserved for future use.
+
2910 * Fri May 26 13:45:55 PDT 1995
+
2911 */
+
2912#define gDPSetBlendMask(pkt, mask) gDPNoOp(pkt)
+
2913#define gsDPSetBlendMask(mask) gsDPNoOp()
2914
-
2915#define gDPSetDepthSource(pkt, src) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src)
-
2916#define gsDPSetDepthSource(src) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src)
+
2915#define gDPSetAlphaCompare(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type)
+
2916#define gsDPSetAlphaCompare(type) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type)
2917
-
2918#define gDPSetRenderMode(pkt, c0, c1) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, (c0) | (c1))
-
2919#define gsDPSetRenderMode(c0, c1) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, (c0) | (c1))
+
2918#define gDPSetDepthSource(pkt, src) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src)
+
2919#define gsDPSetDepthSource(src) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src)
2920
-
2921#define gSetImage(pkt, cmd, fmt, siz, width, i) \
-
2922 { \
-
2923 Gfx* _g = (Gfx*) (pkt); \
-
2924 \
-
2925 _g->words.w0 = _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL((width) - 1, 0, 12); \
-
2926 _g->words.w1 = (uintptr_t) (i); \
-
2927 }
-
2928
-
2929#define gsSetImage(cmd, fmt, siz, width, i) \
-
2930 { \
-
2931 { \
-
2932 _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL((width) - 1, 0, 12), \
-
2933 (uintptr_t) (i) \
-
2934 } \
-
2935 }
-
2936
-
2937#define gDPSetColorImage(pkt, f, s, w, i) gSetImage(pkt, G_SETCIMG, f, s, w, i)
-
2938#define gsDPSetColorImage(f, s, w, i) gsSetImage(G_SETCIMG, f, s, w, i)
+
2921#define gDPSetRenderMode(pkt, c0, c1) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, (c0) | (c1))
+
2922#define gsDPSetRenderMode(c0, c1) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, (c0) | (c1))
+
2923
+
2924#define gSetImage(pkt, cmd, fmt, siz, width, i) \
+
2925 { \
+
2926 Gfx* _g = (Gfx*) (pkt); \
+
2927 \
+
2928 _g->words.w0 = _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL((width) - 1, 0, 12); \
+
2929 _g->words.w1 = (uintptr_t) (i); \
+
2930 }
+
2931
+
2932#define gsSetImage(cmd, fmt, siz, width, i) \
+
2933 { \
+
2934 { \
+
2935 _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL((width) - 1, 0, 12), \
+
2936 (uintptr_t) (i) \
+
2937 } \
+
2938 }
2939
-
2940/* use these for new code */
-
2941#define gDPSetDepthImage(pkt, i) gSetImage(pkt, G_SETZIMG, 0, 0, 1, i)
-
2942#define gsDPSetDepthImage(i) gsSetImage(G_SETZIMG, 0, 0, 1, i)
-
2943/* kept for compatibility */
-
2944#define gDPSetMaskImage(pkt, i) gDPSetDepthImage(pkt, i)
-
2945#define gsDPSetMaskImage(i) gsDPSetDepthImage(i)
-
2946
-
2947#define gDPSetTextureImage(pkt, f, s, w, i) gSetImage(pkt, G_SETTIMG, f, s, w, i)
-
2948#define gsDPSetTextureImage(f, s, w, i) gsSetImage(G_SETTIMG, f, s, w, i)
+
2940#define gDPSetColorImage(pkt, f, s, w, i) gSetImage(pkt, G_SETCIMG, f, s, w, i)
+
2941#define gsDPSetColorImage(f, s, w, i) gsSetImage(G_SETCIMG, f, s, w, i)
+
2942
+
2943/* use these for new code */
+
2944#define gDPSetDepthImage(pkt, i) gSetImage(pkt, G_SETZIMG, 0, 0, 1, i)
+
2945#define gsDPSetDepthImage(i) gsSetImage(G_SETZIMG, 0, 0, 1, i)
+
2946/* kept for compatibility */
+
2947#define gDPSetMaskImage(pkt, i) gDPSetDepthImage(pkt, i)
+
2948#define gsDPSetMaskImage(i) gsDPSetDepthImage(i)
2949
-
2950/*
-
2951 * RDP macros
-
2952 */
-
2953
-
2954#define gDPSetCombine(pkt, muxs0, muxs1) \
-
2955 { \
-
2956 Gfx* _g = (Gfx*) (pkt); \
-
2957 \
-
2958 _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24); \
-
2959 _g->words.w1 = (unsigned int) (muxs1); \
-
2960 }
-
2961
-
2962#define gsDPSetCombine(muxs0, muxs1) \
-
2963 { \
-
2964 { _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24), (unsigned int) (muxs1) } \
-
2965 }
-
2966
-
2967#define GCCc0w0(saRGB0, mRGB0, saA0, mA0) \
-
2968 (_SHIFTL((saRGB0), 20, 4) | _SHIFTL((mRGB0), 15, 5) | _SHIFTL((saA0), 12, 3) | _SHIFTL((mA0), 9, 3))
+
2950#define gDPSetTextureImage(pkt, f, s, w, i) gSetImage(pkt, G_SETTIMG, f, s, w, i)
+
2951#define gsDPSetTextureImage(f, s, w, i) gsSetImage(G_SETTIMG, f, s, w, i)
+
2952
+
2953/*
+
2954 * RDP macros
+
2955 */
+
2956
+
2957#define gDPSetCombine(pkt, muxs0, muxs1) \
+
2958 { \
+
2959 Gfx* _g = (Gfx*) (pkt); \
+
2960 \
+
2961 _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24); \
+
2962 _g->words.w1 = (unsigned int) (muxs1); \
+
2963 }
+
2964
+
2965#define gsDPSetCombine(muxs0, muxs1) \
+
2966 { \
+
2967 { _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24), (unsigned int) (muxs1) } \
+
2968 }
2969
-
2970#define GCCc1w0(saRGB1, mRGB1) (_SHIFTL((saRGB1), 5, 4) | _SHIFTL((mRGB1), 0, 5))
-
2971
-
2972#define GCCc0w1(sbRGB0, aRGB0, sbA0, aA0) \
-
2973 (_SHIFTL((sbRGB0), 28, 4) | _SHIFTL((aRGB0), 15, 3) | _SHIFTL((sbA0), 12, 3) | _SHIFTL((aA0), 9, 3))
+
2970#define GCCc0w0(saRGB0, mRGB0, saA0, mA0) \
+
2971 (_SHIFTL((saRGB0), 20, 4) | _SHIFTL((mRGB0), 15, 5) | _SHIFTL((saA0), 12, 3) | _SHIFTL((mA0), 9, 3))
+
2972
+
2973#define GCCc1w0(saRGB1, mRGB1) (_SHIFTL((saRGB1), 5, 4) | _SHIFTL((mRGB1), 0, 5))
2974
-
2975#define GCCc1w1(sbRGB1, saA1, mA1, aRGB1, sbA1, aA1) \
-
2976 (_SHIFTL((sbRGB1), 24, 4) | _SHIFTL((saA1), 21, 3) | _SHIFTL((mA1), 18, 3) | _SHIFTL((aRGB1), 6, 3) | \
-
2977 _SHIFTL((sbA1), 3, 3) | _SHIFTL((aA1), 0, 3))
-
2978
-
2979#define gDPSetCombineLERP(pkt, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
-
2980 { \
-
2981 Gfx* _g = (Gfx*) (pkt); \
-
2982 \
-
2983 _g->words.w0 = \
-
2984 _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \
-
2985 GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \
-
2986 0, 24); \
-
2987 _g->words.w1 = (unsigned int) (GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \
-
2988 GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, G_ACMUX_##Ac1, G_CCMUX_##d1, \
-
2989 G_ACMUX_##Ab1, G_ACMUX_##Ad1)); \
-
2990 }
-
2991
-
2992#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
-
2993 { \
-
2994 { \
-
2995 _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \
-
2996 GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \
-
2997 0, 24), \
-
2998 (unsigned int) (GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \
-
2999 GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, G_ACMUX_##Ac1, G_CCMUX_##d1, G_ACMUX_##Ab1, \
-
3000 G_ACMUX_##Ad1)) \
-
3001 } \
-
3002 }
-
3003
-
3004/*
-
3005 * SetCombineMode macros are NOT redunant. It allow the C preprocessor
-
3006 * to substitute single parameter which includes commas in the token and
-
3007 * rescan for higher parameter count macro substitution.
-
3008 *
-
3009 * eg. gsDPSetCombineMode(G_CC_MODULATE, G_CC_MODULATE) turns into
-
3010 * gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0,
-
3011 * TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0)
-
3012 */
-
3013
-
3014#define gDPSetCombineMode(pkt, a, b) gDPSetCombineLERP(pkt, a, b)
-
3015#define gsDPSetCombineMode(a, b) gsDPSetCombineLERP(a, b)
+
2975#define GCCc0w1(sbRGB0, aRGB0, sbA0, aA0) \
+
2976 (_SHIFTL((sbRGB0), 28, 4) | _SHIFTL((aRGB0), 15, 3) | _SHIFTL((sbA0), 12, 3) | _SHIFTL((aA0), 9, 3))
+
2977
+
2978#define GCCc1w1(sbRGB1, saA1, mA1, aRGB1, sbA1, aA1) \
+
2979 (_SHIFTL((sbRGB1), 24, 4) | _SHIFTL((saA1), 21, 3) | _SHIFTL((mA1), 18, 3) | _SHIFTL((aRGB1), 6, 3) | \
+
2980 _SHIFTL((sbA1), 3, 3) | _SHIFTL((aA1), 0, 3))
+
2981
+
2982#define gDPSetCombineLERP(pkt, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
+
2983 { \
+
2984 Gfx* _g = (Gfx*) (pkt); \
+
2985 \
+
2986 _g->words.w0 = \
+
2987 _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \
+
2988 GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \
+
2989 0, 24); \
+
2990 _g->words.w1 = (unsigned int) (GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \
+
2991 GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, G_ACMUX_##Ac1, G_CCMUX_##d1, \
+
2992 G_ACMUX_##Ab1, G_ACMUX_##Ad1)); \
+
2993 }
+
2994
+
2995#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
+
2996 { \
+
2997 { \
+
2998 _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \
+
2999 GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \
+
3000 0, 24), \
+
3001 (unsigned int) (GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \
+
3002 GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, G_ACMUX_##Ac1, G_CCMUX_##d1, G_ACMUX_##Ab1, \
+
3003 G_ACMUX_##Ad1)) \
+
3004 } \
+
3005 }
+
3006
+
3007/*
+
3008 * SetCombineMode macros are NOT redunant. It allow the C preprocessor
+
3009 * to substitute single parameter which includes commas in the token and
+
3010 * rescan for higher parameter count macro substitution.
+
3011 *
+
3012 * eg. gsDPSetCombineMode(G_CC_MODULATE, G_CC_MODULATE) turns into
+
3013 * gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0,
+
3014 * TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0)
+
3015 */
3016
-
3017#define gDPSetColor(pkt, c, d) \
-
3018 { \
-
3019 Gfx* _g = (Gfx*) (pkt); \
-
3020 \
-
3021 _g->words.w0 = _SHIFTL(c, 24, 8); \
-
3022 _g->words.w1 = (unsigned int) (d); \
-
3023 }
-
3024
-
3025#define gsDPSetColor(c, d) \
-
3026 { \
-
3027 { _SHIFTL(c, 24, 8), (unsigned int) (d) } \
-
3028 }
-
3029
-
3030#define DPRGBColor(pkt, cmd, r, g, b, a) \
-
3031 gDPSetColor(pkt, cmd, (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)))
-
3032#define sDPRGBColor(cmd, r, g, b, a) \
-
3033 gsDPSetColor(cmd, (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)))
-
3034
-
3035#define gDPSetEnvColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETENVCOLOR, r, g, b, a)
-
3036#define gsDPSetEnvColor(r, g, b, a) sDPRGBColor(G_SETENVCOLOR, r, g, b, a)
-
3037#define gDPSetBlendColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETBLENDCOLOR, r, g, b, a)
-
3038#define gsDPSetBlendColor(r, g, b, a) sDPRGBColor(G_SETBLENDCOLOR, r, g, b, a)
-
3039#define gDPSetFogColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETFOGCOLOR, r, g, b, a)
-
3040#define gsDPSetFogColor(r, g, b, a) sDPRGBColor(G_SETFOGCOLOR, r, g, b, a)
-
3041#define gDPSetFillColor(pkt, d) gDPSetColor(pkt, G_SETFILLCOLOR, (d))
-
3042#define gsDPSetFillColor(d) gsDPSetColor(G_SETFILLCOLOR, (d))
-
3043
-
3044#define gDPSetPrimDepth(pkt, z, dz) gDPSetColor(pkt, G_SETPRIMDEPTH, _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16))
-
3045#define gsDPSetPrimDepth(z, dz) gsDPSetColor(G_SETPRIMDEPTH, _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16))
+
3017#define gDPSetCombineMode(pkt, a, b) gDPSetCombineLERP(pkt, a, b)
+
3018#define gsDPSetCombineMode(a, b) gsDPSetCombineLERP(a, b)
+
3019
+
3020#define gDPSetColor(pkt, c, d) \
+
3021 { \
+
3022 Gfx* _g = (Gfx*) (pkt); \
+
3023 \
+
3024 _g->words.w0 = _SHIFTL(c, 24, 8); \
+
3025 _g->words.w1 = (unsigned int) (d); \
+
3026 }
+
3027
+
3028#define gsDPSetColor(c, d) \
+
3029 { \
+
3030 { _SHIFTL(c, 24, 8), (unsigned int) (d) } \
+
3031 }
+
3032
+
3033#define DPRGBColor(pkt, cmd, r, g, b, a) \
+
3034 gDPSetColor(pkt, cmd, (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)))
+
3035#define sDPRGBColor(cmd, r, g, b, a) \
+
3036 gsDPSetColor(cmd, (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)))
+
3037
+
3038#define gDPSetEnvColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETENVCOLOR, r, g, b, a)
+
3039#define gsDPSetEnvColor(r, g, b, a) sDPRGBColor(G_SETENVCOLOR, r, g, b, a)
+
3040#define gDPSetBlendColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETBLENDCOLOR, r, g, b, a)
+
3041#define gsDPSetBlendColor(r, g, b, a) sDPRGBColor(G_SETBLENDCOLOR, r, g, b, a)
+
3042#define gDPSetFogColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETFOGCOLOR, r, g, b, a)
+
3043#define gsDPSetFogColor(r, g, b, a) sDPRGBColor(G_SETFOGCOLOR, r, g, b, a)
+
3044#define gDPSetFillColor(pkt, d) gDPSetColor(pkt, G_SETFILLCOLOR, (d))
+
3045#define gsDPSetFillColor(d) gsDPSetColor(G_SETFILLCOLOR, (d))
3046
-
3047#define gDPSetPrimColor(pkt, m, l, r, g, b, a) \
-
3048 { \
-
3049 Gfx* _g = (Gfx*) (pkt); \
-
3050 \
-
3051 _g->words.w0 = (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)); \
-
3052 _g->words.w1 = (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)); \
-
3053 }
-
3054
-
3055#define gsDPSetPrimColor(m, l, r, g, b, a) \
-
3056 { \
-
3057 { \
-
3058 (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)), \
-
3059 (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)) \
-
3060 } \
-
3061 }
-
3062
-
3063/*
-
3064 * gDPSetOtherMode (This is for expert user.)
-
3065 *
-
3066 * This command makes all othermode parameters set.
-
3067 * Do not use this command in the same DL with another g*SPSetOtherMode DLs.
+
3047#define gDPSetPrimDepth(pkt, z, dz) gDPSetColor(pkt, G_SETPRIMDEPTH, _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16))
+
3048#define gsDPSetPrimDepth(z, dz) gsDPSetColor(G_SETPRIMDEPTH, _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16))
+
3049
+
3050#define gDPSetPrimColor(pkt, m, l, r, g, b, a) \
+
3051 { \
+
3052 Gfx* _g = (Gfx*) (pkt); \
+
3053 \
+
3054 _g->words.w0 = (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)); \
+
3055 _g->words.w1 = (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)); \
+
3056 }
+
3057
+
3058#define gsDPSetPrimColor(m, l, r, g, b, a) \
+
3059 { \
+
3060 { \
+
3061 (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)), \
+
3062 (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)) \
+
3063 } \
+
3064 }
+
3065
+
3066/*
+
3067 * gDPSetOtherMode (This is for expert user.)
3068 *
-
3069 * [Usage]
-
3070 * gDPSetOtherMode(pkt, modeA, modeB)
+
3069 * This command makes all othermode parameters set.
+
3070 * Do not use this command in the same DL with another g*SPSetOtherMode DLs.
3071 *
-
3072 * 'modeA' is described all parameters of GroupA GBI command.
-
3073 * 'modeB' is also described all parameters of GroupB GBI command.
+
3072 * [Usage]
+
3073 * gDPSetOtherMode(pkt, modeA, modeB)
3074 *
-
3075 * GroupA:
-
3076 * gDPPipelineMode, gDPSetCycleType, gSPSetTexturePersp,
-
3077 * gDPSetTextureDetail, gDPSetTextureLOD, gDPSetTextureLUT,
-
3078 * gDPSetTextureFilter, gDPSetTextureConvert, gDPSetCombineKey,
-
3079 * gDPSetColorDither, gDPSetAlphaDither
-
3080 *
-
3081 * GroupB:
-
3082 * gDPSetAlphaCompare, gDPSetDepthSource, gDPSetRenderMode
+
3075 * 'modeA' is described all parameters of GroupA GBI command.
+
3076 * 'modeB' is also described all parameters of GroupB GBI command.
+
3077 *
+
3078 * GroupA:
+
3079 * gDPPipelineMode, gDPSetCycleType, gSPSetTexturePersp,
+
3080 * gDPSetTextureDetail, gDPSetTextureLOD, gDPSetTextureLUT,
+
3081 * gDPSetTextureFilter, gDPSetTextureConvert, gDPSetCombineKey,
+
3082 * gDPSetColorDither, gDPSetAlphaDither
3083 *
-
3084 * Use 'OR' operation to get modeA and modeB.
-
3085 *
-
3086 * modeA = G_PM_* | G_CYC_* | G_TP_* | G_TD_* | G_TL_* | G_TT_* | G_TF_*
-
3087 * G_TC_* | G_CK_* | G_CD_* | G_AD_*;
+
3084 * GroupB:
+
3085 * gDPSetAlphaCompare, gDPSetDepthSource, gDPSetRenderMode
+
3086 *
+
3087 * Use 'OR' operation to get modeA and modeB.
3088 *
-
3089 * modeB = G_AC_* | G_ZS_* | G_RM_* | G_RM_*2;
-
3090 */
-
3091#define gDPSetOtherMode(pkt, mode0, mode1) \
-
3092 { \
-
3093 Gfx* _g = (Gfx*) (pkt); \
-
3094 \
-
3095 _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE, 24, 8) | _SHIFTL(mode0, 0, 24); \
-
3096 _g->words.w1 = (unsigned int) (mode1); \
-
3097 }
-
3098
-
3099#define gsDPSetOtherMode(mode0, mode1) \
-
3100 { \
-
3101 { _SHIFTL(G_RDPSETOTHERMODE, 24, 8) | _SHIFTL(mode0, 0, 24), (unsigned int) (mode1) } \
-
3102 }
-
3103
-
3104/*
-
3105 * Texturing macros
-
3106 */
-
3107
-
3108/* These are also defined defined above for Sprite Microcode */
-
3109
-
3110#define G_TX_LOADTILE 7
-
3111#define G_TX_RENDERTILE 0
+
3089 * modeA = G_PM_* | G_CYC_* | G_TP_* | G_TD_* | G_TL_* | G_TT_* | G_TF_*
+
3090 * G_TC_* | G_CK_* | G_CD_* | G_AD_*;
+
3091 *
+
3092 * modeB = G_AC_* | G_ZS_* | G_RM_* | G_RM_*2;
+
3093 */
+
3094#define gDPSetOtherMode(pkt, mode0, mode1) \
+
3095 { \
+
3096 Gfx* _g = (Gfx*) (pkt); \
+
3097 \
+
3098 _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE, 24, 8) | _SHIFTL(mode0, 0, 24); \
+
3099 _g->words.w1 = (unsigned int) (mode1); \
+
3100 }
+
3101
+
3102#define gsDPSetOtherMode(mode0, mode1) \
+
3103 { \
+
3104 { _SHIFTL(G_RDPSETOTHERMODE, 24, 8) | _SHIFTL(mode0, 0, 24), (unsigned int) (mode1) } \
+
3105 }
+
3106
+
3107/*
+
3108 * Texturing macros
+
3109 */
+
3110
+
3111/* These are also defined defined above for Sprite Microcode */
3112
-
3113#define G_TX_NOMIRROR 0
-
3114#define G_TX_WRAP 0
-
3115#define G_TX_MIRROR 0x1
-
3116#define G_TX_CLAMP 0x2
-
3117#define G_TX_NOMASK 0
-
3118#define G_TX_NOLOD 0
-
3119
-
3120#ifndef MAX
-
3121#define MAX(a, b) ((a) > (b) ? (a) : (b))
-
3122#endif
-
3123
-
3124#ifndef MIN
-
3125#define MIN(a, b) ((a) < (b) ? (a) : (b))
-
3126#endif
-
3127/*
-
3128 * Dxt is the inverse of the number of 64-bit words in a line of
-
3129 * the texture being loaded using the load_block command. If
-
3130 * there are any 1's to the right of the 11th fractional bit,
-
3131 * dxt should be rounded up. The following macros accomplish
-
3132 * this. The 4b macros are a special case since 4-bit textures
-
3133 * are loaded as 8-bit textures. Dxt is fixed point 1.11. RJM
-
3134 */
-
3135#define G_TX_DXT_FRAC 11
-
3136
-
3137/*
-
3138 * For RCP 2.0, the maximum number of texels that can be loaded
-
3139 * using a load_block command is 2048. In order to load the total
-
3140 * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b,
-
3141 * then change the tile to the proper texel size after the load.
-
3142 * The g*DPLoadTextureBlock macros already do this, so this change
-
3143 * will be transparent if you use these macros. If you use
-
3144 * the g*DPLoadBlock macros directly, you will need to handle this
-
3145 * tile manipulation yourself. RJM.
-
3146 */
-
3147#ifdef _HW_VERSION_1
-
3148#define G_TX_LDBLK_MAX_TXL 4095
-
3149#else
-
3150#define G_TX_LDBLK_MAX_TXL 2047
-
3151#endif /* _HW_VERSION_1 */
-
3152
-
3153#define TXL2WORDS(txls, b_txl) MAX(1, ((txls) * (b_txl) / 8))
-
3154#define CALC_DXT(width, b_txl) (((1 << G_TX_DXT_FRAC) + TXL2WORDS(width, b_txl) - 1) / TXL2WORDS(width, b_txl))
+
3113#define G_TX_LOADTILE 7
+
3114#define G_TX_RENDERTILE 0
+
3115
+
3116#define G_TX_NOMIRROR 0
+
3117#define G_TX_WRAP 0
+
3118#define G_TX_MIRROR 0x1
+
3119#define G_TX_CLAMP 0x2
+
3120#define G_TX_NOMASK 0
+
3121#define G_TX_NOLOD 0
+
3122
+
3123#ifndef MAX
+
3124#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
3125#endif
+
3126
+
3127#ifndef MIN
+
3128#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
3129#endif
+
3130/*
+
3131 * Dxt is the inverse of the number of 64-bit words in a line of
+
3132 * the texture being loaded using the load_block command. If
+
3133 * there are any 1's to the right of the 11th fractional bit,
+
3134 * dxt should be rounded up. The following macros accomplish
+
3135 * this. The 4b macros are a special case since 4-bit textures
+
3136 * are loaded as 8-bit textures. Dxt is fixed point 1.11. RJM
+
3137 */
+
3138#define G_TX_DXT_FRAC 11
+
3139
+
3140/*
+
3141 * For RCP 2.0, the maximum number of texels that can be loaded
+
3142 * using a load_block command is 2048. In order to load the total
+
3143 * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b,
+
3144 * then change the tile to the proper texel size after the load.
+
3145 * The g*DPLoadTextureBlock macros already do this, so this change
+
3146 * will be transparent if you use these macros. If you use
+
3147 * the g*DPLoadBlock macros directly, you will need to handle this
+
3148 * tile manipulation yourself. RJM.
+
3149 */
+
3150#ifdef _HW_VERSION_1
+
3151#define G_TX_LDBLK_MAX_TXL 4095
+
3152#else
+
3153#define G_TX_LDBLK_MAX_TXL 2047
+
3154#endif /* _HW_VERSION_1 */
3155
-
3156#define TXL2WORDS_4b(txls) MAX(1, ((txls) / 16))
-
3157#define CALC_DXT_4b(width) (((1 << G_TX_DXT_FRAC) + TXL2WORDS_4b(width) - 1) / TXL2WORDS_4b(width))
+
3156#define TXL2WORDS(txls, b_txl) MAX(1, ((txls) * (b_txl) / 8))
+
3157#define CALC_DXT(width, b_txl) (((1 << G_TX_DXT_FRAC) + TXL2WORDS(width, b_txl) - 1) / TXL2WORDS(width, b_txl))
3158
-
3159#define gDPLoadTileGeneric(pkt, c, tile, uls, ult, lrs, lrt) \
-
3160 { \
-
3161 Gfx* _g = (Gfx*) (pkt); \
-
3162 \
-
3163 _g->words.w0 = _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12); \
-
3164 _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12); \
-
3165 }
-
3166
-
3167#define gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt) \
-
3168 { \
-
3169 { \
-
3170 _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12), \
-
3171 _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12) \
-
3172 } \
-
3173 }
-
3174
-
3175#define gDPSetTileSize(pkt, t, uls, ult, lrs, lrt) gDPLoadTileGeneric(pkt, G_SETTILESIZE, t, uls, ult, lrs, lrt)
-
3176#define gsDPSetTileSize(t, uls, ult, lrs, lrt) gsDPLoadTileGeneric(G_SETTILESIZE, t, uls, ult, lrs, lrt)
-
3177#define gDPLoadTile(pkt, t, uls, ult, lrs, lrt) gDPLoadTileGeneric(pkt, G_LOADTILE, t, uls, ult, lrs, lrt)
-
3178#define gsDPLoadTile(t, uls, ult, lrs, lrt) gsDPLoadTileGeneric(G_LOADTILE, t, uls, ult, lrs, lrt)
-
3179
-
3180#define gDPSetTile(pkt, fmt, siz, line, tmem, tile, palette, cmt, maskt, shiftt, cms, masks, shifts) \
-
3181 { \
-
3182 Gfx* _g = (Gfx*) (pkt); \
-
3183 \
-
3184 _g->words.w0 = _SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) | \
-
3185 _SHIFTL(tmem, 0, 9); \
-
3186 _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \
-
3187 _SHIFTL(shiftt, 10, 4) | _SHIFTL(cms, 8, 2) | _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4); \
-
3188 }
-
3189
-
3190#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, cmt, maskt, shiftt, cms, masks, shifts) \
-
3191 { \
-
3192 { \
-
3193 (_SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) | \
-
3194 _SHIFTL(tmem, 0, 9)), \
-
3195 (_SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \
-
3196 _SHIFTL(shiftt, 10, 4) | _SHIFTL(cms, 8, 2) | _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4)) \
-
3197 } \
-
3198 }
-
3199
-
3200/*
-
3201 * For RCP 2.0, the maximum number of texels that can be loaded
-
3202 * using a load_block command is 2048. In order to load the total
-
3203 * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b,
-
3204 * then change the tile to the proper texel size after the load.
-
3205 * The g*DPLoadTextureBlock macros already do this, so this change
-
3206 * will be transparent if you use these macros. If you use
-
3207 * the g*DPLoadBlock macros directly, you will need to handle this
-
3208 * tile manipulation yourself. RJM.
-
3209 */
-
3210#define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \
-
3211 { \
-
3212 Gfx* _g = (Gfx*) (pkt); \
-
3213 \
-
3214 _g->words.w0 = (_SHIFTL(G_LOADBLOCK, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12)); \
-
3215 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL((MIN(lrs, G_TX_LDBLK_MAX_TXL)), 12, 12) | _SHIFTL(dxt, 0, 12)); \
-
3216 }
-
3217
-
3218#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \
-
3219 { \
-
3220 { \
-
3221 (_SHIFTL(G_LOADBLOCK, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12)), \
-
3222 (_SHIFTL(tile, 24, 3) | _SHIFTL((MIN(lrs, G_TX_LDBLK_MAX_TXL)), 12, 12) | _SHIFTL(dxt, 0, 12)) \
-
3223 } \
-
3224 }
-
3225
-
3226#define gDPLoadTLUTCmd(pkt, tile, count) \
-
3227 { \
-
3228 Gfx* _g = (Gfx*) pkt; \
-
3229 \
-
3230 _g->words.w0 = _SHIFTL(G_LOADTLUT, 24, 8); \
-
3231 _g->words.w1 = _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10); \
-
3232 }
-
3233
-
3234#define gsDPLoadTLUTCmd(tile, count) \
-
3235 { \
-
3236 { _SHIFTL(G_LOADTLUT, 24, 8), _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10) } \
-
3237 }
-
3238
-
3239#define gDPLoadTextureBlock(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3240 { \
-
3241 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
-
3242 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3243 gDPLoadSync(pkt); \
-
3244 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3245 CALC_DXT(width, siz##_BYTES)); \
-
3246 gDPPipeSync(pkt); \
-
3247 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, \
-
3248 shiftt, cms, masks, shifts); \
-
3249 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3250 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3251 }
-
3252
-
3253#define gDPLoadTextureBlockYuv(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3254 { \
-
3255 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
-
3256 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3257 gDPLoadSync(pkt); \
-
3258 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3259 CALC_DXT(width, siz##_BYTES)); \
-
3260 gDPPipeSync(pkt); \
-
3261 gDPSetTile(pkt, fmt, siz, (((width) * 1) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \
-
3262 shifts); \
-
3263 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3264 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3265 }
-
3266
-
3267/* Load fix rww 27jun95 */
-
3268/* The S at the end means odd lines are already word Swapped */
+
3159#define TXL2WORDS_4b(txls) MAX(1, ((txls) / 16))
+
3160#define CALC_DXT_4b(width) (((1 << G_TX_DXT_FRAC) + TXL2WORDS_4b(width) - 1) / TXL2WORDS_4b(width))
+
3161
+
3162#define gDPLoadTileGeneric(pkt, c, tile, uls, ult, lrs, lrt) \
+
3163 { \
+
3164 Gfx* _g = (Gfx*) (pkt); \
+
3165 \
+
3166 _g->words.w0 = _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12); \
+
3167 _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12); \
+
3168 }
+
3169
+
3170#define gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt) \
+
3171 { \
+
3172 { \
+
3173 _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12), \
+
3174 _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12) \
+
3175 } \
+
3176 }
+
3177
+
3178#define gDPSetTileSize(pkt, t, uls, ult, lrs, lrt) gDPLoadTileGeneric(pkt, G_SETTILESIZE, t, uls, ult, lrs, lrt)
+
3179#define gsDPSetTileSize(t, uls, ult, lrs, lrt) gsDPLoadTileGeneric(G_SETTILESIZE, t, uls, ult, lrs, lrt)
+
3180#define gDPLoadTile(pkt, t, uls, ult, lrs, lrt) gDPLoadTileGeneric(pkt, G_LOADTILE, t, uls, ult, lrs, lrt)
+
3181#define gsDPLoadTile(t, uls, ult, lrs, lrt) gsDPLoadTileGeneric(G_LOADTILE, t, uls, ult, lrs, lrt)
+
3182
+
3183#define gDPSetTile(pkt, fmt, siz, line, tmem, tile, palette, cmt, maskt, shiftt, cms, masks, shifts) \
+
3184 { \
+
3185 Gfx* _g = (Gfx*) (pkt); \
+
3186 \
+
3187 _g->words.w0 = _SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) | \
+
3188 _SHIFTL(tmem, 0, 9); \
+
3189 _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \
+
3190 _SHIFTL(shiftt, 10, 4) | _SHIFTL(cms, 8, 2) | _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4); \
+
3191 }
+
3192
+
3193#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, cmt, maskt, shiftt, cms, masks, shifts) \
+
3194 { \
+
3195 { \
+
3196 (_SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) | \
+
3197 _SHIFTL(tmem, 0, 9)), \
+
3198 (_SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \
+
3199 _SHIFTL(shiftt, 10, 4) | _SHIFTL(cms, 8, 2) | _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4)) \
+
3200 } \
+
3201 }
+
3202
+
3203/*
+
3204 * For RCP 2.0, the maximum number of texels that can be loaded
+
3205 * using a load_block command is 2048. In order to load the total
+
3206 * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b,
+
3207 * then change the tile to the proper texel size after the load.
+
3208 * The g*DPLoadTextureBlock macros already do this, so this change
+
3209 * will be transparent if you use these macros. If you use
+
3210 * the g*DPLoadBlock macros directly, you will need to handle this
+
3211 * tile manipulation yourself. RJM.
+
3212 */
+
3213#define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \
+
3214 { \
+
3215 Gfx* _g = (Gfx*) (pkt); \
+
3216 \
+
3217 _g->words.w0 = (_SHIFTL(G_LOADBLOCK, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12)); \
+
3218 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL((MIN(lrs, G_TX_LDBLK_MAX_TXL)), 12, 12) | _SHIFTL(dxt, 0, 12)); \
+
3219 }
+
3220
+
3221#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \
+
3222 { \
+
3223 { \
+
3224 (_SHIFTL(G_LOADBLOCK, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12)), \
+
3225 (_SHIFTL(tile, 24, 3) | _SHIFTL((MIN(lrs, G_TX_LDBLK_MAX_TXL)), 12, 12) | _SHIFTL(dxt, 0, 12)) \
+
3226 } \
+
3227 }
+
3228
+
3229#define gDPLoadTLUTCmd(pkt, tile, count) \
+
3230 { \
+
3231 Gfx* _g = (Gfx*) pkt; \
+
3232 \
+
3233 _g->words.w0 = _SHIFTL(G_LOADTLUT, 24, 8); \
+
3234 _g->words.w1 = _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10); \
+
3235 }
+
3236
+
3237#define gsDPLoadTLUTCmd(tile, count) \
+
3238 { \
+
3239 { _SHIFTL(G_LOADTLUT, 24, 8), _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10) } \
+
3240 }
+
3241
+
3242#define gDPLoadTextureBlock(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3243 { \
+
3244 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
+
3245 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3246 gDPLoadSync(pkt); \
+
3247 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3248 CALC_DXT(width, siz##_BYTES)); \
+
3249 gDPPipeSync(pkt); \
+
3250 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, \
+
3251 shiftt, cms, masks, shifts); \
+
3252 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3253 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3254 }
+
3255
+
3256#define gDPLoadTextureBlockYuv(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3257 { \
+
3258 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
+
3259 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3260 gDPLoadSync(pkt); \
+
3261 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3262 CALC_DXT(width, siz##_BYTES)); \
+
3263 gDPPipeSync(pkt); \
+
3264 gDPSetTile(pkt, fmt, siz, (((width) * 1) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \
+
3265 shifts); \
+
3266 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3267 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3268 }
3269
-
3270#define gDPLoadTextureBlockS(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3271 { \
-
3272 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
-
3273 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3274 gDPLoadSync(pkt); \
-
3275 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \
-
3276 gDPPipeSync(pkt); \
-
3277 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, \
-
3278 shiftt, cms, masks, shifts); \
-
3279 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3280 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3281 }
-
3282
-
3283/*
-
3284 * Allow tmem address and render tile to be specified.
-
3285 * The S at the end means odd lines are already word Swapped
-
3286 */
-
3287#define gDPLoadMultiBlockS(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \
-
3288 shiftt) \
-
3289 { \
-
3290 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
-
3291 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3292 gDPLoadSync(pkt); \
-
3293 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \
-
3294 gDPPipeSync(pkt); \
-
3295 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \
-
3296 masks, shifts); \
-
3297 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3298 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3299 }
-
3300
-
3301#define gDPLoadTextureBlockYuvS(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3302 { \
-
3303 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
-
3304 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3305 gDPLoadSync(pkt); \
-
3306 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \
-
3307 gDPPipeSync(pkt); \
-
3308 gDPSetTile(pkt, fmt, siz, (((width) * 1) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \
-
3309 shifts); \
-
3310 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3311 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3312 }
-
3313
-
3314/*
-
3315 * allows tmem address to be specified
-
3316 */
-
3317#define _gDPLoadTextureBlock(pkt, timg, tmem, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3318 { \
-
3319 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
-
3320 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3321 gDPLoadSync(pkt); \
-
3322 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3323 CALC_DXT(width, siz##_BYTES)); \
-
3324 gDPPipeSync(pkt); \
-
3325 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, G_TX_RENDERTILE, pal, cmt, maskt, \
-
3326 shiftt, cms, masks, shifts); \
-
3327 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3328 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3329 }
-
3330
-
3331/*
-
3332 * allows tmem address and render tile to be specified
-
3333 */
-
3334#define _gDPLoadTextureBlockTile(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \
-
3335 shiftt) \
-
3336 { \
-
3337 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
-
3338 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3339 gDPLoadSync(pkt); \
-
3340 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3341 CALC_DXT(width, siz##_BYTES)); \
-
3342 gDPPipeSync(pkt); \
-
3343 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \
-
3344 masks, shifts); \
-
3345 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3346 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3347 }
-
3348
-
3349/*
-
3350 * allows tmem address and render tile to be specified
-
3351 */
-
3352#define gDPLoadMultiBlock(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \
-
3353 shiftt) \
-
3354 { \
-
3355 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
-
3356 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3357 gDPLoadSync(pkt); \
-
3358 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3359 CALC_DXT(width, siz##_BYTES)); \
-
3360 gDPPipeSync(pkt); \
-
3361 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \
-
3362 masks, shifts); \
-
3363 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3364 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3365 }
-
3366
-
3367#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3368 \
-
3369 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
-
3370 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3371 gsDPLoadSync(), \
-
3372 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3373 CALC_DXT(width, siz##_BYTES)), \
-
3374 gsDPPipeSync(), \
-
3375 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
-
3376 cms, masks, shifts), \
-
3377 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3378 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3379
-
3380/* Here is the static form of the pre-swapped texture block loading */
-
3381/* See gDPLoadTextureBlockS() for reference. Basically, just don't
-
3382 calculate DxT, use 0 */
-
3383
-
3384#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3385 \
-
3386 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
-
3387 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3388 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0), \
-
3389 gsDPPipeSync(), \
-
3390 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
-
3391 cms, masks, shifts), \
-
3392 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3393 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3394
-
3395/*
-
3396 * Allow tmem address to be specified
-
3397 */
-
3398#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3399 \
-
3400 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
-
3401 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3402 gsDPLoadSync(), \
-
3403 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3404 CALC_DXT(width, siz##_BYTES)), \
-
3405 gsDPPipeSync(), \
-
3406 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, \
-
3407 shiftt, cms, masks, shifts), \
-
3408 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3409 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3410
-
3411/*
-
3412 * Allow tmem address and render_tile to be specified
-
3413 */
-
3414#define _gsDPLoadTextureBlockTile(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \
-
3415 shiftt) \
-
3416 \
-
3417 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
-
3418 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3419 gsDPLoadSync(), \
-
3420 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3421 CALC_DXT(width, siz##_BYTES)), \
-
3422 gsDPPipeSync(), \
-
3423 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
-
3424 masks, shifts), \
-
3425 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3426
-
3427/*
-
3428 * Allow tmem address and render_tile to be specified, useful when loading
-
3429 * mutilple tiles at a time.
-
3430 */
-
3431#define gsDPLoadMultiBlock(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3432 \
-
3433 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
-
3434 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3435 gsDPLoadSync(), \
-
3436 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
-
3437 CALC_DXT(width, siz##_BYTES)), \
-
3438 gsDPPipeSync(), \
-
3439 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
-
3440 masks, shifts), \
-
3441 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3442
-
3443/*
-
3444 * Allows tmem and render tile to be specified. Useful when loading
-
3445 * several tiles at a time.
-
3446 *
-
3447 * Here is the static form of the pre-swapped texture block loading
-
3448 * See gDPLoadTextureBlockS() for reference. Basically, just don't
-
3449 * calculate DxT, use 0
-
3450 */
-
3451
-
3452#define gsDPLoadMultiBlockS(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3453 \
-
3454 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
-
3455 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3456 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0), \
-
3457 gsDPPipeSync(), \
-
3458 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
-
3459 masks, shifts), \
-
3460 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3461
-
3462#define gDPLoadTextureBlock_4b(pkt, timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3463 { \
-
3464 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
-
3465 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3466 gDPLoadSync(pkt); \
-
3467 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \
-
3468 gDPPipeSync(pkt); \
-
3469 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
-
3470 cms, masks, shifts); \
-
3471 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3472 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3473 }
-
3474
-
3475/* Load fix rww 27jun95 */
-
3476/* The S at the end means odd lines are already word Swapped */
+
3270/* Load fix rww 27jun95 */
+
3271/* The S at the end means odd lines are already word Swapped */
+
3272
+
3273#define gDPLoadTextureBlockS(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3274 { \
+
3275 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
+
3276 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3277 gDPLoadSync(pkt); \
+
3278 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \
+
3279 gDPPipeSync(pkt); \
+
3280 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, \
+
3281 shiftt, cms, masks, shifts); \
+
3282 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3283 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3284 }
+
3285
+
3286/*
+
3287 * Allow tmem address and render tile to be specified.
+
3288 * The S at the end means odd lines are already word Swapped
+
3289 */
+
3290#define gDPLoadMultiBlockS(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \
+
3291 shiftt) \
+
3292 { \
+
3293 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
+
3294 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3295 gDPLoadSync(pkt); \
+
3296 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \
+
3297 gDPPipeSync(pkt); \
+
3298 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \
+
3299 masks, shifts); \
+
3300 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3301 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3302 }
+
3303
+
3304#define gDPLoadTextureBlockYuvS(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3305 { \
+
3306 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
+
3307 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3308 gDPLoadSync(pkt); \
+
3309 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \
+
3310 gDPPipeSync(pkt); \
+
3311 gDPSetTile(pkt, fmt, siz, (((width) * 1) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \
+
3312 shifts); \
+
3313 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3314 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3315 }
+
3316
+
3317/*
+
3318 * allows tmem address to be specified
+
3319 */
+
3320#define _gDPLoadTextureBlock(pkt, timg, tmem, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3321 { \
+
3322 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
+
3323 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3324 gDPLoadSync(pkt); \
+
3325 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3326 CALC_DXT(width, siz##_BYTES)); \
+
3327 gDPPipeSync(pkt); \
+
3328 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, G_TX_RENDERTILE, pal, cmt, maskt, \
+
3329 shiftt, cms, masks, shifts); \
+
3330 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3331 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3332 }
+
3333
+
3334/*
+
3335 * allows tmem address and render tile to be specified
+
3336 */
+
3337#define _gDPLoadTextureBlockTile(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \
+
3338 shiftt) \
+
3339 { \
+
3340 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
+
3341 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3342 gDPLoadSync(pkt); \
+
3343 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3344 CALC_DXT(width, siz##_BYTES)); \
+
3345 gDPPipeSync(pkt); \
+
3346 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \
+
3347 masks, shifts); \
+
3348 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3349 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3350 }
+
3351
+
3352/*
+
3353 * allows tmem address and render tile to be specified
+
3354 */
+
3355#define gDPLoadMultiBlock(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \
+
3356 shiftt) \
+
3357 { \
+
3358 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
+
3359 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3360 gDPLoadSync(pkt); \
+
3361 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3362 CALC_DXT(width, siz##_BYTES)); \
+
3363 gDPPipeSync(pkt); \
+
3364 gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \
+
3365 masks, shifts); \
+
3366 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3367 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3368 }
+
3369
+
3370#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3371 \
+
3372 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
+
3373 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3374 gsDPLoadSync(), \
+
3375 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3376 CALC_DXT(width, siz##_BYTES)), \
+
3377 gsDPPipeSync(), \
+
3378 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
+
3379 cms, masks, shifts), \
+
3380 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3381 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3382
+
3383/* Here is the static form of the pre-swapped texture block loading */
+
3384/* See gDPLoadTextureBlockS() for reference. Basically, just don't
+
3385 calculate DxT, use 0 */
+
3386
+
3387#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3388 \
+
3389 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
+
3390 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3391 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0), \
+
3392 gsDPPipeSync(), \
+
3393 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
+
3394 cms, masks, shifts), \
+
3395 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3396 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3397
+
3398/*
+
3399 * Allow tmem address to be specified
+
3400 */
+
3401#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3402 \
+
3403 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
+
3404 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3405 gsDPLoadSync(), \
+
3406 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3407 CALC_DXT(width, siz##_BYTES)), \
+
3408 gsDPPipeSync(), \
+
3409 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, \
+
3410 shiftt, cms, masks, shifts), \
+
3411 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3412 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3413
+
3414/*
+
3415 * Allow tmem address and render_tile to be specified
+
3416 */
+
3417#define _gsDPLoadTextureBlockTile(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \
+
3418 shiftt) \
+
3419 \
+
3420 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
+
3421 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3422 gsDPLoadSync(), \
+
3423 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3424 CALC_DXT(width, siz##_BYTES)), \
+
3425 gsDPPipeSync(), \
+
3426 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
+
3427 masks, shifts), \
+
3428 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3429
+
3430/*
+
3431 * Allow tmem address and render_tile to be specified, useful when loading
+
3432 * mutilple tiles at a time.
+
3433 */
+
3434#define gsDPLoadMultiBlock(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3435 \
+
3436 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
+
3437 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3438 gsDPLoadSync(), \
+
3439 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
+
3440 CALC_DXT(width, siz##_BYTES)), \
+
3441 gsDPPipeSync(), \
+
3442 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
+
3443 masks, shifts), \
+
3444 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3445
+
3446/*
+
3447 * Allows tmem and render tile to be specified. Useful when loading
+
3448 * several tiles at a time.
+
3449 *
+
3450 * Here is the static form of the pre-swapped texture block loading
+
3451 * See gDPLoadTextureBlockS() for reference. Basically, just don't
+
3452 * calculate DxT, use 0
+
3453 */
+
3454
+
3455#define gsDPLoadMultiBlockS(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3456 \
+
3457 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
+
3458 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3459 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0), \
+
3460 gsDPPipeSync(), \
+
3461 gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
+
3462 masks, shifts), \
+
3463 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3464
+
3465#define gDPLoadTextureBlock_4b(pkt, timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3466 { \
+
3467 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
+
3468 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3469 gDPLoadSync(pkt); \
+
3470 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \
+
3471 gDPPipeSync(pkt); \
+
3472 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
+
3473 cms, masks, shifts); \
+
3474 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3475 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3476 }
3477
-
3478#define gDPLoadTextureBlock_4bS(pkt, timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3479 { \
-
3480 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
-
3481 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3482 gDPLoadSync(pkt); \
-
3483 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0); \
-
3484 gDPPipeSync(pkt); \
-
3485 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
-
3486 cms, masks, shifts); \
-
3487 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3488 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3489 }
-
3490
-
3491/*
-
3492 * 4-bit load block. Useful when loading multiple tiles
-
3493 */
-
3494#define gDPLoadMultiBlock_4b(pkt, timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3495 { \
-
3496 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
-
3497 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3498 gDPLoadSync(pkt); \
-
3499 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \
-
3500 gDPPipeSync(pkt); \
-
3501 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
-
3502 masks, shifts); \
-
3503 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3504 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3505 }
-
3506
-
3507/*
-
3508 * 4-bit load block. Allows tmem and render tile to be specified. Useful when
-
3509 * loading multiple tiles. The S means odd lines are already word swapped.
-
3510 */
-
3511#define gDPLoadMultiBlock_4bS(pkt, timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3512 { \
-
3513 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
-
3514 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3515 gDPLoadSync(pkt); \
-
3516 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0); \
-
3517 gDPPipeSync(pkt); \
-
3518 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
-
3519 masks, shifts); \
-
3520 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3521 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3522 }
-
3523
-
3524#define _gDPLoadTextureBlock_4b(pkt, timg, tmem, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3525 { \
-
3526 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
-
3527 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
-
3528 gDPLoadSync(pkt); \
-
3529 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \
-
3530 gDPPipeSync(pkt); \
-
3531 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
-
3532 cms, masks, shifts); \
-
3533 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3534 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
-
3535 }
-
3536
-
3537#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3538 \
-
3539 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
-
3540 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3541 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \
-
3542 gsDPPipeSync(), \
-
3543 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, \
-
3544 masks, shifts), \
-
3545 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3546 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3547
-
3548#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3549 \
-
3550 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
-
3551 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3552 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0), gsDPPipeSync(), \
-
3553 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, \
-
3554 masks, shifts), \
-
3555 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3556 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3557
-
3558/*
-
3559 * 4-bit load block. Allows tmem address and render tile to be specified.
-
3560 * Useful when loading multiple tiles.
-
3561 */
-
3562#define gsDPLoadMultiBlock_4b(timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3563 \
-
3564 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
-
3565 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3566 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \
-
3567 gsDPPipeSync(), \
-
3568 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \
-
3569 shifts), \
-
3570 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3571
-
3572/*
-
3573 * 4-bit load block. Allows tmem address and render tile to be specified.
-
3574 * Useful when loading multiple tiles. S means odd lines are already swapped.
-
3575 */
-
3576#define gsDPLoadMultiBlock_4bS(timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3577 \
-
3578 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
-
3579 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3580 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0), gsDPPipeSync(), \
-
3581 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \
-
3582 shifts), \
-
3583 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3584
-
3585/*
-
3586 * Allows tmem address to be specified
-
3587 */
-
3588#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
-
3589 \
-
3590 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
-
3591 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
-
3592 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \
-
3593 gsDPPipeSync(), \
-
3594 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
-
3595 cms, masks, shifts), \
-
3596 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
-
3597 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
-
3598
-
3599#ifndef _HW_VERSION_1
-
3600
-
3601#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \
-
3602 shifts, shiftt) \
-
3603 { \
-
3604 gDPSetTextureImage(pkt, fmt, siz, width, timg); \
-
3605 gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, \
-
3606 maskt, shiftt, cms, masks, shifts); \
-
3607 gDPLoadSync(pkt); \
-
3608 gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3609 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC); \
-
3610 gDPPipeSync(pkt); \
-
3611 gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \
-
3612 maskt, shiftt, cms, masks, shifts); \
-
3613 gDPSetTileSize(pkt, G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3614 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \
-
3615 }
-
3616
-
3617#else /******** WORKAROUND hw 1 load tile bug ********/
-
3618
-
3619#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \
-
3620 shifts, shiftt) \
-
3621 \
-
3622 { \
-
3623 int _loadtile_i, _loadtile_nw; \
-
3624 Gfx* _loadtile_temp = pkt; \
-
3625 guDPLoadTextureTile(_loadtile_temp, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \
-
3626 maskt, shifts, shiftt); \
-
3627 _loadtile_nw = guGetDPLoadTextureTileSz(ult, lrt) - 1; \
-
3628 for (_loadtile_i = 0; _loadtile_i < _loadtile_nw; _loadtile_i++) \
-
3629 pkt; \
-
3630 }
-
3631
-
3632#endif /* HW_VERSION_1 */
-
3633
-
3634/*
-
3635 * Load texture tile. Allows tmem address and render tile to be specified.
-
3636 * Useful for loading multiple tiles.
-
3637 */
-
3638#define gDPLoadMultiTile(pkt, timg, tmem, rtile, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \
-
3639 maskt, shifts, shiftt) \
-
3640 { \
-
3641 gDPSetTextureImage(pkt, fmt, siz, width, timg); \
-
3642 gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, \
-
3643 maskt, shiftt, cms, masks, shifts); \
-
3644 gDPLoadSync(pkt); \
-
3645 gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3646 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC); \
-
3647 gDPPipeSync(pkt); \
-
3648 gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \
-
3649 shiftt, cms, masks, shifts); \
-
3650 gDPSetTileSize(pkt, rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3651 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \
-
3652 }
-
3653
-
3654#define gsDPLoadTextureTile(timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \
-
3655 shiftt) \
-
3656 \
-
3657 gsDPSetTextureImage(fmt, siz, width, timg), \
-
3658 gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \
-
3659 shiftt, cms, masks, shifts), \
-
3660 gsDPLoadSync(), \
-
3661 gsDPLoadTile(G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3662 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC), \
-
3663 gsDPPipeSync(), \
-
3664 gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \
-
3665 maskt, shiftt, cms, masks, shifts), \
-
3666 gsDPSetTileSize(G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3667 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC)
-
3668
-
3669/*
-
3670 * Load texture tile. Allows tmem address and render tile to be specified.
-
3671 * Useful for loading multiple tiles.
-
3672 */
-
3673#define gsDPLoadMultiTile(timg, tmem, rtile, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \
-
3674 shifts, shiftt) \
-
3675 \
-
3676 gsDPSetTextureImage(fmt, siz, width, timg), \
-
3677 gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, \
-
3678 maskt, shiftt, cms, masks, shifts), \
-
3679 gsDPLoadSync(), \
-
3680 gsDPLoadTile(G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3681 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC), \
-
3682 gsDPPipeSync(), \
-
3683 gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \
-
3684 shiftt, cms, masks, shifts), \
-
3685 gsDPSetTileSize(rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3686 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC)
-
3687
-
3688#define gDPLoadTextureTile_4b(pkt, timg, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \
-
3689 shiftt) \
-
3690 { \
-
3691 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_8b, ((width) >> 1), timg); \
-
3692 gDPSetTile(pkt, fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \
-
3693 shiftt, cms, masks, shifts); \
-
3694 gDPLoadSync(pkt); \
-
3695 gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \
-
3696 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)); \
-
3697 gDPPipeSync(pkt); \
-
3698 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \
-
3699 maskt, shiftt, cms, masks, shifts); \
-
3700 gDPSetTileSize(pkt, G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3701 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \
-
3702 }
-
3703
-
3704/*
-
3705 * Load texture tile. Allows tmem address and render tile to be specified.
-
3706 * Useful for loading multiple tiles.
-
3707 */
-
3708#define gDPLoadMultiTile_4b(pkt, timg, tmem, rtile, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \
-
3709 maskt, shifts, shiftt) \
-
3710 { \
-
3711 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_8b, ((width) >> 1), timg); \
-
3712 gDPSetTile(pkt, fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, maskt, \
-
3713 shiftt, cms, masks, shifts); \
-
3714 gDPLoadSync(pkt); \
-
3715 gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \
-
3716 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)); \
-
3717 gDPPipeSync(pkt); \
-
3718 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \
-
3719 shiftt, cms, masks, shifts); \
-
3720 gDPSetTileSize(pkt, rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3721 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \
-
3722 }
-
3723
-
3724#define gsDPLoadTextureTile_4b(timg, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \
-
3725 shiftt) \
-
3726 \
-
3727 gsDPSetTextureImage(fmt, G_IM_SIZ_8b, ((width) >> 1), timg), \
-
3728 gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \
-
3729 shiftt, cms, masks, shifts), \
-
3730 gsDPLoadSync(), \
-
3731 gsDPLoadTile(G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \
-
3732 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)), \
-
3733 gsDPPipeSync(), \
-
3734 gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, \
-
3735 shiftt, cms, masks, shifts), \
-
3736 gsDPSetTileSize(G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3737 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC)
-
3738
-
3739/*
-
3740 * Load texture tile. Allows tmem address and render tile to be specified.
-
3741 * Useful for loading multiple tiles.
-
3742 */
-
3743#define gsDPLoadMultiTile_4b(timg, tmem, rtile, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \
-
3744 shifts, shiftt) \
-
3745 \
-
3746 gsDPSetTextureImage(fmt, G_IM_SIZ_8b, ((width) >> 1), timg), \
-
3747 gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, maskt, \
-
3748 shiftt, cms, masks, shifts), \
-
3749 gsDPLoadSync(), \
-
3750 gsDPLoadTile(G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \
-
3751 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)), \
-
3752 gsDPPipeSync(), \
-
3753 gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, \
-
3754 cms, masks, shifts), \
-
3755 gsDPSetTileSize(rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
-
3756 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC)
-
3757
-
3758/*
-
3759 * Load a 16-entry palette (for 4-bit CI textures)
-
3760 * Assumes a 16 entry tlut is being loaded, palette # is 0-15
-
3761 */
-
3762#ifndef _HW_VERSION_1
-
3763
-
3764#define gDPLoadTLUT_pal16(pkt, pal, dram) \
-
3765 { \
-
3766 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
-
3767 gDPTileSync(pkt); \
-
3768 gDPSetTile(pkt, 0, 0, 0, (256 + (((pal) & 0xf) * 16)), G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \
-
3769 gDPLoadSync(pkt); \
-
3770 gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 15); \
-
3771 gDPPipeSync(pkt) \
-
3772 }
-
3773
-
3774#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
-
3775
-
3776#define gDPLoadTLUT_pal16(pkt, pal, dram) \
-
3777 \
-
3778 _gDPLoadTextureBlock(pkt, dram, (256 + (((pal) & 0xf) * 16)), G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 16, 1, pal, 0, 0, \
-
3779 0, 0, 0, 0)
-
3780
-
3781#endif /* _HW_VERSION_1 */
-
3782
-
3783/*
-
3784 * Load a 16-entry palette (for 4-bit CI textures)
-
3785 * Assumes a 16 entry tlut is being loaded, palette # is 0-15
-
3786 */
-
3787#ifndef _HW_VERSION_1
-
3788
-
3789#define gsDPLoadTLUT_pal16(pal, dram) \
-
3790 \
-
3791 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \
-
3792 gsDPSetTile(0, 0, 0, (256 + (((pal) & 0xf) * 16)), G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \
-
3793 gsDPLoadTLUTCmd(G_TX_LOADTILE, 15), gsDPPipeSync()
-
3794
-
3795#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
-
3796
-
3797#define gsDPLoadTLUT_pal16(pal, dram) \
-
3798 \
-
3799 _gsDPLoadTextureBlock(dram, (256 + (((pal) & 0xf) * 16)), G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 16, 1, pal, 0, 0, 0, 0, \
-
3800 0, 0)
-
3801
-
3802#endif /* _HW_VERSION_1 */
-
3803
-
3804/*
-
3805 * Load a 256-entry palette (for 8-bit CI textures)
-
3806 * Assumes a 256 entry tlut is being loaded, palette # is not used
-
3807 */
-
3808#ifndef _HW_VERSION_1
-
3809
-
3810#define gDPLoadTLUT_pal256(pkt, dram) \
-
3811 { \
-
3812 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
-
3813 gDPTileSync(pkt); \
-
3814 gDPSetTile(pkt, 0, 0, 0, 256, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \
-
3815 gDPLoadSync(pkt); \
-
3816 gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 255); \
-
3817 gDPPipeSync(pkt) \
-
3818 }
-
3819
-
3820#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
-
3821
-
3822#define gDPLoadTLUT_pal256(pkt, dram) \
-
3823 \
-
3824 _gDPLoadTextureBlock(pkt, dram, 256, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 256, 1, 0, 0, 0, 0, 0, 0, 0)
-
3825
-
3826#endif /* _HW_VERSION_1 */
-
3827
-
3828#ifndef _HW_VERSION_1
-
3829
-
3830#define gsDPLoadTLUT_pal256(dram) \
-
3831 \
-
3832 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \
-
3833 gsDPSetTile(0, 0, 0, 256, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \
-
3834 gsDPLoadTLUTCmd(G_TX_LOADTILE, 255), gsDPPipeSync()
-
3835
-
3836#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
-
3837
-
3838#define gsDPLoadTLUT_pal256(dram) \
-
3839 \
-
3840 _gsDPLoadTextureBlock(dram, 256, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 256, 1, 0, 0, 0, 0, 0, 0, 0)
-
3841
-
3842#endif /* _HW_VERSION_1 */
-
3843
-
3844#ifndef _HW_VERSION_1
-
3845
-
3846#define gDPLoadTLUT(pkt, count, tmemaddr, dram) \
-
3847 { \
-
3848 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
-
3849 gDPTileSync(pkt); \
-
3850 gDPSetTile(pkt, 0, 0, 0, tmemaddr, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \
-
3851 gDPLoadSync(pkt); \
-
3852 gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, ((count) - 1)); \
-
3853 gDPPipeSync(pkt); \
-
3854 }
-
3855
-
3856#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
-
3857
-
3858#define gDPLoadTLUT(pkt, count, tmemaddr, dram) \
-
3859 \
-
3860 _gDPLoadTextureBlock(pkt, dram, tmemaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, count, 0, 0, 0, 0, 0, 0, 0)
-
3861
-
3862#endif /* _HW_VERSION_1 */
-
3863
-
3864#ifndef _HW_VERSION_1
-
3865
-
3866#define gsDPLoadTLUT(count, tmemaddr, dram) \
-
3867 \
-
3868 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \
-
3869 gsDPSetTile(0, 0, 0, tmemaddr, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \
-
3870 gsDPLoadTLUTCmd(G_TX_LOADTILE, ((count) - 1)), gsDPPipeSync()
-
3871
-
3872#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
-
3873#define gsDPLoadTLUT(count, tmemaddr, dram) \
-
3874 \
-
3875 _gsDPLoadTextureBlock(dram, tmemaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, count, 0, 0, 0, 0, 0, 0, 0)
-
3876
-
3877#endif /* _HW_VERSION_1 */
-
3878
-
3879#define gDPSetScissor(pkt, mode, ulx, uly, lrx, lry) \
-
3880 { \
-
3881 Gfx* _g = (Gfx*) pkt; \
-
3882 \
-
3883 _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int) ((float) (ulx) * 4.0F), 12, 12) | \
-
3884 _SHIFTL((int) ((float) (uly) * 4.0F), 0, 12); \
-
3885 _g->words.w1 = _SHIFTL(mode, 24, 2) | _SHIFTL((int) ((float) (lrx) * 4.0F), 12, 12) | \
-
3886 _SHIFTL((int) ((float) (lry) * 4.0F), 0, 12); \
-
3887 }
-
3888
-
3889#define gDPSetScissorFrac(pkt, mode, ulx, uly, lrx, lry) \
-
3890 { \
-
3891 Gfx* _g = (Gfx*) pkt; \
-
3892 \
-
3893 _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int) ((ulx)), 12, 12) | _SHIFTL((int) ((uly)), 0, 12); \
-
3894 _g->words.w1 = _SHIFTL(mode, 24, 2) | _SHIFTL((int) ((lrx)), 12, 12) | _SHIFTL((int) ((lry)), 0, 12); \
-
3895 }
-
3896
-
3897#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \
-
3898 { \
-
3899 { \
-
3900 _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int) ((float) (ulx) * 4.0F), 12, 12) | \
-
3901 _SHIFTL((int) ((float) (uly) * 4.0F), 0, 12), \
-
3902 _SHIFTL(mode, 24, 2) | _SHIFTL((int) ((float) (lrx) * 4.0F), 12, 12) | \
-
3903 _SHIFTL((int) ((float) (lry) * 4.0F), 0, 12) \
-
3904 } \
-
3905 }
-
3906
-
3907#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \
-
3908 { \
-
3909 { \
-
3910 _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int) ((ulx)), 12, 12) | _SHIFTL((int) ((uly)), 0, 12), \
-
3911 _SHIFTL(mode, 24, 2) | _SHIFTL((int) (lrx), 12, 12) | _SHIFTL((int) (lry), 0, 12) \
-
3912 } \
-
3913 }
-
3914
-
3915/* Fraction never used in fill */
-
3916#define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \
-
3917 { \
-
3918 Gfx* _g = (Gfx*) (pkt); \
-
3919 \
-
3920 _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 14, 10) | _SHIFTL((lry), 2, 10)); \
-
3921 _g->words.w1 = (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10)); \
-
3922 }
-
3923
-
3924#define gsDPFillRectangle(ulx, uly, lrx, lry) \
-
3925 { \
-
3926 { \
-
3927 (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 14, 10) | _SHIFTL((lry), 2, 10)), \
-
3928 (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10)) \
-
3929 } \
-
3930 }
-
3931
-
3932/* like gDPFillRectangle but accepts negative arguments */
-
3933#define gDPScisFillRectangle(pkt, ulx, uly, lrx, lry) \
-
3934 { \
-
3935 Gfx* _g = (Gfx*) (pkt); \
-
3936 \
-
3937 _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL(MAX((lrx), 0), 14, 10) | _SHIFTL(MAX((lry), 0), 2, 10)); \
-
3938 _g->words.w1 = (_SHIFTL(MAX((ulx), 0), 14, 10) | _SHIFTL(MAX((uly), 0), 2, 10)); \
-
3939 }
-
3940
-
3941#define gDPSetConvert(pkt, k0, k1, k2, k3, k4, k5) \
-
3942 { \
-
3943 Gfx* _g = (Gfx*) (pkt); \
-
3944 \
-
3945 _g->words.w0 = (_SHIFTL(G_SETCONVERT, 24, 8) | _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | _SHIFTR(k2, 5, 4)); \
-
3946 _g->words.w1 = (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | _SHIFTL(k4, 9, 9) | _SHIFTL(k5, 0, 9)); \
-
3947 }
-
3948
-
3949#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \
-
3950 { \
-
3951 { \
-
3952 (_SHIFTL(G_SETCONVERT, 24, 8) | _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | _SHIFTR(k2, 5, 4)), \
-
3953 (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | _SHIFTL(k4, 9, 9) | _SHIFTL(k5, 0, 9)) \
-
3954 } \
-
3955 }
-
3956
-
3957#define gDPSetKeyR(pkt, cR, sR, wR) \
-
3958 { \
-
3959 Gfx* _g = (Gfx*) (pkt); \
-
3960 \
-
3961 _g->words.w0 = _SHIFTL(G_SETKEYR, 24, 8); \
-
3962 _g->words.w1 = (_SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | _SHIFTL(sR, 0, 8)); \
-
3963 }
-
3964
-
3965#define gsDPSetKeyR(cR, sR, wR) \
-
3966 { \
-
3967 { _SHIFTL(G_SETKEYR, 24, 8), _SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | _SHIFTL(sR, 0, 8) } \
-
3968 }
-
3969
-
3970#define gDPSetKeyGB(pkt, cG, sG, wG, cB, sB, wB) \
-
3971 { \
-
3972 Gfx* _g = (Gfx*) (pkt); \
-
3973 \
-
3974 _g->words.w0 = (_SHIFTL(G_SETKEYGB, 24, 8) | _SHIFTL(wG, 12, 12) | _SHIFTL(wB, 0, 12)); \
-
3975 _g->words.w1 = (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | _SHIFTL(cB, 8, 8) | _SHIFTL(sB, 0, 8)); \
-
3976 }
-
3977
-
3978#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \
-
3979 { \
-
3980 { \
-
3981 (_SHIFTL(G_SETKEYGB, 24, 8) | _SHIFTL(wG, 12, 12) | _SHIFTL(wB, 0, 12)), \
-
3982 (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | _SHIFTL(cB, 8, 8) | _SHIFTL(sB, 0, 8)) \
-
3983 } \
-
3984 }
-
3985
-
3986#define gDPNoParam(pkt, cmd) \
-
3987 { \
-
3988 Gfx* _g = (Gfx*) (pkt); \
-
3989 \
-
3990 _g->words.w0 = _SHIFTL(cmd, 24, 8); \
-
3991 _g->words.w1 = 0; \
-
3992 }
-
3993
-
3994#define gsDPNoParam(cmd) \
-
3995 { \
-
3996 { _SHIFTL(cmd, 24, 8), 0 } \
-
3997 }
-
3998
-
3999#define gDPParam(pkt, cmd, param) \
-
4000 { \
-
4001 Gfx* _g = (Gfx*) (pkt); \
-
4002 \
-
4003 _g->words.w0 = _SHIFTL(cmd, 24, 8); \
-
4004 _g->words.w1 = (param); \
-
4005 }
-
4006
-
4007#define gsDPParam(cmd, param) \
-
4008 { \
-
4009 { _SHIFTL(cmd, 24, 8), (param) } \
-
4010 }
-
4011
-
4012/* Notice that textured rectangles are 128-bit commands, therefore
-
4013 * gsDPTextureRectangle() should not be used in display lists
-
4014 * under normal circumstances (use gsSPTextureRectangle()).
-
4015 * That is also why there is no gDPTextureRectangle() macros.
-
4016 */
-
4017#define gsDPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4018 { { \
-
4019 (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
-
4020 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \
-
4021 } }, \
-
4022 { \
-
4023 { _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) } \
-
4024 }
-
4025
-
4026#define gDPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4027 { \
-
4028 Gfx* _g = (Gfx*) (pkt); \
-
4029 if (pkt) \
-
4030 ; \
-
4031 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
-
4032 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
-
4033 _g++; \
-
4034 _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \
-
4035 _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \
-
4036 }
-
4037
-
4038#define gsDPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4039 { { \
-
4040 (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
-
4041 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \
-
4042 } }, \
-
4043 { \
-
4044 { _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) } \
-
4045 }
-
4046
-
4047#define gDPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4048 { \
-
4049 Gfx* _g = (Gfx*) (pkt); \
-
4050 if (pkt) \
-
4051 ; \
-
4052 _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
-
4053 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
-
4054 _g++; \
-
4055 _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \
-
4056 _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \
-
4057 }
-
4058
-
4059#ifdef F3D_OLD
-
4060#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4061 { \
-
4062 Gfx* _g = (Gfx*) (pkt); \
-
4063 \
-
4064 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
-
4065 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
-
4066 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
-
4067 gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
-
4068 }
-
4069
-
4070#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4071 { { (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
-
4072 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \
-
4073 gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
-
4074 gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
-
4075
-
4076/* like gSPTextureRectangle but accepts negative position arguments */
-
4077#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4078 { \
-
4079 Gfx* _g = (Gfx*) (pkt); \
-
4080 \
-
4081 _g->words.w0 = \
-
4082 (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(MAX((s16) (xh), 0), 12, 12) | _SHIFTL(MAX((s16) (yh), 0), 0, 12)); \
-
4083 _g->words.w1 = \
-
4084 (_SHIFTL((tile), 24, 3) | _SHIFTL(MAX((s16) (xl), 0), 12, 12) | _SHIFTL(MAX((s16) (yl), 0), 0, 12)); \
-
4085 gImmp1(pkt, G_RDPHALF_2, \
-
4086 (_SHIFTL(((s) - (((s16) (xl) < 0) ? (((s16) (dsdx) < 0) ? (MAX((((s16) (xl) * (s16) (dsdx)) >> 7), 0)) \
-
4087 : (MIN((((s16) (xl) * (s16) (dsdx)) >> 7), 0))) \
-
4088 : 0)), \
-
4089 16, 16) | \
-
4090 _SHIFTL(((t) - (((yl) < 0) ? (((s16) (dtdy) < 0) ? (MAX((((s16) (yl) * (s16) (dtdy)) >> 7), 0)) \
-
4091 : (MIN((((s16) (yl) * (s16) (dtdy)) >> 7), 0))) \
-
4092 : 0)), \
-
4093 0, 16))); \
-
4094 gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL((dsdx), 16, 16) | _SHIFTL((dtdy), 0, 16))); \
-
4095 }
-
4096
-
4097#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4098 { { (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
-
4099 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \
-
4100 gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
-
4101 gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
-
4102
-
4103#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4104 { \
-
4105 Gfx* _g = (Gfx*) (pkt); \
-
4106 \
-
4107 _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
-
4108 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
-
4109 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
-
4110 gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
-
4111 }
-
4112#else
-
4113#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4114 { \
-
4115 Gfx* _g = (Gfx*) (pkt); \
-
4116 \
-
4117 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
-
4118 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
-
4119 gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
-
4120 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
-
4121 }
-
4122
-
4123#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4124 { { (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
-
4125 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \
-
4126 gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
-
4127 gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
-
4128
-
4129/* like gSPTextureRectangle but accepts negative position arguments */
-
4130#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4131 { \
-
4132 Gfx* _g = (Gfx*) (pkt); \
-
4133 \
-
4134 _g->words.w0 = \
-
4135 (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(MAX((s16) (xh), 0), 12, 12) | _SHIFTL(MAX((s16) (yh), 0), 0, 12)); \
-
4136 _g->words.w1 = \
-
4137 (_SHIFTL((tile), 24, 3) | _SHIFTL(MAX((s16) (xl), 0), 12, 12) | _SHIFTL(MAX((s16) (yl), 0), 0, 12)); \
-
4138 gImmp1(pkt, G_RDPHALF_1, \
-
4139 (_SHIFTL(((s) - (((s16) (xl) < 0) ? (((s16) (dsdx) < 0) ? (MAX((((s16) (xl) * (s16) (dsdx)) >> 7), 0)) \
-
4140 : (MIN((((s16) (xl) * (s16) (dsdx)) >> 7), 0))) \
-
4141 : 0)), \
-
4142 16, 16) | \
-
4143 _SHIFTL(((t) - (((yl) < 0) ? (((s16) (dtdy) < 0) ? (MAX((((s16) (yl) * (s16) (dtdy)) >> 7), 0)) \
-
4144 : (MIN((((s16) (yl) * (s16) (dtdy)) >> 7), 0))) \
-
4145 : 0)), \
-
4146 0, 16))); \
-
4147 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL((dsdx), 16, 16) | _SHIFTL((dtdy), 0, 16))); \
-
4148 }
-
4149
-
4150#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4151 { { (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
-
4152 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \
-
4153 gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
-
4154 gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
-
4155
-
4156#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-
4157 { \
-
4158 Gfx* _g = (Gfx*) (pkt); \
-
4159 \
-
4160 _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
-
4161 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
-
4162 gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
-
4163 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
-
4164 }
-
4165#endif
-
4166
-
4167#define gsDPWord(wordhi, wordlo) gsImmp1(G_RDPHALF_1, (uintptr_t) (wordhi)), gsImmp1(G_RDPHALF_2, (uintptr_t) (wordlo))
-
4168
-
4169#define gDPWord(pkt, wordhi, wordlo) \
-
4170 { \
-
4171 Gfx* _g = (Gfx*) (pkt); \
-
4172 \
-
4173 gImmp1(pkt, G_RDPHALF_1, (uintptr_t) (wordhi)); \
-
4174 gImmp1(pkt, G_RDPHALF_2, (uintptr_t) (wordlo)); \
-
4175 }
-
4176
-
4177#define gDPFullSync(pkt) gDPNoParam(pkt, G_RDPFULLSYNC)
-
4178#define gsDPFullSync() gsDPNoParam(G_RDPFULLSYNC)
-
4179#define gDPTileSync(pkt) gDPNoParam(pkt, G_RDPTILESYNC)
-
4180#define gsDPTileSync() gsDPNoParam(G_RDPTILESYNC)
-
4181#define gDPPipeSync(pkt) gDPNoParam(pkt, G_RDPPIPESYNC)
-
4182#define gsDPPipeSync() gsDPNoParam(G_RDPPIPESYNC)
-
4183#define gDPLoadSync(pkt) gDPNoParam(pkt, G_RDPLOADSYNC)
-
4184#define gsDPLoadSync() gsDPNoParam(G_RDPLOADSYNC)
-
4185#define gDPNoOp(pkt) gDPNoParam(pkt, G_NOOP)
-
4186#define gsDPNoOp() gsDPNoParam(G_NOOP)
-
4187#define gDPNoOpTag(pkt, tag) gDPParam(pkt, G_NOOP, tag)
-
4188#define gsDPNoOpTag(tag) gsDPParam(G_NOOP, tag)
-
4189
-
4190#endif /* _LANGUAGE_C */
-
4191
-
4192#endif /* _GBI_H_ */
+
3478/* Load fix rww 27jun95 */
+
3479/* The S at the end means odd lines are already word Swapped */
+
3480
+
3481#define gDPLoadTextureBlock_4bS(pkt, timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3482 { \
+
3483 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
+
3484 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3485 gDPLoadSync(pkt); \
+
3486 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0); \
+
3487 gDPPipeSync(pkt); \
+
3488 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
+
3489 cms, masks, shifts); \
+
3490 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3491 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3492 }
+
3493
+
3494/*
+
3495 * 4-bit load block. Useful when loading multiple tiles
+
3496 */
+
3497#define gDPLoadMultiBlock_4b(pkt, timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3498 { \
+
3499 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
+
3500 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3501 gDPLoadSync(pkt); \
+
3502 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \
+
3503 gDPPipeSync(pkt); \
+
3504 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
+
3505 masks, shifts); \
+
3506 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3507 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3508 }
+
3509
+
3510/*
+
3511 * 4-bit load block. Allows tmem and render tile to be specified. Useful when
+
3512 * loading multiple tiles. The S means odd lines are already word swapped.
+
3513 */
+
3514#define gDPLoadMultiBlock_4bS(pkt, timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3515 { \
+
3516 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
+
3517 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3518 gDPLoadSync(pkt); \
+
3519 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0); \
+
3520 gDPPipeSync(pkt); \
+
3521 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \
+
3522 masks, shifts); \
+
3523 gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3524 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3525 }
+
3526
+
3527#define _gDPLoadTextureBlock_4b(pkt, timg, tmem, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3528 { \
+
3529 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
+
3530 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
+
3531 gDPLoadSync(pkt); \
+
3532 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \
+
3533 gDPPipeSync(pkt); \
+
3534 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
+
3535 cms, masks, shifts); \
+
3536 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3537 ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \
+
3538 }
+
3539
+
3540#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3541 \
+
3542 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
+
3543 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3544 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \
+
3545 gsDPPipeSync(), \
+
3546 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, \
+
3547 masks, shifts), \
+
3548 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3549 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3550
+
3551#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3552 \
+
3553 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
+
3554 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3555 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0), gsDPPipeSync(), \
+
3556 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, \
+
3557 masks, shifts), \
+
3558 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3559 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3560
+
3561/*
+
3562 * 4-bit load block. Allows tmem address and render tile to be specified.
+
3563 * Useful when loading multiple tiles.
+
3564 */
+
3565#define gsDPLoadMultiBlock_4b(timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3566 \
+
3567 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
+
3568 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3569 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \
+
3570 gsDPPipeSync(), \
+
3571 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \
+
3572 shifts), \
+
3573 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3574
+
3575/*
+
3576 * 4-bit load block. Allows tmem address and render tile to be specified.
+
3577 * Useful when loading multiple tiles. S means odd lines are already swapped.
+
3578 */
+
3579#define gsDPLoadMultiBlock_4bS(timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3580 \
+
3581 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
+
3582 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3583 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0), gsDPPipeSync(), \
+
3584 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \
+
3585 shifts), \
+
3586 gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3587
+
3588/*
+
3589 * Allows tmem address to be specified
+
3590 */
+
3591#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+
3592 \
+
3593 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
+
3594 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
+
3595 gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \
+
3596 gsDPPipeSync(), \
+
3597 gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
+
3598 cms, masks, shifts), \
+
3599 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
+
3600 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
+
3601
+
3602#ifndef _HW_VERSION_1
+
3603
+
3604#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \
+
3605 shifts, shiftt) \
+
3606 { \
+
3607 gDPSetTextureImage(pkt, fmt, siz, width, timg); \
+
3608 gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, \
+
3609 maskt, shiftt, cms, masks, shifts); \
+
3610 gDPLoadSync(pkt); \
+
3611 gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3612 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC); \
+
3613 gDPPipeSync(pkt); \
+
3614 gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \
+
3615 maskt, shiftt, cms, masks, shifts); \
+
3616 gDPSetTileSize(pkt, G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3617 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \
+
3618 }
+
3619
+
3620#else /******** WORKAROUND hw 1 load tile bug ********/
+
3621
+
3622#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \
+
3623 shifts, shiftt) \
+
3624 \
+
3625 { \
+
3626 int _loadtile_i, _loadtile_nw; \
+
3627 Gfx* _loadtile_temp = pkt; \
+
3628 guDPLoadTextureTile(_loadtile_temp, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \
+
3629 maskt, shifts, shiftt); \
+
3630 _loadtile_nw = guGetDPLoadTextureTileSz(ult, lrt) - 1; \
+
3631 for (_loadtile_i = 0; _loadtile_i < _loadtile_nw; _loadtile_i++) \
+
3632 pkt; \
+
3633 }
+
3634
+
3635#endif /* HW_VERSION_1 */
+
3636
+
3637/*
+
3638 * Load texture tile. Allows tmem address and render tile to be specified.
+
3639 * Useful for loading multiple tiles.
+
3640 */
+
3641#define gDPLoadMultiTile(pkt, timg, tmem, rtile, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \
+
3642 maskt, shifts, shiftt) \
+
3643 { \
+
3644 gDPSetTextureImage(pkt, fmt, siz, width, timg); \
+
3645 gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, \
+
3646 maskt, shiftt, cms, masks, shifts); \
+
3647 gDPLoadSync(pkt); \
+
3648 gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3649 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC); \
+
3650 gDPPipeSync(pkt); \
+
3651 gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \
+
3652 shiftt, cms, masks, shifts); \
+
3653 gDPSetTileSize(pkt, rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3654 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \
+
3655 }
+
3656
+
3657#define gsDPLoadTextureTile(timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \
+
3658 shiftt) \
+
3659 \
+
3660 gsDPSetTextureImage(fmt, siz, width, timg), \
+
3661 gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \
+
3662 shiftt, cms, masks, shifts), \
+
3663 gsDPLoadSync(), \
+
3664 gsDPLoadTile(G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3665 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC), \
+
3666 gsDPPipeSync(), \
+
3667 gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \
+
3668 maskt, shiftt, cms, masks, shifts), \
+
3669 gsDPSetTileSize(G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3670 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC)
+
3671
+
3672/*
+
3673 * Load texture tile. Allows tmem address and render tile to be specified.
+
3674 * Useful for loading multiple tiles.
+
3675 */
+
3676#define gsDPLoadMultiTile(timg, tmem, rtile, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \
+
3677 shifts, shiftt) \
+
3678 \
+
3679 gsDPSetTextureImage(fmt, siz, width, timg), \
+
3680 gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, \
+
3681 maskt, shiftt, cms, masks, shifts), \
+
3682 gsDPLoadSync(), \
+
3683 gsDPLoadTile(G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3684 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC), \
+
3685 gsDPPipeSync(), \
+
3686 gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \
+
3687 shiftt, cms, masks, shifts), \
+
3688 gsDPSetTileSize(rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3689 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC)
+
3690
+
3691#define gDPLoadTextureTile_4b(pkt, timg, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \
+
3692 shiftt) \
+
3693 { \
+
3694 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_8b, ((width) >> 1), timg); \
+
3695 gDPSetTile(pkt, fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \
+
3696 shiftt, cms, masks, shifts); \
+
3697 gDPLoadSync(pkt); \
+
3698 gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \
+
3699 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)); \
+
3700 gDPPipeSync(pkt); \
+
3701 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \
+
3702 maskt, shiftt, cms, masks, shifts); \
+
3703 gDPSetTileSize(pkt, G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3704 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \
+
3705 }
+
3706
+
3707/*
+
3708 * Load texture tile. Allows tmem address and render tile to be specified.
+
3709 * Useful for loading multiple tiles.
+
3710 */
+
3711#define gDPLoadMultiTile_4b(pkt, timg, tmem, rtile, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \
+
3712 maskt, shifts, shiftt) \
+
3713 { \
+
3714 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_8b, ((width) >> 1), timg); \
+
3715 gDPSetTile(pkt, fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, maskt, \
+
3716 shiftt, cms, masks, shifts); \
+
3717 gDPLoadSync(pkt); \
+
3718 gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \
+
3719 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)); \
+
3720 gDPPipeSync(pkt); \
+
3721 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \
+
3722 shiftt, cms, masks, shifts); \
+
3723 gDPSetTileSize(pkt, rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3724 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \
+
3725 }
+
3726
+
3727#define gsDPLoadTextureTile_4b(timg, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \
+
3728 shiftt) \
+
3729 \
+
3730 gsDPSetTextureImage(fmt, G_IM_SIZ_8b, ((width) >> 1), timg), \
+
3731 gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \
+
3732 shiftt, cms, masks, shifts), \
+
3733 gsDPLoadSync(), \
+
3734 gsDPLoadTile(G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \
+
3735 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)), \
+
3736 gsDPPipeSync(), \
+
3737 gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, \
+
3738 shiftt, cms, masks, shifts), \
+
3739 gsDPSetTileSize(G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3740 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC)
+
3741
+
3742/*
+
3743 * Load texture tile. Allows tmem address and render tile to be specified.
+
3744 * Useful for loading multiple tiles.
+
3745 */
+
3746#define gsDPLoadMultiTile_4b(timg, tmem, rtile, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \
+
3747 shifts, shiftt) \
+
3748 \
+
3749 gsDPSetTextureImage(fmt, G_IM_SIZ_8b, ((width) >> 1), timg), \
+
3750 gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, maskt, \
+
3751 shiftt, cms, masks, shifts), \
+
3752 gsDPLoadSync(), \
+
3753 gsDPLoadTile(G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \
+
3754 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)), \
+
3755 gsDPPipeSync(), \
+
3756 gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, \
+
3757 cms, masks, shifts), \
+
3758 gsDPSetTileSize(rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \
+
3759 (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC)
+
3760
+
3761/*
+
3762 * Load a 16-entry palette (for 4-bit CI textures)
+
3763 * Assumes a 16 entry tlut is being loaded, palette # is 0-15
+
3764 */
+
3765#ifndef _HW_VERSION_1
+
3766
+
3767#define gDPLoadTLUT_pal16(pkt, pal, dram) \
+
3768 { \
+
3769 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
+
3770 gDPTileSync(pkt); \
+
3771 gDPSetTile(pkt, 0, 0, 0, (256 + (((pal) & 0xf) * 16)), G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \
+
3772 gDPLoadSync(pkt); \
+
3773 gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 15); \
+
3774 gDPPipeSync(pkt) \
+
3775 }
+
3776
+
3777#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
+
3778
+
3779#define gDPLoadTLUT_pal16(pkt, pal, dram) \
+
3780 \
+
3781 _gDPLoadTextureBlock(pkt, dram, (256 + (((pal) & 0xf) * 16)), G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 16, 1, pal, 0, 0, \
+
3782 0, 0, 0, 0)
+
3783
+
3784#endif /* _HW_VERSION_1 */
+
3785
+
3786/*
+
3787 * Load a 16-entry palette (for 4-bit CI textures)
+
3788 * Assumes a 16 entry tlut is being loaded, palette # is 0-15
+
3789 */
+
3790#ifndef _HW_VERSION_1
+
3791
+
3792#define gsDPLoadTLUT_pal16(pal, dram) \
+
3793 \
+
3794 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \
+
3795 gsDPSetTile(0, 0, 0, (256 + (((pal) & 0xf) * 16)), G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \
+
3796 gsDPLoadTLUTCmd(G_TX_LOADTILE, 15), gsDPPipeSync()
+
3797
+
3798#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
+
3799
+
3800#define gsDPLoadTLUT_pal16(pal, dram) \
+
3801 \
+
3802 _gsDPLoadTextureBlock(dram, (256 + (((pal) & 0xf) * 16)), G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 16, 1, pal, 0, 0, 0, 0, \
+
3803 0, 0)
+
3804
+
3805#endif /* _HW_VERSION_1 */
+
3806
+
3807/*
+
3808 * Load a 256-entry palette (for 8-bit CI textures)
+
3809 * Assumes a 256 entry tlut is being loaded, palette # is not used
+
3810 */
+
3811#ifndef _HW_VERSION_1
+
3812
+
3813#define gDPLoadTLUT_pal256(pkt, dram) \
+
3814 { \
+
3815 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
+
3816 gDPTileSync(pkt); \
+
3817 gDPSetTile(pkt, 0, 0, 0, 256, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \
+
3818 gDPLoadSync(pkt); \
+
3819 gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 255); \
+
3820 gDPPipeSync(pkt) \
+
3821 }
+
3822
+
3823#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
+
3824
+
3825#define gDPLoadTLUT_pal256(pkt, dram) \
+
3826 \
+
3827 _gDPLoadTextureBlock(pkt, dram, 256, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 256, 1, 0, 0, 0, 0, 0, 0, 0)
+
3828
+
3829#endif /* _HW_VERSION_1 */
+
3830
+
3831#ifndef _HW_VERSION_1
+
3832
+
3833#define gsDPLoadTLUT_pal256(dram) \
+
3834 \
+
3835 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \
+
3836 gsDPSetTile(0, 0, 0, 256, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \
+
3837 gsDPLoadTLUTCmd(G_TX_LOADTILE, 255), gsDPPipeSync()
+
3838
+
3839#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
+
3840
+
3841#define gsDPLoadTLUT_pal256(dram) \
+
3842 \
+
3843 _gsDPLoadTextureBlock(dram, 256, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 256, 1, 0, 0, 0, 0, 0, 0, 0)
+
3844
+
3845#endif /* _HW_VERSION_1 */
+
3846
+
3847#ifndef _HW_VERSION_1
+
3848
+
3849#define gDPLoadTLUT(pkt, count, tmemaddr, dram) \
+
3850 { \
+
3851 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
+
3852 gDPTileSync(pkt); \
+
3853 gDPSetTile(pkt, 0, 0, 0, tmemaddr, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \
+
3854 gDPLoadSync(pkt); \
+
3855 gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, ((count) - 1)); \
+
3856 gDPPipeSync(pkt); \
+
3857 }
+
3858
+
3859#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
+
3860
+
3861#define gDPLoadTLUT(pkt, count, tmemaddr, dram) \
+
3862 \
+
3863 _gDPLoadTextureBlock(pkt, dram, tmemaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, count, 0, 0, 0, 0, 0, 0, 0)
+
3864
+
3865#endif /* _HW_VERSION_1 */
+
3866
+
3867#ifndef _HW_VERSION_1
+
3868
+
3869#define gsDPLoadTLUT(count, tmemaddr, dram) \
+
3870 \
+
3871 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \
+
3872 gsDPSetTile(0, 0, 0, tmemaddr, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \
+
3873 gsDPLoadTLUTCmd(G_TX_LOADTILE, ((count) - 1)), gsDPPipeSync()
+
3874
+
3875#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */
+
3876#define gsDPLoadTLUT(count, tmemaddr, dram) \
+
3877 \
+
3878 _gsDPLoadTextureBlock(dram, tmemaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, count, 0, 0, 0, 0, 0, 0, 0)
+
3879
+
3880#endif /* _HW_VERSION_1 */
+
3881
+
3882#define gDPSetScissor(pkt, mode, ulx, uly, lrx, lry) \
+
3883 { \
+
3884 Gfx* _g = (Gfx*) pkt; \
+
3885 \
+
3886 _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int) ((float) (ulx) * 4.0F), 12, 12) | \
+
3887 _SHIFTL((int) ((float) (uly) * 4.0F), 0, 12); \
+
3888 _g->words.w1 = _SHIFTL(mode, 24, 2) | _SHIFTL((int) ((float) (lrx) * 4.0F), 12, 12) | \
+
3889 _SHIFTL((int) ((float) (lry) * 4.0F), 0, 12); \
+
3890 }
+
3891
+
3892#define gDPSetScissorFrac(pkt, mode, ulx, uly, lrx, lry) \
+
3893 { \
+
3894 Gfx* _g = (Gfx*) pkt; \
+
3895 \
+
3896 _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int) ((ulx)), 12, 12) | _SHIFTL((int) ((uly)), 0, 12); \
+
3897 _g->words.w1 = _SHIFTL(mode, 24, 2) | _SHIFTL((int) ((lrx)), 12, 12) | _SHIFTL((int) ((lry)), 0, 12); \
+
3898 }
+
3899
+
3900#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \
+
3901 { \
+
3902 { \
+
3903 _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int) ((float) (ulx) * 4.0F), 12, 12) | \
+
3904 _SHIFTL((int) ((float) (uly) * 4.0F), 0, 12), \
+
3905 _SHIFTL(mode, 24, 2) | _SHIFTL((int) ((float) (lrx) * 4.0F), 12, 12) | \
+
3906 _SHIFTL((int) ((float) (lry) * 4.0F), 0, 12) \
+
3907 } \
+
3908 }
+
3909
+
3910#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \
+
3911 { \
+
3912 { \
+
3913 _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int) ((ulx)), 12, 12) | _SHIFTL((int) ((uly)), 0, 12), \
+
3914 _SHIFTL(mode, 24, 2) | _SHIFTL((int) (lrx), 12, 12) | _SHIFTL((int) (lry), 0, 12) \
+
3915 } \
+
3916 }
+
3917
+
3918/* Fraction never used in fill */
+
3919#define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \
+
3920 { \
+
3921 Gfx* _g = (Gfx*) (pkt); \
+
3922 \
+
3923 _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 14, 10) | _SHIFTL((lry), 2, 10)); \
+
3924 _g->words.w1 = (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10)); \
+
3925 }
+
3926
+
3927#define gsDPFillRectangle(ulx, uly, lrx, lry) \
+
3928 { \
+
3929 { \
+
3930 (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 14, 10) | _SHIFTL((lry), 2, 10)), \
+
3931 (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10)) \
+
3932 } \
+
3933 }
+
3934
+
3935/* like gDPFillRectangle but accepts negative arguments */
+
3936#define gDPScisFillRectangle(pkt, ulx, uly, lrx, lry) \
+
3937 { \
+
3938 Gfx* _g = (Gfx*) (pkt); \
+
3939 \
+
3940 _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL(MAX((lrx), 0), 14, 10) | _SHIFTL(MAX((lry), 0), 2, 10)); \
+
3941 _g->words.w1 = (_SHIFTL(MAX((ulx), 0), 14, 10) | _SHIFTL(MAX((uly), 0), 2, 10)); \
+
3942 }
+
3943
+
3944#define gDPSetConvert(pkt, k0, k1, k2, k3, k4, k5) \
+
3945 { \
+
3946 Gfx* _g = (Gfx*) (pkt); \
+
3947 \
+
3948 _g->words.w0 = (_SHIFTL(G_SETCONVERT, 24, 8) | _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | _SHIFTR(k2, 5, 4)); \
+
3949 _g->words.w1 = (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | _SHIFTL(k4, 9, 9) | _SHIFTL(k5, 0, 9)); \
+
3950 }
+
3951
+
3952#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \
+
3953 { \
+
3954 { \
+
3955 (_SHIFTL(G_SETCONVERT, 24, 8) | _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | _SHIFTR(k2, 5, 4)), \
+
3956 (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | _SHIFTL(k4, 9, 9) | _SHIFTL(k5, 0, 9)) \
+
3957 } \
+
3958 }
+
3959
+
3960#define gDPSetKeyR(pkt, cR, sR, wR) \
+
3961 { \
+
3962 Gfx* _g = (Gfx*) (pkt); \
+
3963 \
+
3964 _g->words.w0 = _SHIFTL(G_SETKEYR, 24, 8); \
+
3965 _g->words.w1 = (_SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | _SHIFTL(sR, 0, 8)); \
+
3966 }
+
3967
+
3968#define gsDPSetKeyR(cR, sR, wR) \
+
3969 { \
+
3970 { _SHIFTL(G_SETKEYR, 24, 8), _SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | _SHIFTL(sR, 0, 8) } \
+
3971 }
+
3972
+
3973#define gDPSetKeyGB(pkt, cG, sG, wG, cB, sB, wB) \
+
3974 { \
+
3975 Gfx* _g = (Gfx*) (pkt); \
+
3976 \
+
3977 _g->words.w0 = (_SHIFTL(G_SETKEYGB, 24, 8) | _SHIFTL(wG, 12, 12) | _SHIFTL(wB, 0, 12)); \
+
3978 _g->words.w1 = (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | _SHIFTL(cB, 8, 8) | _SHIFTL(sB, 0, 8)); \
+
3979 }
+
3980
+
3981#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \
+
3982 { \
+
3983 { \
+
3984 (_SHIFTL(G_SETKEYGB, 24, 8) | _SHIFTL(wG, 12, 12) | _SHIFTL(wB, 0, 12)), \
+
3985 (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | _SHIFTL(cB, 8, 8) | _SHIFTL(sB, 0, 8)) \
+
3986 } \
+
3987 }
+
3988
+
3989#define gDPNoParam(pkt, cmd) \
+
3990 { \
+
3991 Gfx* _g = (Gfx*) (pkt); \
+
3992 \
+
3993 _g->words.w0 = _SHIFTL(cmd, 24, 8); \
+
3994 _g->words.w1 = 0; \
+
3995 }
+
3996
+
3997#define gsDPNoParam(cmd) \
+
3998 { \
+
3999 { _SHIFTL(cmd, 24, 8), 0 } \
+
4000 }
+
4001
+
4002#define gDPParam(pkt, cmd, param) \
+
4003 { \
+
4004 Gfx* _g = (Gfx*) (pkt); \
+
4005 \
+
4006 _g->words.w0 = _SHIFTL(cmd, 24, 8); \
+
4007 _g->words.w1 = (param); \
+
4008 }
+
4009
+
4010#define gsDPParam(cmd, param) \
+
4011 { \
+
4012 { _SHIFTL(cmd, 24, 8), (param) } \
+
4013 }
+
4014
+
4015/* Notice that textured rectangles are 128-bit commands, therefore
+
4016 * gsDPTextureRectangle() should not be used in display lists
+
4017 * under normal circumstances (use gsSPTextureRectangle()).
+
4018 * That is also why there is no gDPTextureRectangle() macros.
+
4019 */
+
4020#define gsDPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4021 { { \
+
4022 (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
+
4023 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \
+
4024 } }, \
+
4025 { \
+
4026 { _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) } \
+
4027 }
+
4028
+
4029#define gDPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4030 { \
+
4031 Gfx* _g = (Gfx*) (pkt); \
+
4032 if (pkt) \
+
4033 ; \
+
4034 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
+
4035 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
+
4036 _g++; \
+
4037 _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \
+
4038 _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \
+
4039 }
+
4040
+
4041#define gsDPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4042 { { \
+
4043 (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
+
4044 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \
+
4045 } }, \
+
4046 { \
+
4047 { _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) } \
+
4048 }
+
4049
+
4050#define gDPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4051 { \
+
4052 Gfx* _g = (Gfx*) (pkt); \
+
4053 if (pkt) \
+
4054 ; \
+
4055 _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
+
4056 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
+
4057 _g++; \
+
4058 _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \
+
4059 _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \
+
4060 }
+
4061
+
4062#ifdef F3D_OLD
+
4063#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4064 { \
+
4065 Gfx* _g = (Gfx*) (pkt); \
+
4066 \
+
4067 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
+
4068 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
+
4069 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
+
4070 gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
+
4071 }
+
4072
+
4073#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4074 { { (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
+
4075 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \
+
4076 gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
+
4077 gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
+
4078
+
4079/* like gSPTextureRectangle but accepts negative position arguments */
+
4080#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4081 { \
+
4082 Gfx* _g = (Gfx*) (pkt); \
+
4083 \
+
4084 _g->words.w0 = \
+
4085 (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(MAX((s16) (xh), 0), 12, 12) | _SHIFTL(MAX((s16) (yh), 0), 0, 12)); \
+
4086 _g->words.w1 = \
+
4087 (_SHIFTL((tile), 24, 3) | _SHIFTL(MAX((s16) (xl), 0), 12, 12) | _SHIFTL(MAX((s16) (yl), 0), 0, 12)); \
+
4088 gImmp1(pkt, G_RDPHALF_2, \
+
4089 (_SHIFTL(((s) - (((s16) (xl) < 0) ? (((s16) (dsdx) < 0) ? (MAX((((s16) (xl) * (s16) (dsdx)) >> 7), 0)) \
+
4090 : (MIN((((s16) (xl) * (s16) (dsdx)) >> 7), 0))) \
+
4091 : 0)), \
+
4092 16, 16) | \
+
4093 _SHIFTL(((t) - (((yl) < 0) ? (((s16) (dtdy) < 0) ? (MAX((((s16) (yl) * (s16) (dtdy)) >> 7), 0)) \
+
4094 : (MIN((((s16) (yl) * (s16) (dtdy)) >> 7), 0))) \
+
4095 : 0)), \
+
4096 0, 16))); \
+
4097 gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL((dsdx), 16, 16) | _SHIFTL((dtdy), 0, 16))); \
+
4098 }
+
4099
+
4100#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4101 { { (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
+
4102 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \
+
4103 gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
+
4104 gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
+
4105
+
4106#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4107 { \
+
4108 Gfx* _g = (Gfx*) (pkt); \
+
4109 \
+
4110 _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
+
4111 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
+
4112 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
+
4113 gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
+
4114 }
+
4115#else
+
4116#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4117 { \
+
4118 Gfx* _g = (Gfx*) (pkt); \
+
4119 \
+
4120 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
+
4121 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
+
4122 gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
+
4123 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
+
4124 }
+
4125
+
4126#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4127 { { (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
+
4128 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \
+
4129 gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
+
4130 gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
+
4131
+
4132/* like gSPTextureRectangle but accepts negative position arguments */
+
4133#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4134 { \
+
4135 Gfx* _g = (Gfx*) (pkt); \
+
4136 \
+
4137 _g->words.w0 = \
+
4138 (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(MAX((s16) (xh), 0), 12, 12) | _SHIFTL(MAX((s16) (yh), 0), 0, 12)); \
+
4139 _g->words.w1 = \
+
4140 (_SHIFTL((tile), 24, 3) | _SHIFTL(MAX((s16) (xl), 0), 12, 12) | _SHIFTL(MAX((s16) (yl), 0), 0, 12)); \
+
4141 gImmp1(pkt, G_RDPHALF_1, \
+
4142 (_SHIFTL(((s) - (((s16) (xl) < 0) ? (((s16) (dsdx) < 0) ? (MAX((((s16) (xl) * (s16) (dsdx)) >> 7), 0)) \
+
4143 : (MIN((((s16) (xl) * (s16) (dsdx)) >> 7), 0))) \
+
4144 : 0)), \
+
4145 16, 16) | \
+
4146 _SHIFTL(((t) - (((yl) < 0) ? (((s16) (dtdy) < 0) ? (MAX((((s16) (yl) * (s16) (dtdy)) >> 7), 0)) \
+
4147 : (MIN((((s16) (yl) * (s16) (dtdy)) >> 7), 0))) \
+
4148 : 0)), \
+
4149 0, 16))); \
+
4150 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL((dsdx), 16, 16) | _SHIFTL((dtdy), 0, 16))); \
+
4151 }
+
4152
+
4153#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4154 { { (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \
+
4155 (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \
+
4156 gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
+
4157 gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
+
4158
+
4159#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
+
4160 { \
+
4161 Gfx* _g = (Gfx*) (pkt); \
+
4162 \
+
4163 _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \
+
4164 _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \
+
4165 gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
+
4166 gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
+
4167 }
+
4168#endif
+
4169
+
4170#define gsDPWord(wordhi, wordlo) gsImmp1(G_RDPHALF_1, (uintptr_t) (wordhi)), gsImmp1(G_RDPHALF_2, (uintptr_t) (wordlo))
+
4171
+
4172#define gDPWord(pkt, wordhi, wordlo) \
+
4173 { \
+
4174 Gfx* _g = (Gfx*) (pkt); \
+
4175 \
+
4176 gImmp1(pkt, G_RDPHALF_1, (uintptr_t) (wordhi)); \
+
4177 gImmp1(pkt, G_RDPHALF_2, (uintptr_t) (wordlo)); \
+
4178 }
+
4179
+
4180#define gDPFullSync(pkt) gDPNoParam(pkt, G_RDPFULLSYNC)
+
4181#define gsDPFullSync() gsDPNoParam(G_RDPFULLSYNC)
+
4182#define gDPTileSync(pkt) gDPNoParam(pkt, G_RDPTILESYNC)
+
4183#define gsDPTileSync() gsDPNoParam(G_RDPTILESYNC)
+
4184#define gDPPipeSync(pkt) gDPNoParam(pkt, G_RDPPIPESYNC)
+
4185#define gsDPPipeSync() gsDPNoParam(G_RDPPIPESYNC)
+
4186#define gDPLoadSync(pkt) gDPNoParam(pkt, G_RDPLOADSYNC)
+
4187#define gsDPLoadSync() gsDPNoParam(G_RDPLOADSYNC)
+
4188#define gDPNoOp(pkt) gDPNoParam(pkt, G_NOOP)
+
4189#define gsDPNoOp() gsDPNoParam(G_NOOP)
+
4190#define gDPNoOpTag(pkt, tag) gDPParam(pkt, G_NOOP, tag)
+
4191#define gsDPNoOpTag(tag) gsDPParam(G_NOOP, tag)
+
4192
+
4193#endif /* _LANGUAGE_C */
+
4194
+
4195#endif /* _GBI_H_ */
ultratypes.h
s32
signed int s32
Definition ultratypes.h:15
diff --git a/globals.html b/globals.html index 8dbb7376f..061facd06 100644 --- a/globals.html +++ b/globals.html @@ -133,7 +133,7 @@ $(function(){initNavTree('globals.html',''); initResizable(true); });
  • __osClearPage() : osPfsAllocateFile.c
  • __osContAddressCrc() : controller.h, crc.c
  • __osContDataCrc() : controller.h, crc.c
  • -
  • __osContGetInitData() : controller.h, osContInit.c
  • +
  • __osContGetInitData() : controller.h, osContInit.c
  • __osContLastCmd : controller.h, osContInit.c, osContStartReadData.c, osEepromWrite.c
  • __osContPifRam : controller.h, osContInit.c
  • __osContRamRead() : contramread.c, controller.h
  • @@ -175,7 +175,7 @@ $(function(){initNavTree('globals.html',''); initResizable(true); });
  • __osPackRamReadData() : contramread.c
  • __osPackRamWriteData() : contramwrite.c
  • __osPackReadData() : osContStartReadData.c
  • -
  • __osPackRequestData() : controller.h, osContInit.c
  • +
  • __osPackRequestData() : controller.h, osContInit.c
  • __osPfsDeclearPage() : controller.h, osPfsAllocateFile.c
  • __osPfsGetInitData() : controller.h, osPfsIsPlug.c
  • __osPfsGetNextPage() : osPfsReadWriteFile.c
  • diff --git a/globals_func.html b/globals_func.html index 7de87f89b..69dd8e5b3 100644 --- a/globals_func.html +++ b/globals_func.html @@ -129,7 +129,7 @@ $(function(){initNavTree('globals_func.html',''); initResizable(true); });
  • __osClearPage() : osPfsAllocateFile.c
  • __osContAddressCrc() : controller.h, crc.c
  • __osContDataCrc() : controller.h, crc.c
  • -
  • __osContGetInitData() : controller.h, osContInit.c
  • +
  • __osContGetInitData() : controller.h, osContInit.c
  • __osContRamRead() : contramread.c, controller.h
  • __osContRamWrite() : contramwrite.c, controller.h
  • __osDequeueThread() : __osDequeueThread.c, libultra_internal.h, osint.h
  • @@ -156,7 +156,7 @@ $(function(){initNavTree('globals_func.html',''); initResizable(true); });
  • __osPackRamReadData() : contramread.c
  • __osPackRamWriteData() : contramwrite.c
  • __osPackReadData() : osContStartReadData.c
  • -
  • __osPackRequestData() : controller.h, osContInit.c
  • +
  • __osPackRequestData() : controller.h, osContInit.c
  • __osPfsDeclearPage() : controller.h, osPfsAllocateFile.c
  • __osPfsGetInitData() : controller.h, osPfsIsPlug.c
  • __osPfsGetNextPage() : osPfsReadWriteFile.c
  • diff --git a/kalimari__desert_2course__offsets_8c.html b/kalimari__desert_2course__offsets_8c.html index 9fbda0a21..5844bd999 100644 --- a/kalimari__desert_2course__offsets_8c.html +++ b/kalimari__desert_2course__offsets_8c.html @@ -872,8 +872,8 @@ Variables
    { gTextureRailroadTrack, 0x0B5B, 0x1000, 0x0 }, { gTextureRailroadCrossingTrack, 0x0208, 0x1000, 0x0 },
    { gTexture67291C, 0x059C, 0x0800, 0x0 }, { gTextureFenceBarbedWire, 0x021E, 0x1000, 0x0 },
    { gTexture67D304, 0x091C, 0x1000, 0x0 }, { gTexture67E010, 0x0415, 0x0800, 0x0 },
    -
    { gTexture67EEAC, 0x0140, 0x0800, 0x0 }, { gTextureSignShellShot0, 0x038C, 0x1000, 0x0 },
    -
    { gTextureSignShellShot1, 0x0247, 0x1000, 0x0 }, { gTextureSignKoopaAir0, 0x0360, 0x1000, 0x0 },
    +
    { gTexture67EEAC, 0x0140, 0x0800, 0x0 }, { gTextureSignShellShot0, 0x038C, 0x1000, 0x0 },
    +
    { gTextureSignShellShot1, 0x0247, 0x1000, 0x0 }, { gTextureSignKoopaAir0, 0x0360, 0x1000, 0x0 },
    { gTextureSignKoopaAir1, 0x0304, 0x1000, 0x0 }, { 0x00000000, 0x0000, 0x0000, 0x0 },
    }
    gTexture67490C
    u8 gTexture67490C[]
    @@ -889,9 +889,7 @@ Variables
    gTextureRailroadCrossingTrack
    u8 gTextureRailroadCrossingTrack[]
    gTextureSignKoopaAir0
    u8 gTextureSignKoopaAir0[]
    gTexture6473E4
    u8 gTexture6473E4[]
    -
    gTextureSignShellShot1
    u8 gTextureSignShellShot1[]
    gTexture67D304
    u8 gTexture67D304[]
    -
    gTextureSignShellShot0
    u8 gTextureSignShellShot0[]
    gTextureSignMarioStar0
    u8 gTextureSignMarioStar0[]
    gTexture668920
    u8 gTexture668920[]
    gTexture67291C
    u8 gTexture67291C[]
    @@ -901,6 +899,8 @@ Variables
    gTexture647994
    u8 gTexture647994[]
    gTextureFenceBarbedWire
    u8 gTextureFenceBarbedWire[]
    gTextureSignMarioStar1
    u8 gTextureSignMarioStar1[]
    +
    gTextureSignShellShot1
    u8 gTextureSignShellShot1[]
    +
    gTextureSignShellShot0
    u8 gTextureSignShellShot0[]
    diff --git a/libultra__internal_8h_source.html b/libultra__internal_8h_source.html index 91cc23276..181514ade 100644 --- a/libultra__internal_8h_source.html +++ b/libultra__internal_8h_source.html @@ -122,91 +122,90 @@ $(function(){initNavTree('libultra__internal_8h_source.html',''); initResizable(
    11
    -
    12extern struct __osThreadTail
    -
    13{
    -
    14 OSThread *next;
    -
    15 OSPri priority;
    -
    16} __osThreadTail;
    +
    12extern struct __osThreadTail {
    +
    13 OSThread* next;
    +
    14 OSPri priority;
    +
    15} __osThreadTail;
    -
    17
    -
    18/*
    -
    19 * This define is needed because the original definitions in __osDequeueThread.c are declared
    -
    20 * seperately instead of part of a single struct, however some code alises over this memory
    -
    21 * assuming a unified structure. To fix this, we declare the full type here and then alias the
    -
    22 * symbol names to the correct members in AVOID_UB.
    -
    23 */
    -
    -
    24typedef struct {
    -
    25 /*0x00*/ struct OSThread_s* next;
    -
    26 /*0x04*/ OSPri priority;
    -
    27 /*0x08*/ struct OSThread_s* queue;
    -
    28 /*0x0C*/ struct OSThread_s* tlnext;
    -
    29 /*0x10*/ struct OSThread_s* unk10;
    -
    30 /*0x14*/ u32 unk14;
    -
    31} OSThread_ListHead;
    +
    16
    +
    17/*
    +
    18 * This define is needed because the original definitions in __osDequeueThread.c are declared
    +
    19 * seperately instead of part of a single struct, however some code alises over this memory
    +
    20 * assuming a unified structure. To fix this, we declare the full type here and then alias the
    +
    21 * symbol names to the correct members in AVOID_UB.
    +
    22 */
    +
    +
    23typedef struct {
    +
    24 /*0x00*/ struct OSThread_s* next;
    +
    25 /*0x04*/ OSPri priority;
    +
    26 /*0x08*/ struct OSThread_s* queue;
    +
    27 /*0x0C*/ struct OSThread_s* tlnext;
    +
    28 /*0x10*/ struct OSThread_s* unk10;
    +
    29 /*0x14*/ u32 unk14;
    +
    -
    32
    -
    33// Original OSThread_ListHead definitions
    -
    34extern OSThread *__osRunningThread;
    -
    35extern OSThread *__osActiveQueue;
    -
    36extern OSThread *__osFaultedThread;
    -
    37extern OSThread *__osRunQueue;
    -
    38
    -
    39// Original EEPROM definitions
    -
    40extern u32 D_80365E00[15];
    -
    41extern u32 D_80365E3C;
    -
    42
    -
    -
    43typedef struct {
    -
    44 u32 initialized; // probably something like initialized?
    - -
    46 OSMesgQueue* cmdQueue;
    -
    47 OSMesgQueue* eventQueue;
    -
    48 OSMesgQueue* accessQueue;
    -
    49 s32 (*dma_func)(s32, u32, void*, size_t);
    -
    50 s32 (*edma_func)(OSPiHandle*, s32, u32, void*, size_t);
    -
    51} OSMgrArgs;
    +
    31
    +
    32// Original OSThread_ListHead definitions
    + + + + +
    37
    +
    38// Original EEPROM definitions
    +
    39extern u32 D_80365E00[15];
    +
    40extern u32 D_80365E3C;
    +
    41
    +
    +
    42typedef struct {
    +
    43 u32 initialized; // probably something like initialized?
    + +
    45 OSMesgQueue* cmdQueue;
    +
    46 OSMesgQueue* eventQueue;
    +
    47 OSMesgQueue* accessQueue;
    +
    48 s32 (*dma_func)(s32, u32, void*, size_t);
    +
    49 s32 (*edma_func)(OSPiHandle*, s32, u32, void*, size_t);
    +
    50} OSMgrArgs;
    -
    52
    - - - - - - - - -
    61void __osSiGetAccess(void);
    -
    62void __osSiRelAccess(void);
    - - -
    65void __osPiGetAccess(void);
    - - - -
    69s32 __osSiRawReadIo(void*, u32*);
    - -
    71s32 osPiRawReadIo(u32 a0, u32* a1);
    - - -
    74s32 __osSpSetPc(void*);
    - - -
    77s32 __osSpRawStartDma(u32 dir, void* sp_ptr, void* dram_ptr, size_t size);
    -
    78void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void));
    - -
    80void __osViInit(void);
    - - -
    83void __osViSwapContext(void);
    - - - - - - - -
    91#endif
    +
    51
    + + + + + + + + +
    60void __osSiGetAccess(void);
    +
    61void __osSiRelAccess(void);
    + + +
    64void __osPiGetAccess(void);
    + + + +
    68s32 __osSiRawReadIo(void*, u32*);
    + +
    70s32 osPiRawReadIo(u32 a0, u32* a1);
    + + +
    73s32 __osSpSetPc(void*);
    + + +
    76s32 __osSpRawStartDma(u32 dir, void* sp_ptr, void* dram_ptr, size_t size);
    +
    77void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void));
    + +
    79void __osViInit(void);
    + + +
    82void __osViSwapContext(void);
    + + + + + + + +
    90#endif
    s32 __osSiRawWriteIo(void *, u32)
    Definition __osSiRawWriteIo.c:4
    s32 __osSpSetPc(void *)
    Definition __osSpSetPc.c:4
    s32 __osSpDeviceBusy(void)
    Definition __osSpDeviceBusy.c:4
    @@ -257,29 +256,29 @@ $(function(){initNavTree('libultra__internal_8h_source.html',''); initResizable(
    s32 OSPri
    Definition os_thread.h:21
    -
    Definition libultra_internal.h:43
    -
    OSMesgQueue * eventQueue
    Definition libultra_internal.h:47
    -
    OSMesgQueue * accessQueue
    Definition libultra_internal.h:48
    -
    u32 initialized
    Definition libultra_internal.h:44
    -
    OSMesgQueue * cmdQueue
    Definition libultra_internal.h:46
    -
    OSThread * mgrThread
    Definition libultra_internal.h:45
    +
    Definition libultra_internal.h:42
    +
    OSMesgQueue * eventQueue
    Definition libultra_internal.h:46
    +
    OSMesgQueue * accessQueue
    Definition libultra_internal.h:47
    +
    u32 initialized
    Definition libultra_internal.h:43
    +
    OSMesgQueue * cmdQueue
    Definition libultra_internal.h:45
    +
    OSThread * mgrThread
    Definition libultra_internal.h:44
    Definition os_pi.h:28
    -
    Definition libultra_internal.h:24
    -
    OSPri priority
    Definition libultra_internal.h:26
    -
    struct OSThread_s * next
    Definition libultra_internal.h:25
    -
    struct OSThread_s * queue
    Definition libultra_internal.h:27
    -
    u32 unk14
    Definition libultra_internal.h:30
    -
    struct OSThread_s * unk10
    Definition libultra_internal.h:29
    -
    struct OSThread_s * tlnext
    Definition libultra_internal.h:28
    +
    Definition libultra_internal.h:23
    +
    OSPri priority
    Definition libultra_internal.h:25
    +
    struct OSThread_s * next
    Definition libultra_internal.h:24
    +
    struct OSThread_s * queue
    Definition libultra_internal.h:26
    +
    u32 unk14
    Definition libultra_internal.h:29
    +
    struct OSThread_s * unk10
    Definition libultra_internal.h:28
    +
    struct OSThread_s * tlnext
    Definition libultra_internal.h:27
    Definition os_thread.h:50
    Definition os_time.h:9
    Definition os_vi.h:54
    Definition libultra_internal.h:7
    OSMesg message
    Definition libultra_internal.h:9
    OSMesgQueue * messageQueue
    Definition libultra_internal.h:8
    -
    Definition libultra_internal.h:13
    -
    OSThread * next
    Definition libultra_internal.h:14
    -
    OSPri priority
    Definition libultra_internal.h:15
    +
    Definition libultra_internal.h:12
    +
    OSThread * next
    Definition libultra_internal.h:13
    +
    OSPri priority
    Definition libultra_internal.h:14
    signed int s32
    Definition ultratypes.h:15
    unsigned int u32
    Definition ultratypes.h:16
    diff --git a/navtreedata.js b/navtreedata.js index cc4b01c8b..71f098884 100644 --- a/navtreedata.js +++ b/navtreedata.js @@ -88,7 +88,7 @@ var NAVTREEINDEX = "code__80091750_8h.html#ab308cffd7811f17cbb18b768c0e94dc7", "collision_8c.html#a6275a3a99f8faf62b7c64d9aeca44c48", "common__data_8h.html#a912a454178136f29dbc711478df15509", -"controller_8h.html#a707a0c5b519ec9984d2c52ccdd93266a", +"controller_8h.html#a76143c1f81ddeb59c526d145fb024528", "crash__screen__enhancement_8c.html#a2ad22896ced78c6e1f61b251dedd729f", "data__segment2_8h.html#a4b18264964c22e6de41576f82e9992cc", "defines_8h.html#ae9e9974737d16f8449f0fe7e68c8e7a4", diff --git a/navtreeindex28.js b/navtreeindex28.js index 06f5a0ada..b6dc2a809 100644 --- a/navtreeindex28.js +++ b/navtreeindex28.js @@ -224,7 +224,6 @@ var NAVTREEINDEX28 = "controller_8h.html":[8,0,3,6,35], "controller_8h.html#a0a241eefe53675f2e6ffa9907dfdeb78":[8,0,3,6,35,25], "controller_8h.html#a0b48b5daa3f9a82a8da6c0254b7358d6":[8,0,3,6,35,32], -"controller_8h.html#a0c521ee50049b1ceb34042ba602a6dce":[8,0,3,6,35,56], "controller_8h.html#a0f7db56e72f44b8a2e596b0e8a702866":[8,0,3,6,35,55], "controller_8h.html#a0fcf2770e70d045d1ef22018dfb38554":[8,0,3,6,35,72], "controller_8h.html#a10eefb0787dcb8416ab56b25091f88d7":[8,0,3,6,35,28], @@ -235,7 +234,6 @@ var NAVTREEINDEX28 = "controller_8h.html#a1dce4f2c46e2cdcd84246594d732fde1":[8,0,3,6,35,22], "controller_8h.html#a2f584f1ec5ed1db902e48e0186e99b6a":[8,0,3,6,35,43], "controller_8h.html#a3b164e153d4a92a789c16a6756290d27":[8,0,3,6,35,12], -"controller_8h.html#a3d74e172e33f530214ca936729a10003":[8,0,3,6,35,50], "controller_8h.html#a3da2a6d11716fef869b6be888c9b7263":[8,0,3,6,35,49], "controller_8h.html#a45d69c5d976e294536148ce4708f28b0":[8,0,3,6,35,19], "controller_8h.html#a4896a625ad888852615bb2f10831aeb7":[8,0,3,6,35,59], @@ -245,9 +243,11 @@ var NAVTREEINDEX28 = "controller_8h.html#a4d3a940f5086a0a1745a1b9b8d24db7c":[8,0,3,6,35,14], "controller_8h.html#a594f9ee5edd6c2fb8070576da1fd06e0":[8,0,3,6,35,51], "controller_8h.html#a5ab8a1ce418d27ff12d648c447c8ab6e":[8,0,3,6,35,48], +"controller_8h.html#a5f809ab121e597f82f55d34864ece3be":[8,0,3,6,35,50], "controller_8h.html#a6175b000bbc98be2eb4c7a0fa88a7d67":[8,0,3,6,35,20], "controller_8h.html#a6a29baafac3d81292d61350fd90d47ab":[8,0,3,6,35,67], "controller_8h.html#a6a7c28e8bd0f4ea50dafa1c753b82c41":[8,0,3,6,35,29], "controller_8h.html#a6f349b6f2326d6ef6a09d02efa68a453":[8,0,3,6,35,41], -"controller_8h.html#a6f9aa96297587acff77c92d10dd1811e":[8,0,3,6,35,69] +"controller_8h.html#a6f9aa96297587acff77c92d10dd1811e":[8,0,3,6,35,69], +"controller_8h.html#a707a0c5b519ec9984d2c52ccdd93266a":[8,0,3,6,35,21] }; diff --git a/navtreeindex29.js b/navtreeindex29.js index e877e985e..c3306187b 100644 --- a/navtreeindex29.js +++ b/navtreeindex29.js @@ -1,9 +1,9 @@ var NAVTREEINDEX29 = { -"controller_8h.html#a707a0c5b519ec9984d2c52ccdd93266a":[8,0,3,6,35,21], "controller_8h.html#a76143c1f81ddeb59c526d145fb024528":[8,0,3,6,35,65], "controller_8h.html#a7af3386c33a9ddcc3f333a3dae14fd5c":[8,0,3,6,35,33], "controller_8h.html#a7d141b849d6af215afe340b1014177ec":[8,0,3,6,35,35], +"controller_8h.html#a84898251e87ca68eef2914979815bd4c":[8,0,3,6,35,56], "controller_8h.html#a87a295c21c7e7bbe70a8e93722214a9f":[8,0,3,6,35,42], "controller_8h.html#a8907f8efb366e080f79a7c02dd71b2d8":[8,0,3,6,35,46], "controller_8h.html#a8998d13a95bfba3569a75c9bad69b55e":[8,0,3,6,35,15], diff --git a/osPiRawStartDma_8c.html b/osPiRawStartDma_8c.html index 70f2039ec..d9692b656 100644 --- a/osPiRawStartDma_8c.html +++ b/osPiRawStartDma_8c.html @@ -191,7 +191,7 @@ Here is the caller graph for this function:
    -
    Todo
    figure out why this is like this
    +
    Todo
    figure out why this is like this
    diff --git a/osPiStartDma_8c.html b/osPiStartDma_8c.html index c67cabd1e..9f3d336d3 100644 --- a/osPiStartDma_8c.html +++ b/osPiStartDma_8c.html @@ -172,7 +172,7 @@ Variables
    -
    Todo
    name magic constants
    +
    Todo
    name magic constants
    Here is the call graph for this function:
    diff --git a/osViBlack_8c.html b/osViBlack_8c.html index c581bdb45..9a75323a8 100644 --- a/osViBlack_8c.html +++ b/osViBlack_8c.html @@ -143,7 +143,7 @@ Variables
    -
    Todo
    name magic constants
    +
    Todo
    name magic constants
    Here is the call graph for this function:
    diff --git a/os__pi_8h.html b/os__pi_8h.html index 7aeb528dd..4823c0e2a 100644 --- a/os__pi_8h.html +++ b/os__pi_8h.html @@ -446,7 +446,7 @@ Here is the caller graph for this function:
    -
    Todo
    name magic constants
    +
    Todo
    name magic constants
    Here is the call graph for this function:
    diff --git a/os__vi_8h.html b/os__vi_8h.html index 2e637f7f8..0b7bbf9d5 100644 --- a/os__vi_8h.html +++ b/os__vi_8h.html @@ -877,7 +877,7 @@ Here is the caller graph for this function:
    -
    Todo
    name magic constants
    +
    Todo
    name magic constants
    Here is the call graph for this function:
    diff --git a/podium__ceremony__actors_8c.html b/podium__ceremony__actors_8c.html index 8b35972d9..ceebff01c 100644 --- a/podium__ceremony__actors_8c.html +++ b/podium__ceremony__actors_8c.html @@ -600,7 +600,7 @@ Here is the caller graph for this function:
    Bug
    No null check.
    Bug
    -
    Todo
    More indepth error checking/return value
    +
    Todo
    More indepth error checking/return value
    Here is the call graph for this function:
    diff --git a/podium__ceremony__actors_8h.html b/podium__ceremony__actors_8h.html index 28d393c29..02250ad51 100644 --- a/podium__ceremony__actors_8h.html +++ b/podium__ceremony__actors_8h.html @@ -560,7 +560,7 @@ Here is the caller graph for this function:
    Bug
    No null check.
    Bug
    -
    Todo
    More indepth error checking/return value
    +
    Todo
    More indepth error checking/return value
    Here is the call graph for this function:
    diff --git a/render__courses_8c.html b/render__courses_8c.html index 9b6a19afa..5e891ed7d 100644 --- a/render__courses_8c.html +++ b/render__courses_8c.html @@ -735,7 +735,7 @@ Here is the caller graph for this function:
    -
    Todo
    Should be Gfx*
    +
    Todo
    Should be Gfx*
    Here is the call graph for this function:
    diff --git a/render__courses_8h.html b/render__courses_8h.html index e9f82daed..cdeeb9327 100644 --- a/render__courses_8h.html +++ b/render__courses_8h.html @@ -703,7 +703,7 @@ Here is the caller graph for this function:
    -
    Todo
    Should be Gfx*
    +
    Todo
    Should be Gfx*
    Here is the call graph for this function:
    diff --git a/render__objects_8c.html b/render__objects_8c.html index 8b3178540..0000c27f2 100644 --- a/render__objects_8c.html +++ b/render__objects_8c.html @@ -2824,7 +2824,7 @@ Here is the caller graph for this function:
    -
    Todo
    tlut/texture unconfirmed. This could be texture1 and texture2
    +
    Todo
    tlut/texture unconfirmed. This could be texture1 and texture2
    Here is the call graph for this function:
    diff --git a/search/all_2.js b/search/all_2.js index fedb390f0..a6ab9fac2 100644 --- a/search/all_2.js +++ b/search/all_2.js @@ -29,7 +29,7 @@ var searchData= ['_5f_5foscontaddresscrc_26',['__osContAddressCrc',['../controller_8h.html#a5ab8a1ce418d27ff12d648c447c8ab6e',1,'__osContAddressCrc(u16 addr): crc.c'],['../crc_8c.html#a5ab8a1ce418d27ff12d648c447c8ab6e',1,'__osContAddressCrc(u16 addr): crc.c']]], ['_5f_5foscontdatacrc_27',['__osContDataCrc',['../controller_8h.html#a3da2a6d11716fef869b6be888c9b7263',1,'__osContDataCrc(u8 *data): crc.c'],['../crc_8c.html#a3da2a6d11716fef869b6be888c9b7263',1,'__osContDataCrc(u8 *data): crc.c']]], ['_5f_5fosconteepromformat_28',['__OSContEepromFormat',['../struct____OSContEepromFormat.html',1,'']]], - ['_5f_5foscontgetinitdata_29',['__osContGetInitData',['../controller_8h.html#a3d74e172e33f530214ca936729a10003',1,'__osContGetInitData(u8 *pattern, OSContStatus *data): osContInit.c'],['../osContInit_8c.html#a34ffd58f66926d051133423c73aba4bf',1,'__osContGetInitData(u8 *, OSContStatus *): osContInit.c']]], + ['_5f_5foscontgetinitdata_29',['__osContGetInitData',['../controller_8h.html#a5f809ab121e597f82f55d34864ece3be',1,'__osContGetInitData(u8 *bitpattern, OSContStatus *status): osContInit.c'],['../osContInit_8c.html#a34ffd58f66926d051133423c73aba4bf',1,'__osContGetInitData(u8 *, OSContStatus *): osContInit.c']]], ['_5f_5foscontlastcmd_30',['__osContLastCmd',['../controller_8h.html#adf9e03963d9e26809b0ce77d37dc444c',1,'__osContLastCmd: osContInit.c'],['../osContInit_8c.html#adf9e03963d9e26809b0ce77d37dc444c',1,'__osContLastCmd: osContInit.c'],['../osContStartReadData_8c.html#adf9e03963d9e26809b0ce77d37dc444c',1,'__osContLastCmd: osContInit.c'],['../osEepromWrite_8c.html#adf9e03963d9e26809b0ce77d37dc444c',1,'__osContLastCmd: osContInit.c']]], ['_5f_5foscontpifram_31',['__osContPifRam',['../controller_8h.html#a6a29baafac3d81292d61350fd90d47ab',1,'__osContPifRam: osContInit.c'],['../osContInit_8c.html#ac483554fa1ef4be2c9c23f858d1f3dd5',1,'__osContPifRam: osContInit.c']]], ['_5f_5foscontramread_32',['__osContRamRead',['../contramread_8c.html#a594f9ee5edd6c2fb8070576da1fd06e0',1,'__osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer): contramread.c'],['../controller_8h.html#a594f9ee5edd6c2fb8070576da1fd06e0',1,'__osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer): contramread.c']]], @@ -87,7 +87,7 @@ var searchData= ['_5f_5fospackramreaddata_84',['__osPackRamReadData',['../contramread_8c.html#acf36d11e540d86585205f35bb0253390',1,'contramread.c']]], ['_5f_5fospackramwritedata_85',['__osPackRamWriteData',['../contramwrite_8c.html#a5a8e6638b28caf3b5faba67df76d099c',1,'contramwrite.c']]], ['_5f_5fospackreaddata_86',['__osPackReadData',['../osContStartReadData_8c.html#a639fc619f4a66f6b0ca9fcb1d82ff3fe',1,'osContStartReadData.c']]], - ['_5f_5fospackrequestdata_87',['__osPackRequestData',['../controller_8h.html#a0c521ee50049b1ceb34042ba602a6dce',1,'__osPackRequestData(u8 cmd): osContInit.c'],['../osContInit_8c.html#a11f4c49e60a913e2e35ab507e250d486',1,'__osPackRequestData(u8): osContInit.c']]], + ['_5f_5fospackrequestdata_87',['__osPackRequestData',['../controller_8h.html#a84898251e87ca68eef2914979815bd4c',1,'__osPackRequestData(u8 command): osContInit.c'],['../osContInit_8c.html#a11f4c49e60a913e2e35ab507e250d486',1,'__osPackRequestData(u8): osContInit.c']]], ['_5f_5fospfsdeclearpage_88',['__osPfsDeclearPage',['../controller_8h.html#a12a746a3baa07de1c6d2791949388a4c',1,'__osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page): osPfsAllocateFile.c'],['../osPfsAllocateFile_8c.html#a12a746a3baa07de1c6d2791949388a4c',1,'__osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page): osPfsAllocateFile.c']]], ['_5f_5fospfsgetinitdata_89',['__osPfsGetInitData',['../controller_8h.html#ab19dc53e7991a55743de1b757bec850e',1,'__osPfsGetInitData(u8 *pattern, OSContStatus *data): osPfsIsPlug.c'],['../osPfsIsPlug_8c.html#ab19dc53e7991a55743de1b757bec850e',1,'__osPfsGetInitData(u8 *pattern, OSContStatus *data): osPfsIsPlug.c']]], ['_5f_5fospfsgetnextpage_90',['__osPfsGetNextPage',['../osPfsReadWriteFile_8c.html#a889f5ea341599912d8277b1af103d2f8',1,'osPfsReadWriteFile.c']]], diff --git a/search/functions_0.js b/search/functions_0.js index 23319f303..f3011b8df 100644 --- a/search/functions_0.js +++ b/search/functions_0.js @@ -21,7 +21,7 @@ var searchData= ['_5f_5fosclearpage_18',['__osClearPage',['../osPfsAllocateFile_8c.html#aa35c1d7fc54662fbe18f3e9c8e75d3ab',1,'osPfsAllocateFile.c']]], ['_5f_5foscontaddresscrc_19',['__osContAddressCrc',['../controller_8h.html#a5ab8a1ce418d27ff12d648c447c8ab6e',1,'__osContAddressCrc(u16 addr): crc.c'],['../crc_8c.html#a5ab8a1ce418d27ff12d648c447c8ab6e',1,'__osContAddressCrc(u16 addr): crc.c']]], ['_5f_5foscontdatacrc_20',['__osContDataCrc',['../controller_8h.html#a3da2a6d11716fef869b6be888c9b7263',1,'__osContDataCrc(u8 *data): crc.c'],['../crc_8c.html#a3da2a6d11716fef869b6be888c9b7263',1,'__osContDataCrc(u8 *data): crc.c']]], - ['_5f_5foscontgetinitdata_21',['__osContGetInitData',['../controller_8h.html#a3d74e172e33f530214ca936729a10003',1,'__osContGetInitData(u8 *pattern, OSContStatus *data): osContInit.c'],['../osContInit_8c.html#a34ffd58f66926d051133423c73aba4bf',1,'__osContGetInitData(u8 *, OSContStatus *): osContInit.c']]], + ['_5f_5foscontgetinitdata_21',['__osContGetInitData',['../controller_8h.html#a5f809ab121e597f82f55d34864ece3be',1,'__osContGetInitData(u8 *bitpattern, OSContStatus *status): osContInit.c'],['../osContInit_8c.html#a34ffd58f66926d051133423c73aba4bf',1,'__osContGetInitData(u8 *, OSContStatus *): osContInit.c']]], ['_5f_5foscontramread_22',['__osContRamRead',['../contramread_8c.html#a594f9ee5edd6c2fb8070576da1fd06e0',1,'__osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer): contramread.c'],['../controller_8h.html#a594f9ee5edd6c2fb8070576da1fd06e0',1,'__osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer): contramread.c']]], ['_5f_5foscontramwrite_23',['__osContRamWrite',['../contramwrite_8c.html#ac0f1bb81601cedc5fc5868fc7e500b88',1,'__osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int force): contramwrite.c'],['../controller_8h.html#ac0f1bb81601cedc5fc5868fc7e500b88',1,'__osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int force): contramwrite.c']]], ['_5f_5fosdequeuethread_24',['__osDequeueThread',['../____osDequeueThread_8c.html#af6af51a5106e336f3f97203211ea2763',1,'__osDequeueThread(register OSThread **queue, register OSThread *t): __osDequeueThread.c'],['../libultra__internal_8h.html#a836d4fff66c3d0cf5eec17c4579df564',1,'__osDequeueThread(OSThread **, OSThread *): libultra_internal.h'],['../osint_8h.html#a836d4fff66c3d0cf5eec17c4579df564',1,'__osDequeueThread(OSThread **, OSThread *): osint.h']]], @@ -48,7 +48,7 @@ var searchData= ['_5f_5fospackramreaddata_45',['__osPackRamReadData',['../contramread_8c.html#acf36d11e540d86585205f35bb0253390',1,'contramread.c']]], ['_5f_5fospackramwritedata_46',['__osPackRamWriteData',['../contramwrite_8c.html#a5a8e6638b28caf3b5faba67df76d099c',1,'contramwrite.c']]], ['_5f_5fospackreaddata_47',['__osPackReadData',['../osContStartReadData_8c.html#a639fc619f4a66f6b0ca9fcb1d82ff3fe',1,'osContStartReadData.c']]], - ['_5f_5fospackrequestdata_48',['__osPackRequestData',['../controller_8h.html#a0c521ee50049b1ceb34042ba602a6dce',1,'__osPackRequestData(u8 cmd): osContInit.c'],['../osContInit_8c.html#a11f4c49e60a913e2e35ab507e250d486',1,'__osPackRequestData(u8): osContInit.c']]], + ['_5f_5fospackrequestdata_48',['__osPackRequestData',['../controller_8h.html#a84898251e87ca68eef2914979815bd4c',1,'__osPackRequestData(u8 command): osContInit.c'],['../osContInit_8c.html#a11f4c49e60a913e2e35ab507e250d486',1,'__osPackRequestData(u8): osContInit.c']]], ['_5f_5fospfsdeclearpage_49',['__osPfsDeclearPage',['../controller_8h.html#a12a746a3baa07de1c6d2791949388a4c',1,'__osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page): osPfsAllocateFile.c'],['../osPfsAllocateFile_8c.html#a12a746a3baa07de1c6d2791949388a4c',1,'__osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page): osPfsAllocateFile.c']]], ['_5f_5fospfsgetinitdata_50',['__osPfsGetInitData',['../controller_8h.html#ab19dc53e7991a55743de1b757bec850e',1,'__osPfsGetInitData(u8 *pattern, OSContStatus *data): osPfsIsPlug.c'],['../osPfsIsPlug_8c.html#ab19dc53e7991a55743de1b757bec850e',1,'__osPfsGetInitData(u8 *pattern, OSContStatus *data): osPfsIsPlug.c']]], ['_5f_5fospfsgetnextpage_51',['__osPfsGetNextPage',['../osPfsReadWriteFile_8c.html#a889f5ea341599912d8277b1af103d2f8',1,'osPfsReadWriteFile.c']]], diff --git a/sptask_8h.html b/sptask_8h.html index deddf7e6d..70355f48f 100644 --- a/sptask_8h.html +++ b/sptask_8h.html @@ -241,7 +241,7 @@ Macros
    -
    Todo
    These defines shouldn't exist - PR/rcp.h has them properly defined (ultralib)
    +
    Todo
    These defines shouldn't exist - PR/rcp.h has them properly defined (ultralib)
    diff --git a/todo.html b/todo.html index 104d34812..d36aa368b 100644 --- a/todo.html +++ b/todo.html @@ -134,7 +134,7 @@ $(function(){initNavTree('todo.html',''); initResizable(true); });
    Global D_800E43B0 []
    unused?
    Global D_8018D9B0
    -
    Move gGfxPool out of main.h
    +
    Move gGfxPool out of main.h
    Global d_course_banshee_boardwalk_dl_0 []
    Replace addresses with variables
    Global d_course_big_donut_dl []
    @@ -168,7 +168,7 @@ $(function(){initNavTree('todo.html',''); initResizable(true); });
    Global d_course_yoshi_valley_dl_0 []
    Replace addresses with variables
    Global debug_switch_character_ceremony_cutscene (void)
    -
    confirm this.
    +
    confirm this.
    Union du

    is it possible to remove them somehow?

    is it possible to remove them somehow?

    @@ -182,7 +182,7 @@ $(function(){initNavTree('todo.html',''); initResizable(true); });
    Global func_80028864 (Player *, Camera *, s8, s8)
    make a proper match
    Global func_80046030 (u8 *tlut, u8 *texture, Vtx *arg2, s32 width, s32 arg4, s32 height)
    -
    tlut/texture unconfirmed. This could be texture1 and texture2
    +
    tlut/texture unconfirmed. This could be texture1 and texture2
    Global func_8004B7DC (s32 x, s32 y, s32 width, s32 height, s32 arg4, s32 arg5, s32 arg6)
    Update to F3DEX. Uses OLD definition for gspTextureRectangle.
    Global func_8004C268 (u32 arg0, u32 arg1, u8 *texture, u32 width, u32 arg4, u32 height, s32 arg6)
    @@ -190,19 +190,19 @@ $(function(){initNavTree('todo.html',''); initResizable(true); });
    Global func_800745C8 (s32 objectIndex, uintptr_t arg1)
    arg1 should likely be a u8 *
    Global func_80091FA4 (void)
    -
    These sizes need to be sizeof() for shiftability if possible
    +
    These sizes need to be sizeof() for shiftability if possible
    Global func_800CBC24 (void)
    clenanup, something's weird with the variables. D_800EA4A4 is probably EuAudioCmd bc of the + 0x100
    Global func_80282D90 (struct CinematicCamera *, struct struct_80286A04 *, struct struct_80286A04 *, s32)
    -
    Cast to normal Camera? Or from CinematicCamera?
    +
    Cast to normal Camera? Or from CinematicCamera?
    Global func_8028336C (UNUSED struct CinematicCamera *arg0, UNUSED Camera *camera)
    -
    Does this match as a return of s8?
    +
    Does this match as a return of s8?
    Global func_802846E4 (struct CinematicCamera *)
    -
    What does this even do?
    +
    What does this even do?
    Global func_8028F970 (void)
    increasing players past four would require increase this loop iterator.
    Global gen_random_item (s16 rank, s16 isCpu)
    -
    Cleanup this function to use array access and struct if possible.
    +
    Cleanup this function to use array access and struct if possible.
    Global gPlayerWinningIndex
    gPlayerWinningIndex (D_800DC5E8) accessed as word, D_800DC5EB as u8
    Global gTorchSpawns []
    @@ -216,13 +216,13 @@ $(function(){initNavTree('todo.html',''); initResizable(true); });
    Global LEO_CMD_TYPE_2
    name
    Global M_TASK_FLAG0
    -
    These defines shouldn't exist - PR/rcp.h has them properly defined (ultralib)
    +
    These defines shouldn't exist - PR/rcp.h has them properly defined (ultralib)
    Global MTX_KART_POOL_SIZE
    Verify with proper documentation
    Global MTX_SHADOW_POOL_SIZE
    Verify with proper documentation
    Global new_actor (ActorInitParams *)
    -
    More indepth error checking/return value
    +
    More indepth error checking/return value
    Global Note::priority
    use macros or something instead.
    Global osContInit (OSMesgQueue *mq, u8 *bitpattern, OSContStatus *status)
    @@ -230,11 +230,11 @@ $(function(){initNavTree('todo.html',''); initResizable(true); });
    Global osPfsDeleteFile (OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name)
    magic constant
    Global osPiStartDma (OSIoMesg *mb, s32 priority, s32 direction, uintptr_t devAddr, void *vAddr, size_t nbytes, OSMesgQueue *mq)
    -
    name magic constants
    -
    Global osRomBase
    -
    figure out why this is like this
    -
    Global osViBlack (u8 active)
    name magic constants
    +
    Global osRomBase
    +
    figure out why this is like this
    +
    Global osViBlack (u8 active)
    +
    name magic constants
    Global osViSwapBuffer (void *vaddr)
    figure out what this flag means
    Global PI_DOMAIN1
    @@ -242,7 +242,7 @@ $(function(){initNavTree('todo.html',''); initResizable(true); });
    Global render_actor_shell (Camera *camera, Mat4 matrix, struct ShellActor *shell)
    Is this making the shell spin?
    Global render_course_segments (uintptr_t, struct UnkStruct_800DC5EC *)
    -
    Should be Gfx*
    +
    Should be Gfx*
    Global SOUND_ARG_LOAD (sound_bank, byte2, byte3, sound_id)
    format like sm64 sounds.h
    Global UPDATE_REG (reg, var)
    diff --git a/update__objects_8c.html b/update__objects_8c.html index c6f9a3e23..4b1d248eb 100644 --- a/update__objects_8c.html +++ b/update__objects_8c.html @@ -10387,7 +10387,7 @@ Here is the caller graph for this function:
    -
    Todo
    Cleanup this function to use array access and struct if possible.
    +
    Todo
    Cleanup this function to use array access and struct if possible.
    Here is the call graph for this function: