libultraship
Reimplementations of libultra (N64 SDK) functions for modern hardware
Loading...
Searching...
No Matches
lus_gbi.h
Go to the documentation of this file.
1#pragma once
2#include <stdint.h>
3namespace Fast {
4#define OPCODE(x) (int8_t)(x)
5
6#include "f3dex.h"
7#include "f3dex2.h"
8
9/* RDP commands: */
10constexpr int8_t RDP_G_SETCIMG = OPCODE(0xff); /* -1 */
11constexpr int8_t RDP_G_SETZIMG = OPCODE(0xfe); /* -2 */
12constexpr int8_t RDP_G_SETTIMG = OPCODE(0xfd); /* -3 */
13constexpr int8_t RDP_G_SETCOMBINE = OPCODE(0xfc); /* -4 */
14constexpr int8_t RDP_G_SETENVCOLOR = OPCODE(0xfb); /* -5 */
15constexpr int8_t RDP_G_SETPRIMCOLOR = OPCODE(0xfa); /* -6 */
16constexpr int8_t RDP_G_SETBLENDCOLOR = OPCODE(0xf9); /* -7 */
17constexpr int8_t RDP_G_SETFOGCOLOR = OPCODE(0xf8); /* -8 */
18constexpr int8_t RDP_G_SETFILLCOLOR = OPCODE(0xf7); /* -9 */
19constexpr int8_t RDP_G_FILLRECT = OPCODE(0xf6); /* -10 */
20constexpr int8_t RDP_G_SETTILE = OPCODE(0xf5); /* -11 */
21constexpr int8_t RDP_G_LOADTILE = OPCODE(0xf4); /* -12 */
22constexpr int8_t RDP_G_LOADBLOCK = OPCODE(0xf3); /* -13 */
23constexpr int8_t RDP_G_SETTILESIZE = OPCODE(0xf2); /* -14 */
24constexpr int8_t RDP_G_LOADTLUT = OPCODE(0xf0); /* -16 */
25constexpr int8_t RDP_G_RDPSETOTHERMODE = OPCODE(0xef); /* -17 */
26constexpr int8_t RDP_G_SETPRIMDEPTH = OPCODE(0xee); /* -18 */
27constexpr int8_t RDP_G_SETSCISSOR = OPCODE(0xed); /* -19 */
28constexpr int8_t RDP_G_SETCONVERT = OPCODE(0xec); /* -20 */
29constexpr int8_t RDP_G_SETKEYR = OPCODE(0xeb); /* -21 */
30constexpr int8_t RDP_G_SETKEYGB = OPCODE(0xea); /* -22 */
31constexpr int8_t RDP_G_RDPFULLSYNC = OPCODE(0xe9); /* -23 */
32constexpr int8_t RDP_G_RDPTILESYNC = OPCODE(0xe8); /* -24 */
33constexpr int8_t RDP_G_RDPPIPESYNC = OPCODE(0xe7); /* -25 */
34constexpr int8_t RDP_G_RDPLOADSYNC = OPCODE(0xe6); /* -26 */
35constexpr int8_t RDP_G_TEXRECTFLIP = OPCODE(0xe5); /* -27 */
36constexpr int8_t RDP_G_TEXRECT = OPCODE(0xe4); /* -28 */
37
38// CUSTOM OTR COMMANDS
39constexpr int8_t OTR_G_SETTIMG_OTR_HASH = OPCODE(0x20);
40constexpr int8_t OTR_G_SETFB = OPCODE(0x21);
41constexpr int8_t OTR_G_RESETFB = OPCODE(0x22);
42constexpr int8_t OTR_G_SETTIMG_FB = OPCODE(0x23);
43constexpr int8_t OTR_G_VTX_OTR_FILEPATH = OPCODE(0x24);
44constexpr int8_t OTR_G_SETTIMG_OTR_FILEPATH = OPCODE(0x25);
45constexpr int8_t OTR_G_TRI1_OTR = OPCODE(0x26);
46constexpr int8_t OTR_G_DL_OTR_FILEPATH = OPCODE(0x27);
47constexpr int8_t OTR_G_PUSHCD = OPCODE(0x28);
48constexpr int8_t OTR_G_MTX_OTR_FILEPATH = OPCODE(0x29);
49constexpr int8_t OTR_G_DL_OTR_HASH = OPCODE(0x31);
50constexpr int8_t OTR_G_VTX_OTR_HASH = OPCODE(0x32);
51constexpr int8_t OTR_G_MARKER = OPCODE(0x33);
52constexpr int8_t OTR_G_INVALTEXCACHE = OPCODE(0x34);
53constexpr int8_t OTR_G_BRANCH_Z_OTR = OPCODE(0x35);
54constexpr int8_t OTR_G_MTX_OTR = OPCODE(0x36);
55constexpr int8_t OTR_G_TEXRECT_WIDE = OPCODE(0x37);
56constexpr int8_t OTR_G_FILLWIDERECT = OPCODE(0x38);
57
58/* GFX Effects */
59
60// RDP Cmd
61constexpr int8_t OTR_G_SETGRAYSCALE = OPCODE(0x39);
62constexpr int8_t OTR_G_EXTRAGEOMETRYMODE = OPCODE(0x3a);
63constexpr int8_t OTR_G_COPYFB = OPCODE(0x3b);
64constexpr int8_t OTR_G_IMAGERECT = OPCODE(0x3c);
65constexpr int8_t OTR_G_DL_INDEX = OPCODE(0x3d);
66constexpr int8_t OTR_G_READFB = OPCODE(0x3e);
67constexpr int8_t OTR_G_REGBLENDEDTEX = OPCODE(0x3f);
68constexpr int8_t OTR_G_SETINTENSITY = OPCODE(0x40);
69constexpr int8_t OTR_G_MOVEMEM_HASH = OPCODE(0x42);
70constexpr int8_t OTR_G_PUSH_SHADER = OPCODE(0x43);
71constexpr int8_t OTR_G_POP_SHADER = OPCODE(0x44);
72constexpr int8_t RDP_G_SETTILESIZE_INTERP = OPCODE(0x45);
73constexpr int8_t RDP_G_SETTARGETINTERPINDEX = OPCODE(0x46);
74constexpr int8_t RDP_G_LOADBLOCK_WIDE = OPCODE(0x47);
75constexpr int8_t RDP_G_VTX_WIDE = OPCODE(0x48);
76constexpr int8_t RDP_G_TRI1_WIDE = OPCODE(0x49);
77constexpr int8_t RDP_G_SETTILESIZE_LERP = OPCODE(0x4a);
78
79/*
80 * The following commands are the "generated" RDP commands; the user
81 * never sees them, the RSP microcode generates them.
82 *
83 * The layout of the bits is magical, to save work in the ucode.
84 * These id's are -56, -52, -54, -50, -55, -51, -53, -49, ...
85 * edge, shade, texture, zbuff bits: estz
86 */
87#define G_TRI_FILL 0xc8 /* fill triangle: 11001000 */
88#define G_TRI_SHADE 0xcc /* shade triangle: 11001100 */
89#define G_TRI_TXTR 0xca /* texture triangle: 11001010 */
90#define G_TRI_SHADE_TXTR 0xce /* shade, texture triangle: 11001110 */
91#define G_TRI_FILL_ZBUFF 0xc9 /* fill, zbuff triangle: 11001001 */
92#define G_TRI_SHADE_ZBUFF 0xcd /* shade, zbuff triangle: 11001101 */
93#define G_TRI_TXTR_ZBUFF 0xcb /* texture, zbuff triangle: 11001011 */
94#define G_TRI_SHADE_TXTR_ZBUFF 0xcf /* shade, txtr, zbuff trngl: 11001111 */
95
96/*
97 * A TRI_FILL triangle is just the edges. You need to set the DP
98 * to use primcolor, in order to see anything. (it is NOT a triangle
99 * that gets rendered in 'fill mode'. Triangles can't be rendered
100 * in 'fill mode')
101 *
102 * A TRI_SHADE is a gouraud triangle that has colors interpolated.
103 * Flat-shaded triangles (from the software) are still gouraud shaded,
104 * it's just the colors are all the same and the deltas are 0.
105 *
106 * Other triangle types, and combinations are more obvious.
107 */
108
109/* masks to build RDP triangle commands: */
110#define G_RDP_TRI_FILL_MASK 0x08
111#define G_RDP_TRI_SHADE_MASK 0x04
112#define G_RDP_TRI_TXTR_MASK 0x02
113#define G_RDP_TRI_ZBUFF_MASK 0x01
114
115/*
116 * HACK:
117 * This is a dreadful hack. For version 1.0 hardware, there are still
118 * some 'bowtie' hangs. This parameter can be increased to avoid
119 * the hangs. Every increase of 4 chops one scanline off of every
120 * triangle. Values of 4,8,12 should be sufficient to avoid any
121 * bowtie hang.
122 *
123 * Change this value, then recompile ALL of your program (including static
124 * display lists!)
125 *
126 * THIS WILL BE REMOVED FOR HARDWARE VERSION 2.0!
127 */
128#define BOWTIE_VAL 0
129
130/* gets added to RDP command, in order to test for addres fixup: */
131#define G_RDP_ADDR_FIXUP 3 /* |RDP cmds| <= this, do addr fixup */
132#ifdef _LANGUAGE_ASSEMBLY
133#define G_RDP_TEXRECT_CHECK ((-1 * G_TEXRECTFLIP) & 0xff)
134#endif
135
136/* macros for command parsing: */
137#define GDMACMD(x) (x)
138#ifdef GIMMCMD
139#undef GIMMCMD
140#endif
141#define GIMMCMD(x) = OPCODE(G_IMMFIRST - (x))
142#define GRDPCMD(x) (0xff - (x))
143
144#define G_DMACMDSIZ 128
145#define G_IMMCMDSIZ 64
146#define G_RDPCMDSIZ 64
147
148/*
149 * Coordinate shift values, number of bits of fraction
150 */
151#define G_TEXTURE_IMAGE_FRAC 2
152#define G_TEXTURE_SCALE_FRAC 16
153#define G_SCALE_FRAC 8
154#define G_ROTATE_FRAC 16
155
156/*
157 * Parameters to graphics commands
158 */
159
160/*
161 * Data packing macros
162 */
163
164/*
165 * Maximum z-buffer value, used to initialize the z-buffer.
166 * Note : this number is NOT the viewport z-scale constant.
167 * See the comment next to G_MAXZ for more info.
168 */
169#define G_MAXFBZ 0x3fff /* 3b exp, 11b mantissa */
170
171#define GPACK_RGBA5551(r, g, b, a) ((((r) << 8) & 0xf800) | (((g) << 3) & 0x7c0) | (((b) >> 2) & 0x3e) | ((a)&0x1))
172#define GPACK_ZDZ(z, dz) ((z) << 2 | (dz))
173
174/*
175 * flags for G_SETGEOMETRYMODE
176 * (this rendering state is maintained in RSP)
177 *
178 * DO NOT USE THE LOW 8 BITS OF GEOMETRYMODE:
179 * The weird bit-ordering is for the micro-code: the lower byte
180 * can be OR'd in with G_TRI_SHADE (11001100) to construct
181 * the triangle command directly. Don't break it...
182 *
183 * DO NOT USE THE HIGH 8 BITS OF GEOMETRYMODE:
184 * The high byte is OR'd with 0x703 to form the clip code mask.
185 * If it is set to 0x04, this will cause near clipping to occur.
186 * If it is zero, near clipping will not occur.
187 *
188 * Further explanation:
189 * G_SHADE is necessary in order to see the color that you passed
190 * down with the vertex. If G_SHADE isn't set, you need to set the DP
191 * appropriately and use primcolor to see anything.
192 *
193 * G_SHADING_SMOOTH enabled means use all 3 colors of the triangle.
194 * If it is not set, then do 'flat shading', where only one vertex color
195 * is used (and all 3 vertices are set to that same color by the ucode)
196 * See the man page for gSP1Triangle().
197 *
198 */
199
200#define G_ZBUFFER 0x00000001
201#define G_SHADE 0x00000004
202#define G_FOG 0x00010000
203#define G_LIGHTING 0x00020000
204#define G_TEXTURE_GEN 0x00040000
205#define G_TEXTURE_GEN_LINEAR 0x00080000
206#define G_LOD 0x00100000
207#define G_LIGHTING_POSITIONAL 0x00400000
208
209/*
210 * G_EXTRAGEOMETRY flags: set extra custom geometry modes
211 */
212#define G_EX_INVERT_CULLING 0x00000001
213#define G_EX_ALWAYS_EXECUTE_BRANCH 0x00000002
214
215/*
216 * G_SETIMG fmt: set image formats
217 */
218#define G_IM_FMT_RGBA 0
219#define G_IM_FMT_YUV 1
220#define G_IM_FMT_CI 2
221#define G_IM_FMT_IA 3
222#define G_IM_FMT_I 4
223
224/*
225 * G_SETIMG siz: set image pixel size
226 */
227#define G_IM_SIZ_4b 0
228#define G_IM_SIZ_8b 1
229#define G_IM_SIZ_16b 2
230#define G_IM_SIZ_32b 3
231#define G_IM_SIZ_DD 5
232
233#define G_IM_SIZ_4b_BYTES 0
234#define G_IM_SIZ_4b_TILE_BYTES G_IM_SIZ_4b_BYTES
235#define G_IM_SIZ_4b_LINE_BYTES G_IM_SIZ_4b_BYTES
236
237#define G_IM_SIZ_8b_BYTES 1
238#define G_IM_SIZ_8b_TILE_BYTES G_IM_SIZ_8b_BYTES
239#define G_IM_SIZ_8b_LINE_BYTES G_IM_SIZ_8b_BYTES
240
241#define G_IM_SIZ_16b_BYTES 2
242#define G_IM_SIZ_16b_TILE_BYTES G_IM_SIZ_16b_BYTES
243#define G_IM_SIZ_16b_LINE_BYTES G_IM_SIZ_16b_BYTES
244
245#define G_IM_SIZ_32b_BYTES 4
246#define G_IM_SIZ_32b_TILE_BYTES 2
247#define G_IM_SIZ_32b_LINE_BYTES 2
248
249#define G_IM_SIZ_4b_LOAD_BLOCK G_IM_SIZ_16b
250#define G_IM_SIZ_8b_LOAD_BLOCK G_IM_SIZ_16b
251#define G_IM_SIZ_16b_LOAD_BLOCK G_IM_SIZ_16b
252#define G_IM_SIZ_32b_LOAD_BLOCK G_IM_SIZ_32b
253
254#define G_IM_SIZ_4b_SHIFT 2
255#define G_IM_SIZ_8b_SHIFT 1
256#define G_IM_SIZ_16b_SHIFT 0
257#define G_IM_SIZ_32b_SHIFT 0
258
259#define G_IM_SIZ_4b_INCR 3
260#define G_IM_SIZ_8b_INCR 1
261#define G_IM_SIZ_16b_INCR 0
262#define G_IM_SIZ_32b_INCR 0
263
264/*
265 * Texturing macros
266 */
267
268/* These are also defined defined above for Sprite Microcode */
269
270#define G_TX_LOADTILE 7
271#define G_TX_RENDERTILE 0
272
273#define G_TX_NOMIRROR 0
274#define G_TX_WRAP 0
275#define G_TX_MIRROR 0x1
276#define G_TX_CLAMP 0x2
277#define G_TX_NOMASK 0
278#define G_TX_NOLOD 0
279
280/*
281 * G_SETCOMBINE: color combine modes
282 */
283/* Color combiner constants: */
284#define G_CCMUX_COMBINED 0
285#define G_CCMUX_TEXEL0 1
286#define G_CCMUX_TEXEL1 2
287#define G_CCMUX_PRIMITIVE 3
288#define G_CCMUX_SHADE 4
289#define G_CCMUX_ENVIRONMENT 5
290#define G_CCMUX_CENTER 6
291#define G_CCMUX_SCALE 6
292#define G_CCMUX_COMBINED_ALPHA 7
293#define G_CCMUX_TEXEL0_ALPHA 8
294#define G_CCMUX_TEXEL1_ALPHA 9
295#define G_CCMUX_PRIMITIVE_ALPHA 10
296#define G_CCMUX_SHADE_ALPHA 11
297#define G_CCMUX_ENV_ALPHA 12
298#define G_CCMUX_LOD_FRACTION 13
299#define G_CCMUX_PRIM_LOD_FRAC 14
300#define G_CCMUX_NOISE 7
301#define G_CCMUX_K4 7
302#define G_CCMUX_K5 15
303#define G_CCMUX_1 6
304#define G_CCMUX_0 31
305/* Chroma-key center/scale and YUV-convert K4/K5 combiner inputs. */
306#define G_CCMUX_KEY_CENTER 20
307#define G_CCMUX_KEY_SCALE 21
308#define G_CCMUX_CONVERT_K4 22
309#define G_CCMUX_CONVERT_K5 23
310
311/* Alpha combiner constants: */
312#define G_ACMUX_COMBINED 0
313#define G_ACMUX_TEXEL0 1
314#define G_ACMUX_TEXEL1 2
315#define G_ACMUX_PRIMITIVE 3
316#define G_ACMUX_SHADE 4
317#define G_ACMUX_ENVIRONMENT 5
318#define G_ACMUX_LOD_FRACTION 0
319#define G_ACMUX_PRIM_LOD_FRAC 6
320#define G_ACMUX_1 6
321#define G_ACMUX_0 7
322
323/* typical CC cycle 1 modes */
324#define G_CC_PRIMITIVE 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE
325#define G_CC_SHADE 0, 0, 0, SHADE, 0, 0, 0, SHADE
326#define G_CC_MODULATEI TEXEL0, 0, SHADE, 0, 0, 0, 0, SHADE
327#define G_CC_MODULATEIA TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0
328#define G_CC_MODULATEIDECALA TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0
329#define G_CC_MODULATERGB G_CC_MODULATEI
330#define G_CC_MODULATERGBA G_CC_MODULATEIA
331#define G_CC_MODULATERGBDECALA G_CC_MODULATEIDECALA
332#define G_CC_MODULATEI_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
333#define G_CC_MODULATEIA_PRIM TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0
334#define G_CC_MODULATEIDECALA_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0
335#define G_CC_MODULATERGB_PRIM G_CC_MODULATEI_PRIM
336#define G_CC_MODULATERGBA_PRIM G_CC_MODULATEIA_PRIM
337#define G_CC_MODULATERGBDECALA_PRIM G_CC_MODULATEIDECALA_PRIM
338#define G_CC_DECALRGB 0, 0, 0, TEXEL0, 0, 0, 0, SHADE
339#define G_CC_DECALRGBA 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0
340#define G_CC_BLENDI ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
341#define G_CC_BLENDIA ENVIRONMENT, SHADE, TEXEL0, SHADE, TEXEL0, 0, SHADE, 0
342#define G_CC_BLENDIDECALA ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0
343#define G_CC_BLENDRGBA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, SHADE
344#define G_CC_BLENDRGBDECALA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, TEXEL0
345#define G_CC_ADDRGB 1, 0, TEXEL0, SHADE, 0, 0, 0, SHADE
346#define G_CC_ADDRGBDECALA 1, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0
347#define G_CC_REFLECTRGB ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, SHADE
348#define G_CC_REFLECTRGBDECALA ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0
349#define G_CC_HILITERGB PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
350#define G_CC_HILITERGBA PRIMITIVE, SHADE, TEXEL0, SHADE, PRIMITIVE, SHADE, TEXEL0, SHADE
351#define G_CC_HILITERGBDECALA PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0
352#define G_CC_SHADEDECALA 0, 0, 0, SHADE, 0, 0, 0, TEXEL0
353#define G_CC_BLENDPE PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, SHADE, 0
354#define G_CC_BLENDPEDECALA PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, TEXEL0
355
356/* oddball modes */
357#define _G_CC_BLENDPE ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, SHADE, 0
358#define _G_CC_BLENDPEDECALA ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, 0, 0, 0, TEXEL0
359#define _G_CC_TWOCOLORTEX PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
360/* used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD */
361#define _G_CC_SPARSEST PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0
362#define G_CC_TEMPLERP TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0
363
364/* typical CC cycle 1 modes, usually followed by other cycle 2 modes */
365#define G_CC_TRILERP TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0
366#define G_CC_INTERFERENCE TEXEL0, 0, TEXEL1, 0, TEXEL0, 0, TEXEL1, 0
367
368/*
369 * One-cycle color convert operation
370 */
371#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE
372
373/*
374 * NOTE: YUV2RGB expects TF step1 color conversion to occur in 2nd clock.
375 * Therefore, CC looks for step1 results in TEXEL1
376 */
377#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0
378
379/* typical CC cycle 2 modes */
380#define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED
381#define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE
382#define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0
383#define G_CC_MODULATERGB2 G_CC_MODULATEI2
384#define G_CC_MODULATERGBA2 G_CC_MODULATEIA2
385#define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
386#define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0
387#define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2
388#define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2
389#define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE
390/*
391 * ?
392#define G_CC_DECALRGBA2 COMBINED, SHADE, COMBINED_ALPHA, SHADE, 0, 0, 0, SHADE
393*/
394#define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE
395#define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0
396#define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0
397#define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE
398#define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED
399#define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0
400#define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED
401
402/*
403 * G_SETOTHERMODE_L sft: shift count
404 */
405#define G_MDSFT_ALPHACOMPARE 0
406#define G_MDSFT_ZSRCSEL 2
407#define G_MDSFT_RENDERMODE 3
408#define G_MDSFT_BLENDER 16
409
410/*
411 * G_SETOTHERMODE_H sft: shift count
412 */
413#define G_MDSFT_BLENDMASK 0 /* unsupported */
414#define G_MDSFT_ALPHADITHER 4
415#define G_MDSFT_RGBDITHER 6
416
417#define G_MDSFT_COMBKEY 8
418#define G_MDSFT_TEXTCONV 9
419#define G_MDSFT_TEXTFILT 12
420#define G_MDSFT_TEXTLUT 14
421#define G_MDSFT_TEXTLOD 16
422#define G_MDSFT_TEXTDETAIL 17
423#define G_MDSFT_TEXTPERSP 19
424#define G_MDSFT_CYCLETYPE 20
425#define G_MDSFT_COLORDITHER 22 /* unsupported in HW 2.0 */
426#define G_MDSFT_PIPELINE 23
427
428/* G_SETOTHERMODE_H gPipelineMode */
429#define G_PM_1PRIMITIVE (1 << G_MDSFT_PIPELINE)
430#define G_PM_NPRIMITIVE (0 << G_MDSFT_PIPELINE)
431
432/* G_SETOTHERMODE_H gSetCycleType */
433#define G_CYC_1CYCLE (0 << G_MDSFT_CYCLETYPE)
434#define G_CYC_2CYCLE (1 << G_MDSFT_CYCLETYPE)
435#define G_CYC_COPY (2 << G_MDSFT_CYCLETYPE)
436#define G_CYC_FILL (3 << G_MDSFT_CYCLETYPE)
437
438/* G_SETOTHERMODE_H gSetTexturePersp */
439#define G_TP_NONE (0 << G_MDSFT_TEXTPERSP)
440#define G_TP_PERSP (1 << G_MDSFT_TEXTPERSP)
441
442/* G_SETOTHERMODE_H gSetTextureDetail */
443#define G_TD_CLAMP (0 << G_MDSFT_TEXTDETAIL)
444#define G_TD_SHARPEN (1 << G_MDSFT_TEXTDETAIL)
445#define G_TD_DETAIL (2 << G_MDSFT_TEXTDETAIL)
446
447/* G_SETOTHERMODE_H gSetTextureLOD */
448#define G_TL_TILE (0 << G_MDSFT_TEXTLOD)
449#define G_TL_LOD (1 << G_MDSFT_TEXTLOD)
450
451/* G_SETOTHERMODE_H gSetTextureLUT */
452#define G_TT_NONE (0 << G_MDSFT_TEXTLUT)
453#define G_TT_RGBA16 (2 << G_MDSFT_TEXTLUT)
454#define G_TT_IA16 (3 << G_MDSFT_TEXTLUT)
455
456/* G_SETOTHERMODE_H gSetTextureFilter */
457#define G_TF_POINT (0 << G_MDSFT_TEXTFILT)
458#define G_TF_AVERAGE (3 << G_MDSFT_TEXTFILT)
459#define G_TF_BILERP (2 << G_MDSFT_TEXTFILT)
460
461/* G_SETOTHERMODE_H gSetTextureConvert */
462#define G_TC_CONV (0 << G_MDSFT_TEXTCONV)
463#define G_TC_FILTCONV (5 << G_MDSFT_TEXTCONV)
464#define G_TC_FILT (6 << G_MDSFT_TEXTCONV)
465
466/* G_SETOTHERMODE_H gSetCombineKey */
467#define G_CK_NONE (0 << G_MDSFT_COMBKEY)
468#define G_CK_KEY (1 << G_MDSFT_COMBKEY)
469
470/* G_SETOTHERMODE_H gSetColorDither */
471#define G_CD_MAGICSQ (0 << G_MDSFT_RGBDITHER)
472#define G_CD_BAYER (1 << G_MDSFT_RGBDITHER)
473#define G_CD_NOISE (2 << G_MDSFT_RGBDITHER)
474
475#ifndef _HW_VERSION_1
476#define G_CD_DISABLE (3 << G_MDSFT_RGBDITHER)
477#define G_CD_ENABLE G_CD_NOISE /* HW 1.0 compatibility mode */
478#else
479#define G_CD_ENABLE (1 << G_MDSFT_COLORDITHER)
480#define G_CD_DISABLE (0 << G_MDSFT_COLORDITHER)
481#endif
482
483/* G_SETOTHERMODE_H gSetAlphaDither */
484#define G_AD_PATTERN (0 << G_MDSFT_ALPHADITHER)
485#define G_AD_NOTPATTERN (1 << G_MDSFT_ALPHADITHER)
486#define G_AD_NOISE (2 << G_MDSFT_ALPHADITHER)
487#define G_AD_DISABLE (3 << G_MDSFT_ALPHADITHER)
488
489/* G_SETOTHERMODE_L gSetAlphaCompare */
490#define G_AC_NONE (0 << G_MDSFT_ALPHACOMPARE)
491#define G_AC_THRESHOLD (1 << G_MDSFT_ALPHACOMPARE)
492#define G_AC_DITHER (3 << G_MDSFT_ALPHACOMPARE)
493
494/* G_SETOTHERMODE_L gSetDepthSource */
495#define G_ZS_PIXEL (0 << G_MDSFT_ZSRCSEL)
496#define G_ZS_PRIM (1 << G_MDSFT_ZSRCSEL)
497
498/* G_SETOTHERMODE_L gSetRenderMode */
499#define AA_EN 0x8
500#define Z_CMP 0x10
501#define Z_UPD 0x20
502#define IM_RD 0x40
503#define CLR_ON_CVG 0x80
504#define CVG_DST_CLAMP 0
505#define CVG_DST_WRAP 0x100
506#define CVG_DST_FULL 0x200
507#define CVG_DST_SAVE 0x300
508#define ZMODE_OPA 0
509#define ZMODE_INTER 0x400
510#define ZMODE_XLU 0x800
511#define ZMODE_DEC 0xc00
512#define CVG_X_ALPHA 0x1000
513#define ALPHA_CVG_SEL 0x2000
514#define FORCE_BL 0x4000
515#define TEX_EDGE 0x0000 /* used to be 0x8000 */
516
517#define G_BL_CLR_IN 0
518#define G_BL_CLR_MEM 1
519#define G_BL_CLR_BL 2
520#define G_BL_CLR_FOG 3
521#define G_BL_1MA 0
522#define G_BL_A_MEM 1
523#define G_BL_A_IN 0
524#define G_BL_A_FOG 1
525#define G_BL_A_SHADE 2
526#define G_BL_1 2
527#define G_BL_0 3
528
529#define GBL_c1(m1a, m1b, m2a, m2b) (uint32_t)(m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18
530#define GBL_c2(m1a, m1b, m2a, m2b) (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16
531
532#define RM_AA_ZB_OPA_SURF(clk) \
533 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
534 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
535
536#define RM_RA_ZB_OPA_SURF(clk) \
537 AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
538 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
539
540#define RM_AA_ZB_XLU_SURF(clk) \
541 AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_XLU | \
542 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
543
544#define RM_AA_ZB_OPA_DECAL(clk) \
545 AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ALPHA_CVG_SEL | ZMODE_DEC | \
546 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
547
548#define RM_RA_ZB_OPA_DECAL(clk) \
549 AA_EN | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | ZMODE_DEC | \
550 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
551
552#define RM_AA_ZB_XLU_DECAL(clk) \
553 AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_DEC | \
554 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
555
556#define RM_AA_ZB_OPA_INTER(clk) \
557 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ALPHA_CVG_SEL | ZMODE_INTER | \
558 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
559
560#define RM_RA_ZB_OPA_INTER(clk) \
561 AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ALPHA_CVG_SEL | ZMODE_INTER | \
562 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
563
564#define RM_AA_ZB_XLU_INTER(clk) \
565 AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_INTER | \
566 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
567
568#define RM_AA_ZB_XLU_LINE(clk) \
569 AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU | \
570 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
571
572#define RM_AA_ZB_DEC_LINE(clk) \
573 AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC | \
574 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
575
576#define RM_AA_ZB_TEX_EDGE(clk) \
577 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
578 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
579
580#define RM_AA_ZB_TEX_INTER(clk) \
581 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE | \
582 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
583
584#define RM_AA_ZB_SUB_SURF(clk) \
585 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
586 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
587
588#define RM_AA_ZB_PCL_SURF(clk) \
589 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | G_AC_DITHER | \
590 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
591
592#define RM_AA_ZB_OPA_TERR(clk) \
593 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
594 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
595
596#define RM_AA_ZB_TEX_TERR(clk) \
597 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
598 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
599
600#define RM_AA_ZB_SUB_TERR(clk) \
601 AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
602 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
603
604#define RM_AA_OPA_SURF(clk) \
605 AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
606 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
607
608#define RM_RA_OPA_SURF(clk) \
609 AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
610
611#define RM_AA_XLU_SURF(clk) \
612 AA_EN | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_OPA | \
613 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
614
615#define RM_AA_XLU_LINE(clk) \
616 AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \
617 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
618
619#define RM_AA_DEC_LINE(clk) \
620 AA_EN | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \
621 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
622
623#define RM_AA_TEX_EDGE(clk) \
624 AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
625 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
626
627#define RM_AA_SUB_SURF(clk) \
628 AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
629 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
630
631#define RM_AA_PCL_SURF(clk) \
632 AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | G_AC_DITHER | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
633
634#define RM_AA_OPA_TERR(clk) \
635 AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
636 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
637
638#define RM_AA_TEX_TERR(clk) \
639 AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
640 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
641
642#define RM_AA_SUB_TERR(clk) \
643 AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
644 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
645
646#define RM_ZB_OPA_SURF(clk) \
647 Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_OPA | \
648 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
649
650#define RM_ZB_XLU_SURF(clk) \
651 Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_XLU | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
652
653#define RM_ZB_OPA_DECAL(clk) \
654 Z_CMP | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_DEC | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
655
656#define RM_ZB_XLU_DECAL(clk) \
657 Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_DEC | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
658
659#define RM_ZB_CLD_SURF(clk) \
660 Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_XLU | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
661
662#define RM_ZB_OVL_SURF(clk) \
663 Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_DEC | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
664
665#define RM_ZB_PCL_SURF(clk) \
666 Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | G_AC_DITHER | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
667
668#define RM_OPA_SURF(clk) CVG_DST_CLAMP | FORCE_BL | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
669
670#define RM_XLU_SURF(clk) \
671 IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
672
673#define RM_TEX_EDGE(clk) \
674 CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | TEX_EDGE | AA_EN | \
675 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
676
677#define RM_CLD_SURF(clk) \
678 IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
679
680#define RM_PCL_SURF(clk) \
681 CVG_DST_FULL | FORCE_BL | ZMODE_OPA | G_AC_DITHER | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
682
683#define RM_ADD(clk) \
684 IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1)
685
686#define RM_NOOP(clk) GBL_c##clk(0, 0, 0, 0)
687
688#define RM_VISCVG(clk) IM_RD | FORCE_BL | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM)
689
690/* for rendering to an 8-bit framebuffer */
691#define RM_OPA_CI(clk) CVG_DST_CLAMP | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
692
693#define G_RM_AA_ZB_OPA_SURF RM_AA_ZB_OPA_SURF(1)
694#define G_RM_AA_ZB_OPA_SURF2 RM_AA_ZB_OPA_SURF(2)
695#define G_RM_AA_ZB_XLU_SURF RM_AA_ZB_XLU_SURF(1)
696#define G_RM_AA_ZB_XLU_SURF2 RM_AA_ZB_XLU_SURF(2)
697#define G_RM_AA_ZB_OPA_DECAL RM_AA_ZB_OPA_DECAL(1)
698#define G_RM_AA_ZB_OPA_DECAL2 RM_AA_ZB_OPA_DECAL(2)
699#define G_RM_AA_ZB_XLU_DECAL RM_AA_ZB_XLU_DECAL(1)
700#define G_RM_AA_ZB_XLU_DECAL2 RM_AA_ZB_XLU_DECAL(2)
701#define G_RM_AA_ZB_OPA_INTER RM_AA_ZB_OPA_INTER(1)
702#define G_RM_AA_ZB_OPA_INTER2 RM_AA_ZB_OPA_INTER(2)
703#define G_RM_AA_ZB_XLU_INTER RM_AA_ZB_XLU_INTER(1)
704#define G_RM_AA_ZB_XLU_INTER2 RM_AA_ZB_XLU_INTER(2)
705#define G_RM_AA_ZB_XLU_LINE RM_AA_ZB_XLU_LINE(1)
706#define G_RM_AA_ZB_XLU_LINE2 RM_AA_ZB_XLU_LINE(2)
707#define G_RM_AA_ZB_DEC_LINE RM_AA_ZB_DEC_LINE(1)
708#define G_RM_AA_ZB_DEC_LINE2 RM_AA_ZB_DEC_LINE(2)
709#define G_RM_AA_ZB_TEX_EDGE RM_AA_ZB_TEX_EDGE(1)
710#define G_RM_AA_ZB_TEX_EDGE2 RM_AA_ZB_TEX_EDGE(2)
711#define G_RM_AA_ZB_TEX_INTER RM_AA_ZB_TEX_INTER(1)
712#define G_RM_AA_ZB_TEX_INTER2 RM_AA_ZB_TEX_INTER(2)
713#define G_RM_AA_ZB_SUB_SURF RM_AA_ZB_SUB_SURF(1)
714#define G_RM_AA_ZB_SUB_SURF2 RM_AA_ZB_SUB_SURF(2)
715#define G_RM_AA_ZB_PCL_SURF RM_AA_ZB_PCL_SURF(1)
716#define G_RM_AA_ZB_PCL_SURF2 RM_AA_ZB_PCL_SURF(2)
717#define G_RM_AA_ZB_OPA_TERR RM_AA_ZB_OPA_TERR(1)
718#define G_RM_AA_ZB_OPA_TERR2 RM_AA_ZB_OPA_TERR(2)
719#define G_RM_AA_ZB_TEX_TERR RM_AA_ZB_TEX_TERR(1)
720#define G_RM_AA_ZB_TEX_TERR2 RM_AA_ZB_TEX_TERR(2)
721#define G_RM_AA_ZB_SUB_TERR RM_AA_ZB_SUB_TERR(1)
722#define G_RM_AA_ZB_SUB_TERR2 RM_AA_ZB_SUB_TERR(2)
723
724#define G_RM_RA_ZB_OPA_SURF RM_RA_ZB_OPA_SURF(1)
725#define G_RM_RA_ZB_OPA_SURF2 RM_RA_ZB_OPA_SURF(2)
726#define G_RM_RA_ZB_OPA_DECAL RM_RA_ZB_OPA_DECAL(1)
727#define G_RM_RA_ZB_OPA_DECAL2 RM_RA_ZB_OPA_DECAL(2)
728#define G_RM_RA_ZB_OPA_INTER RM_RA_ZB_OPA_INTER(1)
729#define G_RM_RA_ZB_OPA_INTER2 RM_RA_ZB_OPA_INTER(2)
730
731#define G_RM_AA_OPA_SURF RM_AA_OPA_SURF(1)
732#define G_RM_AA_OPA_SURF2 RM_AA_OPA_SURF(2)
733#define G_RM_AA_XLU_SURF RM_AA_XLU_SURF(1)
734#define G_RM_AA_XLU_SURF2 RM_AA_XLU_SURF(2)
735#define G_RM_AA_XLU_LINE RM_AA_XLU_LINE(1)
736#define G_RM_AA_XLU_LINE2 RM_AA_XLU_LINE(2)
737#define G_RM_AA_DEC_LINE RM_AA_DEC_LINE(1)
738#define G_RM_AA_DEC_LINE2 RM_AA_DEC_LINE(2)
739#define G_RM_AA_TEX_EDGE RM_AA_TEX_EDGE(1)
740#define G_RM_AA_TEX_EDGE2 RM_AA_TEX_EDGE(2)
741#define G_RM_AA_SUB_SURF RM_AA_SUB_SURF(1)
742#define G_RM_AA_SUB_SURF2 RM_AA_SUB_SURF(2)
743#define G_RM_AA_PCL_SURF RM_AA_PCL_SURF(1)
744#define G_RM_AA_PCL_SURF2 RM_AA_PCL_SURF(2)
745#define G_RM_AA_OPA_TERR RM_AA_OPA_TERR(1)
746#define G_RM_AA_OPA_TERR2 RM_AA_OPA_TERR(2)
747#define G_RM_AA_TEX_TERR RM_AA_TEX_TERR(1)
748#define G_RM_AA_TEX_TERR2 RM_AA_TEX_TERR(2)
749#define G_RM_AA_SUB_TERR RM_AA_SUB_TERR(1)
750#define G_RM_AA_SUB_TERR2 RM_AA_SUB_TERR(2)
751
752#define G_RM_RA_OPA_SURF RM_RA_OPA_SURF(1)
753#define G_RM_RA_OPA_SURF2 RM_RA_OPA_SURF(2)
754
755#define G_RM_ZB_OPA_SURF RM_ZB_OPA_SURF(1)
756#define G_RM_ZB_OPA_SURF2 RM_ZB_OPA_SURF(2)
757#define G_RM_ZB_XLU_SURF RM_ZB_XLU_SURF(1)
758#define G_RM_ZB_XLU_SURF2 RM_ZB_XLU_SURF(2)
759#define G_RM_ZB_OPA_DECAL RM_ZB_OPA_DECAL(1)
760#define G_RM_ZB_OPA_DECAL2 RM_ZB_OPA_DECAL(2)
761#define G_RM_ZB_XLU_DECAL RM_ZB_XLU_DECAL(1)
762#define G_RM_ZB_XLU_DECAL2 RM_ZB_XLU_DECAL(2)
763#define G_RM_ZB_CLD_SURF RM_ZB_CLD_SURF(1)
764#define G_RM_ZB_CLD_SURF2 RM_ZB_CLD_SURF(2)
765#define G_RM_ZB_OVL_SURF RM_ZB_OVL_SURF(1)
766#define G_RM_ZB_OVL_SURF2 RM_ZB_OVL_SURF(2)
767#define G_RM_ZB_PCL_SURF RM_ZB_PCL_SURF(1)
768#define G_RM_ZB_PCL_SURF2 RM_ZB_PCL_SURF(2)
769
770#define G_RM_OPA_SURF RM_OPA_SURF(1)
771#define G_RM_OPA_SURF2 RM_OPA_SURF(2)
772#define G_RM_XLU_SURF RM_XLU_SURF(1)
773#define G_RM_XLU_SURF2 RM_XLU_SURF(2)
774#define G_RM_CLD_SURF RM_CLD_SURF(1)
775#define G_RM_CLD_SURF2 RM_CLD_SURF(2)
776#define G_RM_TEX_EDGE RM_TEX_EDGE(1)
777#define G_RM_TEX_EDGE2 RM_TEX_EDGE(2)
778#define G_RM_PCL_SURF RM_PCL_SURF(1)
779#define G_RM_PCL_SURF2 RM_PCL_SURF(2)
780#define G_RM_ADD RM_ADD(1)
781#define G_RM_ADD2 RM_ADD(2)
782#define G_RM_NOOP RM_NOOP(1)
783#define G_RM_NOOP2 RM_NOOP(2)
784#define G_RM_VISCVG RM_VISCVG(1)
785#define G_RM_VISCVG2 RM_VISCVG(2)
786#define G_RM_OPA_CI RM_OPA_CI(1)
787#define G_RM_OPA_CI2 RM_OPA_CI(2)
788
789#define G_RM_FOG_SHADE_A GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA)
790#define G_RM_FOG_PRIM_A GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA)
791#define G_RM_PASS GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
792
793/*
794 * G_SETCONVERT: K0-5
795 */
796#define G_CV_K0 175
797#define G_CV_K1 -43
798#define G_CV_K2 -89
799#define G_CV_K3 222
800#define G_CV_K4 114
801#define G_CV_K5 42
802
803/*
804 * G_SETSCISSOR: interlace mode
805 */
806#define G_SC_NON_INTERLACE 0
807#define G_SC_ODD_INTERLACE 3
808#define G_SC_EVEN_INTERLACE 2
809
810/* flags to inhibit pushing of the display list (on branch) */
811#define G_DL_PUSH 0x00
812#define G_DL_NOPUSH 0x01
813
814#if defined(_MSC_VER) || defined(__GNUC__)
815#define _LANGUAGE_C
816#endif
817
818/*
819 * BEGIN C-specific section: (typedef's)
820 */
821#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
822
823/*
824 * Data Structures
825 *
826 * NOTE:
827 * The DMA transfer hardware requires 64-bit aligned, 64-bit multiple-
828 * sized transfers. This important hardware optimization is unfortunately
829 * reflected in the programming interface, with some structures
830 * padded and alignment enforced.
831 *
832 * Since structures are aligned to the boundary of the "worst-case"
833 * element, we can't depend on the C compiler to align things
834 * properly.
835 *
836 * 64-bit structure alignment is enforced by wrapping structures with
837 * unions that contain a dummy "long long int". Why this works is
838 * explained in the ANSI C Spec, or on page 186 of the second edition
839 * of K&R, "The C Programming Language".
840 *
841 * The price we pay for this is a little awkwardness referencing the
842 * structures through the union. There is no memory penalty, since
843 * all the structures are at least 64-bits the dummy alignment field
844 * does not increase the size of the union.
845 *
846 * Static initialization of these union structures works because
847 * the ANSI C spec states that static initialization for unions
848 * works by using the first union element. We put the dummy alignment
849 * field last for this reason.
850 *
851 * (it's possible a newer 64-bit compiler from MIPS might make this
852 * easier with a flag, but we can't wait for it...)
853 *
854 */
855
856/*
857 * Vertex (set up for use with colors)
858 */
859typedef struct {
860#ifndef GBI_FLOATS
861 short ob[3]; /* x, y, z */
862#else
863 float ob[3]; /* x, y, z */
864#endif
865 unsigned short flag;
866 short tc[2]; /* texture coord */
867 unsigned char cn[4]; /* color & alpha */
868} F3DVtx_t;
869
870/*
871 * Vertex (set up for use with normals)
872 */
873typedef struct {
874#ifndef GBI_FLOATS
875 short ob[3]; /* x, y, z */
876#else
877 float ob[3]; /* x, y, z */
878#endif
879 unsigned short flag;
880 short tc[2]; /* texture coord */
881 signed char n[3]; /* normal */
882 unsigned char a; /* alpha */
883} F3DVtx_tn;
884
885typedef union F3DVtx {
886 F3DVtx_t v; /* Use this one for colors */
887 F3DVtx_tn n; /* Use this one for normals */
889} F3DVtx;
890
891/*
892 * Sprite structure
893 */
894
895typedef struct F3DuSprite_t {
898 short Stride;
905 /* 20 bytes for above */
906
907 /* padding to bring structure size to 64 bit alignment */
908 char dummy[4];
909
910} F3DuSprite_t;
911
912typedef union {
914
915 /* Need to make sure this is 64 bit aligned */
916 long long int force_structure_alignment[3];
917} F3DuSprite;
918
919/*
920 * Triangle face
921 */
922typedef struct {
923 unsigned char flag;
924 unsigned char v[3];
925} F3DTri;
926
927/*
928 * Viewport
929 */
930
931/*
932 *
933 * This magic value is the maximum INTEGER z-range of the hardware
934 * (there are also 16-bits of fraction, which are introduced during
935 * any transformations). This is not just a good idea, it's the law.
936 * Feeding the hardware eventual z-coordinates (after any transforms
937 * or scaling) bigger than this, will not work.
938 *
939 * This number is DIFFERENT than G_MAXFBZ, which is the maximum value
940 * you want to use to initialize the z-buffer.
941 *
942 * The reason these are different is mildly interesting, but too long
943 * to explain here. It is basically the result of optimizations in the
944 * hardware. A more generic API might hide this detail from the users,
945 * but we don't have the ucode to do that...
946 *
947 */
948#define G_MAXZ 0x03ff /* 10 bits of integer screen-Z precision */
949
950/*
951 * The viewport structure elements have 2 bits of fraction, necessary
952 * to accommodate the sub-pixel positioning scaling for the hardware.
953 * This can also be exploited to handle odd-sized viewports.
954 *
955 * Accounting for these fractional bits, using the default projection
956 * and viewing matrices, the viewport structure is initialized thusly:
957 *
958 * (SCREEN_WD/2)*4, (SCREEN_HT/2)*4, G_MAXZ, 0,
959 * (SCREEN_WD/2)*4, (SCREEN_HT/2)*4, 0, 0,
960 */
961typedef struct {
962 short vscale[4]; /* scale, 2 bits fraction */
963 short vtrans[4]; /* translate, 2 bits fraction */
964 /* both the above arrays are padded to 64-bit boundary */
965} F3DVp_t;
966
967typedef union {
970} F3DVp;
971
972/*
973 * MOVEWORD indices
974 *
975 * Each of these indexes an entry in a dmem table
976 * which points to a word in dmem in dmem where
977 * an immediate word will be stored.
978 *
979 */
980#define G_MW_MATRIX 0x00 /* NOTE: also used by movemem */
981#define G_MW_NUMLIGHT 0x02
982#define G_MW_CLIP 0x04
983#define G_MW_SEGMENT 0x06
984#define G_MW_SEGMENT_INTERP 0x07
985#define G_MW_FOG 0x08
986#define G_MW_LIGHTCOL 0x0a
987#define G_MW_PERSPNORM 0x0e
988
989/*
990 * These are offsets from the address in the dmem table
991 */
992#define G_MWO_NUMLIGHT 0x00
993#define G_MWO_CLIP_RNX 0x04
994#define G_MWO_CLIP_RNY 0x0c
995#define G_MWO_CLIP_RPX 0x14
996#define G_MWO_CLIP_RPY 0x1c
997#define G_MWO_SEGMENT_0 0x00
998#define G_MWO_SEGMENT_1 0x01
999#define G_MWO_SEGMENT_2 0x02
1000#define G_MWO_SEGMENT_3 0x03
1001#define G_MWO_SEGMENT_4 0x04
1002#define G_MWO_SEGMENT_5 0x05
1003#define G_MWO_SEGMENT_6 0x06
1004#define G_MWO_SEGMENT_7 0x07
1005#define G_MWO_SEGMENT_8 0x08
1006#define G_MWO_SEGMENT_9 0x09
1007#define G_MWO_SEGMENT_A 0x0a
1008#define G_MWO_SEGMENT_B 0x0b
1009#define G_MWO_SEGMENT_C 0x0c
1010#define G_MWO_SEGMENT_D 0x0d
1011#define G_MWO_SEGMENT_E 0x0e
1012#define G_MWO_SEGMENT_F 0x0f
1013#define G_MWO_FOG 0x00
1014#define G_MWO_aLIGHT_1 0x00
1015#define G_MWO_bLIGHT_1 0x04
1016#define G_MWO_MATRIX_XX_XY_I 0x00
1017#define G_MWO_MATRIX_XZ_XW_I 0x04
1018#define G_MWO_MATRIX_YX_YY_I 0x08
1019#define G_MWO_MATRIX_YZ_YW_I 0x0c
1020#define G_MWO_MATRIX_ZX_ZY_I 0x10
1021#define G_MWO_MATRIX_ZZ_ZW_I 0x14
1022#define G_MWO_MATRIX_WX_WY_I 0x18
1023#define G_MWO_MATRIX_WZ_WW_I 0x1c
1024#define G_MWO_MATRIX_XX_XY_F 0x20
1025#define G_MWO_MATRIX_XZ_XW_F 0x24
1026#define G_MWO_MATRIX_YX_YY_F 0x28
1027#define G_MWO_MATRIX_YZ_YW_F 0x2c
1028#define G_MWO_MATRIX_ZX_ZY_F 0x30
1029#define G_MWO_MATRIX_ZZ_ZW_F 0x34
1030#define G_MWO_MATRIX_WX_WY_F 0x38
1031#define G_MWO_MATRIX_WZ_WW_F 0x3c
1032#define G_MWO_POINT_RGBA 0x10
1033#define G_MWO_POINT_ST 0x14
1034#define G_MWO_POINT_XYSCREEN 0x18
1035#define G_MWO_POINT_ZSCREEN 0x1c
1036
1037/*
1038 * Light structure.
1039 *
1040 * Note: only directional (infinite) lights are currently supported.
1041 *
1042 * Note: the weird order is for the DMEM alignment benefit of
1043 * the microcode.
1044 *
1045 */
1046
1047typedef struct {
1048 unsigned char col[3]; /* diffuse light value (rgba) */
1049 char pad1;
1050 unsigned char colc[3]; /* copy of diffuse light value (rgba) */
1051 char pad2;
1052 signed char dir[3]; /* direction of light (normalized) */
1053 char pad3;
1054} F3DLight_t;
1055
1056typedef struct {
1057 unsigned char col[3];
1058 unsigned char unk3;
1059 unsigned char colc[3];
1060 unsigned char unk7;
1061 short pos[3];
1062 unsigned char unkE;
1064
1065typedef struct {
1066 unsigned char col[3]; /* ambient light value (rgba) */
1067 char pad1;
1068 unsigned char colc[3]; /* copy of ambient light value (rgba) */
1069 char pad2;
1070} F3DAmbient_t;
1071
1072typedef struct {
1073 int x1, y1, x2, y2; /* texture offsets for highlight 1/2 */
1074} F3DHilite_t;
1075
1076typedef union {
1079 long long int force_structure_alignment[2];
1080} F3DLight;
1081
1082typedef union {
1084 long long int force_structure_alignment[1];
1085} F3DAmbient;
1086
1087typedef struct {
1090} F3DLightsn;
1091
1092typedef struct {
1095} F3DLights0;
1096
1097typedef struct {
1100} F3DLights1;
1101
1102typedef struct {
1105} F3DLights2;
1106
1107typedef struct {
1110} F3DLights3;
1111
1112typedef struct {
1115} F3DLights4;
1116
1117typedef struct {
1120} F3DLights5;
1121
1122typedef struct {
1125} F3DLights6;
1126
1127typedef struct {
1130} F3DLights7;
1131
1132typedef struct {
1134} F3DLookAt;
1135
1136typedef union {
1138 long int force_structure_alignment[4];
1139} F3DHilite;
1140
1141#ifdef USE_GBI_TRACE
1142/*
1143 * Trace structure
1144 */
1145typedef struct {
1146 const char* file;
1147 int idx;
1148 bool valid;
1149} F3DTrace;
1150#endif
1151
1152/*
1153 * Generic Gfx Packet
1154 */
1155typedef struct {
1156 uintptr_t w0;
1157 uintptr_t w1;
1158#ifdef USE_GBI_TRACE
1160#endif
1161} F3DGwords;
1162
1163#ifdef __cplusplus
1164#ifdef USE_GBI_TRACE
1165static_assert(sizeof(F3DGwords) == 2 * sizeof(void*) + sizeof(F3DTrace), "Display list size is bad");
1166#else
1167static_assert(sizeof(F3DGwords) == 2 * sizeof(void*), "Display list size is bad");
1168#endif
1169#endif
1170
1171/*
1172 * This union is the fundamental type of the display list.
1173 * It is, by law, exactly 64 bits in size.
1174 */
1175typedef union F3DGfx {
1178} F3DGfx;
1179
1180/*===========================================================================*
1181 * GBI Commands for S2DEX microcode
1182 *===========================================================================*/
1183/* GBI Header */
1184#define G_BGLT_LOADBLOCK 0x0033
1185#define G_BGLT_LOADTILE 0xfff4
1186
1187#define G_BG_FLAG_FLIPS 0x01
1188#define G_BG_FLAG_FLIPT 0x10
1189
1190/* Non scalable background plane */
1191typedef struct {
1192 unsigned short imageX; /* x-coordinate of upper-left position of texture (u10.5) */
1193 unsigned short imageW; /* width of the texture (u10.2) */
1194 short frameX; /* upper-left position of transferred frame (s10.2) */
1195 unsigned short frameW; /* width of transferred frame (u10.2) */
1196
1197 unsigned short imageY; /* y-coordinate of upper-left position of texture (u10.5) */
1198 unsigned short imageH; /* height of the texture (u10.2) */
1199 short frameY; /* upper-left position of transferred frame (s10.2) */
1200 unsigned short frameH; /* height of transferred frame (u10.2) */
1201
1202 unsigned long long int* imagePtr; /* texture source address on DRAM */
1203 unsigned short imageLoad; /* which to use, LoadBlock or LoadTile */
1204 unsigned char imageFmt; /* format of texel - G_IM_FMT_* */
1205 unsigned char imageSiz; /* size of texel - G_IM_SIZ_* */
1206 unsigned short imagePal; /* pallet number */
1207 unsigned short imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */
1208
1209 /* The following is set in the initialization routine guS2DInitBg(). There is no need for the user to set it. */
1210 unsigned short tmemW; /* TMEM width and Word size of frame 1 line.
1211 At LoadBlock, GS_PIX2TMEM(imageW/4,imageSiz)
1212 At LoadTile GS_PIX2TMEM(frameW/4,imageSiz)+1 */
1213 unsigned short tmemH; /* height of TMEM loadable at a time (s13.2) 4 times value
1214 When the normal texture, 512/tmemW*4
1215 When the CI texture, 256/tmemW*4 */
1216 unsigned short tmemLoadSH; /* SH value
1217 At LoadBlock, tmemSize/2-1
1218 At LoadTile, tmemW*16-1 */
1219 unsigned short tmemLoadTH; /* TH value or Stride value
1220 At LoadBlock, GS_CALC_DXT(tmemW)
1221 At LoadTile, tmemH-1 */
1222 unsigned short tmemSizeW; /* skip value of imagePtr for image 1-line
1223 At LoadBlock, tmemW*2
1224 At LoadTile, GS_PIX2TMEM(imageW/4,imageSiz)*2 */
1225 unsigned short tmemSize; /* skip value of imagePtr for 1-loading
1226 = tmemSizeW*tmemH */
1227} F3DuObjBg_t; /* 40 bytes */
1228
1229/* Scalable background plane */
1230typedef struct {
1231 unsigned short imageX; /* x-coordinate of upper-left position of texture (u10.5) */
1232 unsigned short imageW; /* width of texture (u10.2) */
1233 short frameX; /* upper-left position of transferred frame (s10.2) */
1234 unsigned short frameW; /* width of transferred frame (u10.2) */
1235
1236 unsigned short imageY; /* y-coordinate of upper-left position of texture (u10.5) */
1237 unsigned short imageH; /* height of texture (u10.2) */
1238 short frameY; /* upper-left position of transferred frame (s10.2) */
1239 unsigned short frameH; /* height of transferred frame (u10.2) */
1240
1241 unsigned long long int* imagePtr; /* texture source address on DRAM */
1242 unsigned short imageLoad; /* Which to use, LoadBlock or LoadTile? */
1243 unsigned char imageFmt; /* format of texel - G_IM_FMT_* */
1244 unsigned char imageSiz; /* size of texel - G_IM_SIZ_* */
1245 unsigned short imagePal; /* pallet number */
1246 unsigned short imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */
1247
1248 unsigned short scaleW; /* scale value of X-direction (u5.10) */
1249 unsigned short scaleH; /* scale value of Y-direction (u5.10) */
1250 int imageYorig; /* start point of drawing on image (s20.5) */
1251
1252 unsigned char padding[4];
1253
1254} F3DuObjScaleBg_t; /* 40 bytes */
1255
1261
1262/*---------------------------------------------------------------------------*
1263 * 2D Objects
1264 *---------------------------------------------------------------------------*/
1265#define G_OBJ_FLAG_FLIPS 1 << 0 /* inversion to S-direction */
1266#define G_OBJ_FLAG_FLIPT 1 << 4 /* nversion to T-direction */
1267
1268typedef struct {
1269 short objX; /* s10.2 OBJ x-coordinate of upper-left end */
1270 unsigned short scaleW; /* u5.10 Scaling of u5.10 width direction */
1271 unsigned short imageW; /* u10.5 width of u10.5 texture (length of S-direction) */
1272 unsigned short paddingX; /* Unused - Always 0 */
1273 short objY; /* s10.2 OBJ y-coordinate of s10.2 OBJ upper-left end */
1274 unsigned short scaleH; /* u5.10 Scaling of u5.10 height direction */
1275 unsigned short imageH; /* u10.5 height of u10.5 texture (length of T-direction) */
1276 unsigned short paddingY; /* Unused - Always 0 */
1277 unsigned short imageStride; /* folding width of texel (In units of 64bit word) */
1278 unsigned short imageAdrs; /* texture header position in TMEM (In units of 64bit word) */
1279 unsigned char imageFmt; /* format of texel - G_IM_FMT_* */
1280 unsigned char imageSiz; /* size of texel - G_IM_SIZ_* */
1281 unsigned char imagePal; /* pallet number (0-7) */
1282 unsigned char imageFlags; /* The display flag - G_OBJ_FLAG_FLIP* */
1283} F3DuObjSprite_t; /* 24 bytes */
1284
1289
1290/*---------------------------------------------------------------------------*
1291 * 2D Matrix
1292 *---------------------------------------------------------------------------*/
1293typedef struct {
1294 int A, B, C, D; /* s15.16 */
1295 short X, Y; /* s10.2 */
1296 unsigned short BaseScaleX; /* u5.10 */
1297 unsigned short BaseScaleY; /* u5.10 */
1298} F3DuObjMtx_t; /* 24 bytes */
1299
1300typedef union {
1303} F3DuObjMtx;
1304
1305typedef struct {
1306 short X, Y; /* s10.2 */
1307 unsigned short BaseScaleX; /* u5.10 */
1308 unsigned short BaseScaleY; /* u5.10 */
1309} F3DuObjSubMtx_t; /* 8 bytes */
1310
1315
1316/*---------------------------------------------------------------------------*
1317 * Loading into TMEM
1318 *---------------------------------------------------------------------------*/
1319#define G_OBJLT_TXTRBLOCK 0x00001033
1320#define G_OBJLT_TXTRTILE 0x00fc1034
1321#define G_OBJLT_TLUT 0x00000030
1322
1323#define GS_TB_TSIZE(pix, siz) (GS_PIX2TMEM((pix), (siz)) - 1)
1324#define GS_TB_TLINE(pix, siz) (GS_CALC_DXT(GS_PIX2TMEM((pix), (siz))))
1325
1326typedef struct {
1327 unsigned int type; /* G_OBJLT_TXTRBLOCK divided into types */
1328 unsigned long long int* image; /* texture source address on DRAM */
1329 unsigned short tmem; /* loaded TMEM word address (8byteWORD) */
1330 unsigned short tsize; /* Texture size, Specified by macro GS_TB_TSIZE() */
1331 unsigned short tline; /* width of Texture 1-line, Specified by macro GS_TB_TLINE() */
1332 unsigned short sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */
1333 unsigned int flag; /* STATE flag */
1334 unsigned int mask; /* STATE mask */
1335} F3DuObjTxtrBlock_t; /* 24 bytes */
1336
1337#define GS_TT_TWIDTH(pix, siz) ((GS_PIX2TMEM((pix), (siz)) << 2) - 1)
1338#define GS_TT_THEIGHT(pix, siz) (((pix) << 2) - 1)
1339
1340typedef struct {
1341 unsigned int type; /* G_OBJLT_TXTRTILE divided into types */
1342 unsigned long long int* image; /* texture source address on DRAM */
1343 unsigned short tmem; /* loaded TMEM word address (8byteWORD)*/
1344 unsigned short twidth; /* width of Texture (Specified by macro GS_TT_TWIDTH()) */
1345 unsigned short theight; /* height of Texture (Specified by macro GS_TT_THEIGHT()) */
1346 unsigned short sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */
1347 unsigned int flag; /* STATE flag */
1348 unsigned int mask; /* STATE mask */
1349} F3DuObjTxtrTile_t; /* 24 bytes */
1350
1351#define GS_PAL_HEAD(head) ((head) + 256)
1352#define GS_PAL_NUM(num) ((num)-1)
1353
1354typedef struct {
1355 unsigned int type; /* G_OBJLT_TLUT divided into types */
1356 unsigned long long int* image; /* texture source address on DRAM */
1357 unsigned short phead; /* pallet number of load header (Between 256 and 511) */
1358 unsigned short pnum; /* loading pallet number -1 */
1359 unsigned short zero; /* Assign 0 all the time */
1360 unsigned short sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12)*/
1361 unsigned int flag; /* STATE flag */
1362 unsigned int mask; /* STATE mask */
1363} F3DuObjTxtrTLUT_t; /* 24 bytes */
1364
1371
1372/*---------------------------------------------------------------------------*
1373 * Loading into TMEM & 2D Objects
1374 *---------------------------------------------------------------------------*/
1375typedef struct {
1378} F3DuObjTxSprite; /* 48 bytes */
1379}
1380#endif
#define OPCODE(x)
Definition lus_gbi.h:4
Definition gfx_direct3d_common.h:19
constexpr int8_t RDP_G_LOADBLOCK_WIDE
Definition lus_gbi.h:74
constexpr int8_t OTR_G_SETTIMG_OTR_HASH
Definition lus_gbi.h:39
constexpr int8_t OTR_G_POP_SHADER
Definition lus_gbi.h:71
constexpr int8_t RDP_G_SETTIMG
Definition lus_gbi.h:12
constexpr int8_t OTR_G_VTX_OTR_HASH
Definition lus_gbi.h:50
constexpr int8_t RDP_G_SETFOGCOLOR
Definition lus_gbi.h:17
constexpr int8_t RDP_G_RDPSETOTHERMODE
Definition lus_gbi.h:25
constexpr int8_t OTR_G_READFB
Definition lus_gbi.h:66
constexpr int8_t RDP_G_TRI1_WIDE
Definition lus_gbi.h:76
constexpr int8_t RDP_G_SETENVCOLOR
Definition lus_gbi.h:14
constexpr int8_t OTR_G_SETFB
Definition lus_gbi.h:40
constexpr int8_t RDP_G_TEXRECTFLIP
Definition lus_gbi.h:35
constexpr int8_t RDP_G_SETTILESIZE_LERP
Definition lus_gbi.h:77
constexpr int8_t RDP_G_SETCONVERT
Definition lus_gbi.h:28
constexpr int8_t RDP_G_SETKEYR
Definition lus_gbi.h:29
constexpr int8_t OTR_G_INVALTEXCACHE
Definition lus_gbi.h:52
constexpr int8_t RDP_G_SETTARGETINTERPINDEX
Definition lus_gbi.h:73
constexpr int8_t RDP_G_VTX_WIDE
Definition lus_gbi.h:75
constexpr int8_t RDP_G_SETPRIMCOLOR
Definition lus_gbi.h:15
constexpr int8_t RDP_G_SETZIMG
Definition lus_gbi.h:11
constexpr int8_t OTR_G_DL_OTR_HASH
Definition lus_gbi.h:49
constexpr int8_t RDP_G_SETBLENDCOLOR
Definition lus_gbi.h:16
constexpr int8_t RDP_G_FILLRECT
Definition lus_gbi.h:19
constexpr int8_t OTR_G_COPYFB
Definition lus_gbi.h:63
constexpr int8_t RDP_G_LOADTLUT
Definition lus_gbi.h:24
constexpr int8_t OTR_G_MTX_OTR_FILEPATH
Definition lus_gbi.h:48
constexpr int8_t OTR_G_PUSHCD
Definition lus_gbi.h:47
constexpr int8_t RDP_G_SETKEYGB
Definition lus_gbi.h:30
constexpr int8_t OTR_G_EXTRAGEOMETRYMODE
Definition lus_gbi.h:62
constexpr int8_t OTR_G_REGBLENDEDTEX
Definition lus_gbi.h:67
constexpr int8_t RDP_G_SETTILE
Definition lus_gbi.h:20
constexpr int8_t RDP_G_LOADBLOCK
Definition lus_gbi.h:22
constexpr int8_t OTR_G_MARKER
Definition lus_gbi.h:51
constexpr int8_t OTR_G_MOVEMEM_HASH
Definition lus_gbi.h:69
constexpr int8_t RDP_G_RDPTILESYNC
Definition lus_gbi.h:32
constexpr int8_t OTR_G_DL_OTR_FILEPATH
Definition lus_gbi.h:46
constexpr int8_t OTR_G_SETTIMG_FB
Definition lus_gbi.h:42
constexpr int8_t OTR_G_DL_INDEX
Definition lus_gbi.h:65
constexpr int8_t OTR_G_SETTIMG_OTR_FILEPATH
Definition lus_gbi.h:44
constexpr int8_t OTR_G_MTX_OTR
Definition lus_gbi.h:54
constexpr int8_t RDP_G_SETFILLCOLOR
Definition lus_gbi.h:18
constexpr int8_t OTR_G_TRI1_OTR
Definition lus_gbi.h:45
constexpr int8_t OTR_G_VTX_OTR_FILEPATH
Definition lus_gbi.h:43
constexpr int8_t RDP_G_RDPFULLSYNC
Definition lus_gbi.h:31
constexpr int8_t RDP_G_SETCOMBINE
Definition lus_gbi.h:13
constexpr int8_t RDP_G_SETCIMG
Definition lus_gbi.h:10
constexpr int8_t OTR_G_SETGRAYSCALE
Definition lus_gbi.h:61
constexpr int8_t OTR_G_BRANCH_Z_OTR
Definition lus_gbi.h:53
constexpr int8_t OTR_G_FILLWIDERECT
Definition lus_gbi.h:56
constexpr int8_t RDP_G_RDPLOADSYNC
Definition lus_gbi.h:34
constexpr int8_t RDP_G_TEXRECT
Definition lus_gbi.h:36
constexpr int8_t OTR_G_IMAGERECT
Definition lus_gbi.h:64
constexpr int8_t RDP_G_SETSCISSOR
Definition lus_gbi.h:27
constexpr int8_t OTR_G_RESETFB
Definition lus_gbi.h:41
constexpr int8_t RDP_G_RDPPIPESYNC
Definition lus_gbi.h:33
constexpr int8_t RDP_G_SETPRIMDEPTH
Definition lus_gbi.h:26
constexpr int8_t RDP_G_LOADTILE
Definition lus_gbi.h:21
constexpr int8_t OTR_G_TEXRECT_WIDE
Definition lus_gbi.h:55
constexpr int8_t RDP_G_SETTILESIZE
Definition lus_gbi.h:23
constexpr int8_t RDP_G_SETTILESIZE_INTERP
Definition lus_gbi.h:72
constexpr int8_t OTR_G_SETINTENSITY
Definition lus_gbi.h:68
constexpr int8_t OTR_G_PUSH_SHADER
Definition lus_gbi.h:70
Definition lus_gbi.h:1065
char pad2
Definition lus_gbi.h:1069
char pad1
Definition lus_gbi.h:1067
Definition lus_gbi.h:1155
F3DTrace trace
Definition lus_gbi.h:1159
uintptr_t w1
Definition lus_gbi.h:1157
uintptr_t w0
Definition lus_gbi.h:1156
Definition lus_gbi.h:1072
int x1
Definition lus_gbi.h:1073
Definition lus_gbi.h:1047
char pad1
Definition lus_gbi.h:1049
char pad2
Definition lus_gbi.h:1051
char pad3
Definition lus_gbi.h:1053
Definition lus_gbi.h:1092
F3DAmbient a
Definition lus_gbi.h:1093
Definition lus_gbi.h:1097
F3DAmbient a
Definition lus_gbi.h:1098
Definition lus_gbi.h:1102
F3DAmbient a
Definition lus_gbi.h:1103
Definition lus_gbi.h:1107
F3DAmbient a
Definition lus_gbi.h:1108
Definition lus_gbi.h:1112
F3DAmbient a
Definition lus_gbi.h:1113
Definition lus_gbi.h:1117
F3DAmbient a
Definition lus_gbi.h:1118
Definition lus_gbi.h:1122
F3DAmbient a
Definition lus_gbi.h:1123
Definition lus_gbi.h:1127
F3DAmbient a
Definition lus_gbi.h:1128
Definition lus_gbi.h:1087
F3DAmbient a
Definition lus_gbi.h:1088
Definition lus_gbi.h:1132
Definition lus_gbi.h:1056
unsigned char unk3
Definition lus_gbi.h:1058
unsigned char unk7
Definition lus_gbi.h:1060
unsigned char unkE
Definition lus_gbi.h:1062
Definition lus_gbi.h:1145
bool valid
Definition lus_gbi.h:1148
const char * file
Definition lus_gbi.h:1146
int idx
Definition lus_gbi.h:1147
Definition lus_gbi.h:922
unsigned char flag
Definition lus_gbi.h:923
Definition lus_gbi.h:961
Definition lus_gbi.h:859
unsigned short flag
Definition lus_gbi.h:865
Definition lus_gbi.h:873
unsigned char a
Definition lus_gbi.h:882
unsigned short flag
Definition lus_gbi.h:879
Definition lus_gbi.h:1191
unsigned char imageFmt
Definition lus_gbi.h:1204
unsigned short imagePal
Definition lus_gbi.h:1206
unsigned short tmemSizeW
Definition lus_gbi.h:1222
unsigned short tmemLoadSH
Definition lus_gbi.h:1216
unsigned short imageY
Definition lus_gbi.h:1197
unsigned short imageX
Definition lus_gbi.h:1192
unsigned short tmemSize
Definition lus_gbi.h:1225
unsigned short frameW
Definition lus_gbi.h:1195
unsigned short imageH
Definition lus_gbi.h:1198
short frameY
Definition lus_gbi.h:1199
unsigned char imageSiz
Definition lus_gbi.h:1205
unsigned short tmemH
Definition lus_gbi.h:1213
unsigned short imageW
Definition lus_gbi.h:1193
unsigned short imageLoad
Definition lus_gbi.h:1203
unsigned long long int * imagePtr
Definition lus_gbi.h:1202
unsigned short imageFlip
Definition lus_gbi.h:1207
unsigned short tmemW
Definition lus_gbi.h:1210
unsigned short tmemLoadTH
Definition lus_gbi.h:1219
unsigned short frameH
Definition lus_gbi.h:1200
short frameX
Definition lus_gbi.h:1194
Definition lus_gbi.h:1293
short X
Definition lus_gbi.h:1295
unsigned short BaseScaleX
Definition lus_gbi.h:1296
int A
Definition lus_gbi.h:1294
unsigned short BaseScaleY
Definition lus_gbi.h:1297
Definition lus_gbi.h:1230
unsigned char imageSiz
Definition lus_gbi.h:1244
short frameY
Definition lus_gbi.h:1238
unsigned short frameW
Definition lus_gbi.h:1234
unsigned short imageX
Definition lus_gbi.h:1231
unsigned short frameH
Definition lus_gbi.h:1239
short frameX
Definition lus_gbi.h:1233
unsigned short scaleH
Definition lus_gbi.h:1249
unsigned char imageFmt
Definition lus_gbi.h:1243
unsigned short imageFlip
Definition lus_gbi.h:1246
unsigned short scaleW
Definition lus_gbi.h:1248
unsigned long long int * imagePtr
Definition lus_gbi.h:1241
unsigned short imageW
Definition lus_gbi.h:1232
unsigned short imageH
Definition lus_gbi.h:1237
unsigned short imageLoad
Definition lus_gbi.h:1242
unsigned short imageY
Definition lus_gbi.h:1236
int imageYorig
Definition lus_gbi.h:1250
unsigned short imagePal
Definition lus_gbi.h:1245
Definition lus_gbi.h:1268
unsigned short scaleH
Definition lus_gbi.h:1274
unsigned short imageAdrs
Definition lus_gbi.h:1278
unsigned short scaleW
Definition lus_gbi.h:1270
short objX
Definition lus_gbi.h:1269
short objY
Definition lus_gbi.h:1273
unsigned short imageH
Definition lus_gbi.h:1275
unsigned short paddingY
Definition lus_gbi.h:1276
unsigned char imagePal
Definition lus_gbi.h:1281
unsigned char imageSiz
Definition lus_gbi.h:1280
unsigned short imageStride
Definition lus_gbi.h:1277
unsigned char imageFlags
Definition lus_gbi.h:1282
unsigned short paddingX
Definition lus_gbi.h:1272
unsigned char imageFmt
Definition lus_gbi.h:1279
unsigned short imageW
Definition lus_gbi.h:1271
Definition lus_gbi.h:1305
unsigned short BaseScaleY
Definition lus_gbi.h:1308
unsigned short BaseScaleX
Definition lus_gbi.h:1307
short X
Definition lus_gbi.h:1306
Definition lus_gbi.h:1375
F3DuObjSprite sprite
Definition lus_gbi.h:1377
F3DuObjTxtr txtr
Definition lus_gbi.h:1376
Definition lus_gbi.h:1326
unsigned int type
Definition lus_gbi.h:1327
unsigned short tline
Definition lus_gbi.h:1331
unsigned short tsize
Definition lus_gbi.h:1330
unsigned short tmem
Definition lus_gbi.h:1329
unsigned long long int * image
Definition lus_gbi.h:1328
unsigned short sid
Definition lus_gbi.h:1332
unsigned int mask
Definition lus_gbi.h:1334
unsigned int flag
Definition lus_gbi.h:1333
Definition lus_gbi.h:1354
unsigned long long int * image
Definition lus_gbi.h:1356
unsigned short sid
Definition lus_gbi.h:1360
unsigned int type
Definition lus_gbi.h:1355
unsigned int flag
Definition lus_gbi.h:1361
unsigned short pnum
Definition lus_gbi.h:1358
unsigned int mask
Definition lus_gbi.h:1362
unsigned short phead
Definition lus_gbi.h:1357
unsigned short zero
Definition lus_gbi.h:1359
Definition lus_gbi.h:1340
unsigned int mask
Definition lus_gbi.h:1348
unsigned short tmem
Definition lus_gbi.h:1343
unsigned short theight
Definition lus_gbi.h:1345
unsigned short twidth
Definition lus_gbi.h:1344
unsigned long long int * image
Definition lus_gbi.h:1342
unsigned short sid
Definition lus_gbi.h:1346
unsigned int flag
Definition lus_gbi.h:1347
unsigned int type
Definition lus_gbi.h:1341
Definition lus_gbi.h:895
void * SourceImagePointer
Definition lus_gbi.h:896
char SourceImageBitSize
Definition lus_gbi.h:902
short SourceImageOffsetS
Definition lus_gbi.h:903
char dummy[4]
Definition lus_gbi.h:908
short SourceImageOffsetT
Definition lus_gbi.h:904
short SubImageWidth
Definition lus_gbi.h:899
short SubImageHeight
Definition lus_gbi.h:900
char SourceImageType
Definition lus_gbi.h:901
short Stride
Definition lus_gbi.h:898
void * TlutPointer
Definition lus_gbi.h:897
Definition lus_gbi.h:1082
F3DAmbient_t l
Definition lus_gbi.h:1083
Definition lus_gbi.h:1175
F3DGwords words
Definition lus_gbi.h:1176
long long int force_structure_alignment
Definition lus_gbi.h:1177
Definition lus_gbi.h:1136
F3DHilite_t h
Definition lus_gbi.h:1137
Definition lus_gbi.h:1076
F3DLight_t l
Definition lus_gbi.h:1077
F3DPointLight_t p
Definition lus_gbi.h:1078
Definition lus_gbi.h:967
F3DVp_t vp
Definition lus_gbi.h:968
long long int force_structure_alignment
Definition lus_gbi.h:969
Definition lus_gbi.h:885
F3DVtx_tn n
Definition lus_gbi.h:887
long long int force_structure_alignment
Definition lus_gbi.h:888
F3DVtx_t v
Definition lus_gbi.h:886
Definition lus_gbi.h:1256
F3DuObjScaleBg_t s
Definition lus_gbi.h:1258
F3DuObjBg_t b
Definition lus_gbi.h:1257
long long int force_structure_alignment
Definition lus_gbi.h:1259
Definition lus_gbi.h:1300
long long int force_structure_alignment
Definition lus_gbi.h:1302
F3DuObjMtx_t m
Definition lus_gbi.h:1301
Definition lus_gbi.h:1285
long long int force_structure_alignment
Definition lus_gbi.h:1287
F3DuObjSprite_t s
Definition lus_gbi.h:1286
Definition lus_gbi.h:1311
F3DuObjSubMtx_t m
Definition lus_gbi.h:1312
long long int force_structure_alignment
Definition lus_gbi.h:1313
Definition lus_gbi.h:1365
long long int force_structure_alignment
Definition lus_gbi.h:1369
F3DuObjTxtrTile_t tile
Definition lus_gbi.h:1367
F3DuObjTxtrTLUT_t tlut
Definition lus_gbi.h:1368
F3DuObjTxtrBlock_t block
Definition lus_gbi.h:1366
Definition lus_gbi.h:912
F3DuSprite_t s
Definition lus_gbi.h:913