1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - GX -
3 File: g3.h
4
5 Copyright 2003-2008 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Date:: 2008-09-18#$
14 $Rev: 8573 $
15 $Author: okubata_ryoma $
16 *---------------------------------------------------------------------------*/
17
18 #ifndef NITRO_G3_H_
19 #define NITRO_G3_H_
20
21 #include <nitro/gx/gxcommon.h>
22 #include <nitro/hw/ARM9/ioreg_G3.h>
23
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27
28 //----------------------------------------------------------------------------
29 // Definition of Geometry Commands
30 //----------------------------------------------------------------------------
31 /* Command Name */
32 #define G3OP_NOP 0x00 /* Nop */
33
34 #define G3OP_MTX_MODE 0x10 /* MatrixMode */
35 #define G3OP_MTX_PUSH 0x11 /* PushMatrix */
36 #define G3OP_MTX_POP 0x12 /* PopMatrix */
37 #define G3OP_MTX_STORE 0x13 /* StoreMatrix */
38 #define G3OP_MTX_RESTORE 0x14 /* RestoreMatrix */
39 #define G3OP_MTX_IDENTITY 0x15 /* Identity */
40 #define G3OP_MTX_LOAD_4x4 0x16 /* LoadMatrix44 */
41 #define G3OP_MTX_LOAD_4x3 0x17 /* LoadMatrix43 */
42 #define G3OP_MTX_MULT_4x4 0x18 /* MultMatrix44 */
43 #define G3OP_MTX_MULT_4x3 0x19 /* MultMatrix43 */
44 #define G3OP_MTX_MULT_3x3 0x1a /* MultMatrix33 */
45 #define G3OP_MTX_SCALE 0x1b /* Scale */
46 #define G3OP_MTX_TRANS 0x1c /* Translate */
47
48 #define G3OP_COLOR 0x20 /* Color */
49 #define G3OP_NORMAL 0x21 /* Normal */
50 #define G3OP_TEXCOORD 0x22 /* TexCoord */
51 #define G3OP_VTX_16 0x23 /* Vertex */
52 #define G3OP_VTX_10 0x24 /* VertexShort */
53 #define G3OP_VTX_XY 0x25 /* VertexXY */
54 #define G3OP_VTX_XZ 0x26 /* VertexXZ */
55 #define G3OP_VTX_YZ 0x27 /* VertexYZ */
56 #define G3OP_VTX_DIFF 0x28 /* VertexDiff */
57 #define G3OP_POLYGON_ATTR 0x29 /* PolygonAttr */
58 #define G3OP_TEXIMAGE_PARAM 0x2a /* TexImageParam */
59 #define G3OP_TEXPLTT_BASE 0x2b /* TexPlttBase */
60
61 #define G3OP_DIF_AMB 0x30 /* MaterialColor0 */
62 #define G3OP_SPE_EMI 0x31 /* MaterialColor1 */
63 #define G3OP_LIGHT_VECTOR 0x32 /* LightVector */
64 #define G3OP_LIGHT_COLOR 0x33 /* LightColor */
65 #define G3OP_SHININESS 0x34 /* Shininess */
66
67 #define G3OP_BEGIN 0x40 /* Begin */
68 #define G3OP_END 0x41 /* End */
69
70 #define G3OP_SWAP_BUFFERS 0x50 /* SwapBuffers */
71
72 #define G3OP_VIEWPORT 0x60 /* Viewport */
73
74 #define G3OP_BOX_TEST 0x70 /* BoxTest */
75 #define G3OP_POS_TEST 0x71 /* PositionTest */
76 #define G3OP_VEC_TEST 0x72 /* VectorTest */
77
78 #define G3OP_DUMMY_COMMAND 0xFF /* duummy command */
79
80 //----------------------------------------------------------------------------
81 // the number of the parameters of the commands
82 //----------------------------------------------------------------------------
83 /* Command Name */
84 #define G3OP_NOP_NPARAMS 0 /* Nop */
85
86 #define G3OP_MTX_MODE_NPARAMS 1 /* MatrixMode */
87 #define G3OP_MTX_PUSH_NPARAMS 0 /* PushMatrix */
88 #define G3OP_MTX_POP_NPARAMS 1 /* PopMatrix */
89 #define G3OP_MTX_STORE_NPARAMS 1 /* StoreMatrix */
90 #define G3OP_MTX_RESTORE_NPARAMS 1 /* RestoreMatrix */
91 #define G3OP_MTX_IDENTITY_NPARAMS 0 /* Identity */
92 #define G3OP_MTX_LOAD_4x4_NPARAMS 16 /* LoadMatrix44 */
93 #define G3OP_MTX_LOAD_4x3_NPARAMS 12 /* LoadMatrix43 */
94 #define G3OP_MTX_MULT_4x4_NPARAMS 16 /* MultMatrix44 */
95 #define G3OP_MTX_MULT_4x3_NPARAMS 12 /* MultMatrix43 */
96 #define G3OP_MTX_MULT_3x3_NPARAMS 9 /* MultMatrix33 */
97 #define G3OP_MTX_SCALE_NPARAMS 3 /* Scale */
98 #define G3OP_MTX_TRANS_NPARAMS 3 /* Translate */
99
100 #define G3OP_COLOR_NPARAMS 1 /* Color */
101 #define G3OP_NORMAL_NPARAMS 1 /* Normal */
102 #define G3OP_TEXCOORD_NPARAMS 1 /* TexCoord */
103 #define G3OP_VTX_16_NPARAMS 2 /* Vertex */
104 #define G3OP_VTX_10_NPARAMS 1 /* VertexShort */
105 #define G3OP_VTX_XY_NPARAMS 1 /* VertexXY */
106 #define G3OP_VTX_XZ_NPARAMS 1 /* VertexXZ */
107 #define G3OP_VTX_YZ_NPARAMS 1 /* VertexYZ */
108 #define G3OP_VTX_DIFF_NPARAMS 1 /* VertexDiff */
109 #define G3OP_POLYGON_ATTR_NPARAMS 1 /* PolygonAttr */
110 #define G3OP_TEXIMAGE_PARAM_NPARAMS 1 /* TexImageParam */
111 #define G3OP_TEXPLTT_BASE_NPARAMS 1 /* TexPlttBase */
112
113 #define G3OP_DIF_AMB_NPARAMS 1 /* MaterialColor0 */
114 #define G3OP_SPE_EMI_NPARAMS 1 /* MaterialColor1 */
115 #define G3OP_LIGHT_VECTOR_NPARAMS 1 /* LightVector */
116 #define G3OP_LIGHT_COLOR_NPARAMS 1 /* LightColor */
117 #define G3OP_SHININESS_NPARAMS 32 /* Shininess */
118
119 #define G3OP_BEGIN_NPARAMS 1 /* Begin */
120 #define G3OP_END_NPARAMS 0 /* End */
121
122 #define G3OP_SWAP_BUFFERS_NPARAMS 1 /* SwapBuffers */
123
124 #define G3OP_VIEWPORT_NPARAMS 1 /* Viewport */
125
126 #define G3OP_BOX_TEST_NPARAMS 3 /* BoxTest */
127 #define G3OP_POS_TEST_NPARAMS 2 /* PositionTest */
128 #define G3OP_VEC_TEST_NPARAMS 1 /* VectorTest */
129
130 // notice that this assert is not perfect
131 #define GX_VALID_OPCODE_ASSERT(x) SDK_ASSERT((x == 0xFF) || ((x >= 0) && (x <= 0x72)))
132
133 //----------------------------------------------------------------------------
134 // Parameters for G3_MtxMode
135 //----------------------------------------------------------------------------
136 typedef enum
137 {
138 GX_MTXMODE_PROJECTION = 0,
139 GX_MTXMODE_POSITION = 1,
140 GX_MTXMODE_POSITION_VECTOR = 2,
141 GX_MTXMODE_TEXTURE = 3
142 }
143 GXMtxMode;
144
145 #define GX_MTXMODE_ASSERT(x) \
146 SDK_MINMAX_ASSERT(x, GX_MTXMODE_PROJECTION, GX_MTXMODE_TEXTURE)
147
148
149 //----------------------------------------------------------------------------
150 // Parameters for G3_PopMtx
151 //----------------------------------------------------------------------------
152
153 #define GX_MTX_POP_NUM_ASSERT(x) SDK_MINMAX_ASSERT(x, -30, 31)
154
155 //----------------------------------------------------------------------------
156 // Parameters for G3_StoreMtx
157 //----------------------------------------------------------------------------
158
159 #define GX_MTX_STORE_NUM_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 30)
160
161 //----------------------------------------------------------------------------
162 // Parameters for G3_RestoreMtx
163 //----------------------------------------------------------------------------
164 #define GX_MTX_RESTORE_NUM_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 30)
165
166 //----------------------------------------------------------------------------
167 // Parameters for G3_Begin
168 //----------------------------------------------------------------------------
169 typedef enum
170 {
171 GX_BEGIN_TRIANGLES = 0,
172 GX_BEGIN_QUADS = 1,
173 GX_BEGIN_TRIANGLE_STRIP = 2,
174 GX_BEGIN_QUAD_STRIP = 3
175 }
176 GXBegin;
177
178 #define GX_BEGIN_ASSERT(x) \
179 SDK_MINMAX_ASSERT(x, GX_BEGIN_TRIANGLES, GX_BEGIN_QUAD_STRIP)
180
181 //----------------------------------------------------------------------------
182 // Parameters for G3_SwapBuffers
183 //----------------------------------------------------------------------------
184 typedef enum
185 {
186 GX_SORTMODE_AUTO = 0,
187 GX_SORTMODE_MANUAL = 1
188 }
189 GXSortMode;
190
191 #define GX_SORTMODE_ASSERT(x) \
192 SDK_MINMAX_ASSERT(x, GX_SORTMODE_AUTO, GX_SORTMODE_MANUAL)
193
194 typedef enum
195 {
196 GX_BUFFERMODE_Z = 0,
197 GX_BUFFERMODE_W = 1
198 }
199 GXBufferMode;
200
201 #define GX_BUFFERMODE_ASSERT(x) \
202 SDK_MINMAX_ASSERT(x, GX_BUFFERMODE_Z, GX_BUFFERMODE_W)
203
204 //----------------------------------------------------------------------------
205 // Parameters for G3_ViewPort
206 //----------------------------------------------------------------------------
207 #define GX_VIEWPORT_ASSERT(x1, y1, x2, y2) \
208 SDK_ASSERT( (x1) < (x2) && (y1) < (y2) && \
209 (x1) >= 0 && (x2) < 256 && \
210 (y1) >= 0 && (y2) < 192 )
211
212 //----------------------------------------------------------------------------
213 // Parameters for G3_PolygonAttr
214 //----------------------------------------------------------------------------
215 #define GX_POLYGON_ATTR_POLYGONID_ASSERT(x) GX_POLYGONID_ASSERT(x)
216 #define GX_POLYGON_ATTR_ALPHA_ASSERT(x) GX_ALPHA_ASSERT(x)
217
218 typedef enum
219 {
220 GX_LIGHTMASK_NONE = 0,
221 GX_LIGHTMASK_0 = 1,
222 GX_LIGHTMASK_1 = 2,
223 GX_LIGHTMASK_01 = 3,
224 GX_LIGHTMASK_2 = 4,
225 GX_LIGHTMASK_02 = 5,
226 GX_LIGHTMASK_12 = 6,
227 GX_LIGHTMASK_012 = 7,
228 GX_LIGHTMASK_3 = 8,
229 GX_LIGHTMASK_03 = 9,
230 GX_LIGHTMASK_13 = 10,
231 GX_LIGHTMASK_013 = 11,
232 GX_LIGHTMASK_23 = 12,
233 GX_LIGHTMASK_023 = 13,
234 GX_LIGHTMASK_123 = 14,
235 GX_LIGHTMASK_0123 = 15
236 }
237 GXLightMask;
238
239 #define GX_LIGHTMASK_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 15)
240
241
242 typedef enum
243 {
244 GX_POLYGONMODE_MODULATE = 0,
245 GX_POLYGONMODE_DECAL = 1,
246 GX_POLYGONMODE_TOON = 2,
247 GX_POLYGONMODE_SHADOW = 3
248 }
249 GXPolygonMode;
250
251 #define GX_POLYGONMODE_ASSERT(x) \
252 SDK_MINMAX_ASSERT(x, GX_POLYGONMODE_MODULATE, GX_POLYGONMODE_SHADOW)
253
254
255 typedef enum
256 {
257 GX_CULL_ALL = 0,
258 GX_CULL_FRONT = 1,
259 GX_CULL_BACK = 2,
260 GX_CULL_NONE = 3
261 }
262 GXCull;
263
264 #define GX_CULL_ASSERT(x) \
265 SDK_MINMAX_ASSERT(x, GX_CULL_ALL, GX_CULL_NONE)
266
267
268 typedef enum
269 {
270 GX_POLYGON_ATTR_MISC_NONE = 0,
271 GX_POLYGON_ATTR_MISC_XLU_DEPTH_UPDATE = 1 << REG_G3_POLYGON_ATTR_XL_SHIFT,
272 GX_POLYGON_ATTR_MISC_FAR_CLIPPING = 1 << REG_G3_POLYGON_ATTR_FC_SHIFT,
273 GX_POLYGON_ATTR_MISC_DISP_1DOT = 1 << REG_G3_POLYGON_ATTR_D1_SHIFT,
274 GX_POLYGON_ATTR_MISC_DEPTHTEST_DECAL = 1 << REG_G3_POLYGON_ATTR_DT_SHIFT,
275 GX_POLYGON_ATTR_MISC_FOG = 1 << REG_G3_POLYGON_ATTR_FE_SHIFT
276 }
277 GXPolygonAttrMisc;
278
279 //----------------------------------------------------------------------------
280 // Parameters for G3_TexImageParam
281 //----------------------------------------------------------------------------
282 typedef enum
283 {
284 GX_TEXREPEAT_NONE = 0,
285 GX_TEXREPEAT_S = 1,
286 GX_TEXREPEAT_T = 2,
287 GX_TEXREPEAT_ST = 3
288 }
289 GXTexRepeat;
290
291 #define GX_TEXREPEAT_ASSERT(x) \
292 SDK_MINMAX_ASSERT(x, GX_TEXREPEAT_NONE, GX_TEXREPEAT_ST)
293
294
295 typedef enum
296 {
297 GX_TEXFLIP_NONE = 0,
298 GX_TEXFLIP_S = 1,
299 GX_TEXFLIP_T = 2,
300 GX_TEXFLIP_ST = 3
301 }
302 GXTexFlip;
303
304 #define GX_TEXFLIP_ASSERT(x) \
305 SDK_MINMAX_ASSERT(x, GX_TEXFLIP_NONE,GX_TEXFLIP_ST)
306
307
308 typedef enum
309 {
310 GX_TEXSIZE_S8 = 0,
311 GX_TEXSIZE_S16 = 1,
312 GX_TEXSIZE_S32 = 2,
313 GX_TEXSIZE_S64 = 3,
314 GX_TEXSIZE_S128 = 4,
315 GX_TEXSIZE_S256 = 5,
316 GX_TEXSIZE_S512 = 6,
317 GX_TEXSIZE_S1024 = 7
318 }
319 GXTexSizeS;
320
321 #define GX_TEXSIZE_S_ASSERT(x) \
322 SDK_MINMAX_ASSERT(x, GX_TEXSIZE_S8, GX_TEXSIZE_S1024)
323
324
325 typedef enum
326 {
327 GX_TEXSIZE_T8 = 0,
328 GX_TEXSIZE_T16 = 1,
329 GX_TEXSIZE_T32 = 2,
330 GX_TEXSIZE_T64 = 3,
331 GX_TEXSIZE_T128 = 4,
332 GX_TEXSIZE_T256 = 5,
333 GX_TEXSIZE_T512 = 6,
334 GX_TEXSIZE_T1024 = 7
335 }
336 GXTexSizeT;
337
338 #define GX_TEXSIZE_T_ASSERT(x) \
339 SDK_MINMAX_ASSERT(x, GX_TEXSIZE_T8, GX_TEXSIZE_T1024)
340
341
342 typedef enum
343 {
344 GX_TEXFMT_NONE = 0,
345 GX_TEXFMT_A3I5 = 1,
346 GX_TEXFMT_PLTT4 = 2,
347 GX_TEXFMT_PLTT16 = 3,
348 GX_TEXFMT_PLTT256 = 4,
349 GX_TEXFMT_COMP4x4 = 5,
350 GX_TEXFMT_A5I3 = 6,
351 GX_TEXFMT_DIRECT = 7
352 }
353 GXTexFmt;
354
355 #define GX_TEXFMT_ALPHA ((GXTexFmt)GX_TEXFMT_A5I3) // Obsolete name
356
357 #define GX_TEXFMT_ASSERT(x) \
358 SDK_MINMAX_ASSERT(x, GX_TEXFMT_NONE, GX_TEXFMT_DIRECT)
359
360
361 typedef enum
362 {
363 GX_TEXPLTTCOLOR0_USE = 0,
364 GX_TEXPLTTCOLOR0_TRNS = 1
365 }
366 GXTexPlttColor0;
367
368 #define GX_TEXPLTTCOLOR0_ASSERT(x) \
369 SDK_MINMAX_ASSERT(x, GX_TEXPLTTCOLOR0_USE, GX_TEXPLTTCOLOR0_TRNS)
370
371
372 typedef enum
373 {
374 GX_TEXGEN_NONE = 0,
375 GX_TEXGEN_TEXCOORD = 1,
376 GX_TEXGEN_NORMAL = 2,
377 GX_TEXGEN_VERTEX = 3
378 }
379 GXTexGen;
380
381 #define GX_TEXGEN_ASSERT(x) \
382 SDK_MINMAX_ASSERT(x, GX_TEXGEN_NONE, GX_TEXGEN_VERTEX)
383
384
385 #define GX_TEXIMAGE_PARAM_ADDR_ASSERT(addr) \
386 SDK_ASSERT(((addr) & 0x7) == 0 && (addr) >= 0 && (addr) < 0x80000)
387
388
389 //----------------------------------------------------------------------------
390 // Light ID
391 //----------------------------------------------------------------------------
392 typedef enum
393 {
394 GX_LIGHTID_0 = 0,
395 GX_LIGHTID_1 = 1,
396 GX_LIGHTID_2 = 2,
397 GX_LIGHTID_3 = 3
398 }
399 GXLightId;
400
401 #define GX_LIGHTID_ASSERT(x) \
402 SDK_MINMAX_ASSERT(x, GX_LIGHTID_0, GX_LIGHTID_3)
403
404 //----------------------------------------------------------------------------
405 // Structure for BoxTest command
406 //----------------------------------------------------------------------------
407 #ifdef SDK_ADS
408 typedef struct
409 {
410 u32 val[3];
411 }
412 GXBoxTestParam;
413 #else
414 typedef union
415 {
416 u32 val[3];
417 struct
418 {
419 fx16 x;
420 fx16 y;
421 fx16 z;
422 fx16 width;
423 fx16 height;
424 fx16 depth;
425 };
426 }
427 GXBoxTestParam;
428 #endif
429
430 //----------------------------------------------------------------------------
431 // Structure for G3BS, G3B, G3CS, G3C
432 //----------------------------------------------------------------------------
433 typedef struct
434 {
435 u8 *curr_cmd;
436 u32 *curr_param;
437 u32 *bottom;
438 u32 length;
439 BOOL param0_cmd_flg;
440 }
441 GXDLInfo;
442
443 /* types for TexCoord */
444 typedef u32 GXSt;
445 /* types for G3*_TexPlttBaseImm */
446 typedef u32 GXTexPlttBaseParam;
447 #define GX_TEXPLTTBASEPARAM_ASSERT(x) SDK_ASSERT((x) < 0xe000)
448
449 //----------------------------------------------------------------------------
450 // 3D vector of s3.6 fixed point
451 //----------------------------------------------------------------------------
452 typedef u32 VecVtx10;
453 #define GX_VTX10_SHIFT 6
454 #define GX_VTX10_INT_SIZE 3
455 #define GX_VTX10_DEC_SIZE 6
456
457 #define GX_VTX10_INT_MASK 0x01c0
458 #define GX_VTX10_DEC_MASK 0x003f
459 #define GX_VTX10_SIGN_MASK 0x0200
460 #define GX_VTX10_MASK (GX_VTX10_INT_MASK | GX_VTX10_DEC_MASK | GX_VTX10_SIGN_MASK)
461
462 #define GX_VTX10_MAX ((fx32)(0x00007fc0))
463 #define GX_VTX10_MIN ((fx32)(0xffff8000))
464
465 #define GX_VEC_VTX10_X_SHIFT 0
466 #define GX_VEC_VTX10_Y_SHIFT 10
467 #define GX_VEC_VTX10_Z_SHIFT 20
468
469 //----------------------------------------------------------------------------
470 // For parameters of G3OP_VTX_XY, G3OP_VTX_XZ, G3OP_VTX_YZ
471 //----------------------------------------------------------------------------
472 #define GX_FX16PAIR(a, b) ((u32)((u32)(u16)(a) | ((u32)(u16)(b) << 16)))
473
474 //----------------------------------------------------------------------------
475 // To generate a parameter of G3*_Vtx10
476 // x : fx32/16, y : fx32/16, z : fx32/16
477 //----------------------------------------------------------------------------
478 #define GX_VECVTX10(x, y, z) \
479 ((VecVtx10) (((((x) >> (FX32_DEC_SIZE - GX_VTX10_DEC_SIZE)) & GX_VTX10_MASK) << GX_VEC_VTX10_X_SHIFT) | \
480 ((((y) >> (FX32_DEC_SIZE - GX_VTX10_DEC_SIZE)) & GX_VTX10_MASK) << GX_VEC_VTX10_Y_SHIFT) | \
481 ((((z) >> (FX32_DEC_SIZE - GX_VTX10_DEC_SIZE)) & GX_VTX10_MASK) << GX_VEC_VTX10_Z_SHIFT)))
482
483
484 //----------------------------------------------------------------------------
485 // 3D vector of s0.0009 fixed point
486 //----------------------------------------------------------------------------
487 typedef u32 VecVtxDiff;
488 #define GX_VTXDIFF_MASK 0x03ff
489
490 #define GX_VTXDIFF_MAX ((fx32)(0x000001ff))
491 #define GX_VTXDIFF_MIN ((fx32)(0xfffffe00))
492
493 #define GX_VEC_VTXDIFF_X_SHIFT 0
494 #define GX_VEC_VTXDIFF_Y_SHIFT 10
495 #define GX_VEC_VTXDIFF_Z_SHIFT 20
496
497 #define GX_VECVTXDIFF(x, y, z) \
498 ((VecVtxDiff) ((((x) & GX_VTXDIFF_MASK) << GX_VEC_VTXDIFF_X_SHIFT) | \
499 (((y) & GX_VTXDIFF_MASK) << GX_VEC_VTXDIFF_Y_SHIFT) | \
500 (((z) & GX_VTXDIFF_MASK) << GX_VEC_VTXDIFF_Z_SHIFT)))
501
502 //----------------------------------------------------------------------------
503 // TexCoord
504 //----------------------------------------------------------------------------
505
506 #define GX_FX16ST(x) ((s16)((x) >> 8))
507 // s: fx32/fx16, t: fx32/fx16
508 #define GX_ST(s, t) ((GXSt)((u16)GX_FX16ST(s) | ((u16)GX_FX16ST(t) << 16)))
509
510 //----------------------------------------------------------------------------
511 // 4x4COMP Pltt index address(offset) computation
512 //----------------------------------------------------------------------------
513
514 #define GX_COMP4x4_PLTT_IDX(image) \
515 ((u32)(0x20000 + (((image) & 0x1ffff) >> 1) + (((image) & 0x40000) >> 2)))
516
517 //----------------------------------------------------------------------------
518 // Parameter packing macros (for static display lists)
519 //----------------------------------------------------------------------------
520
521 #define GX_PACK_OP(op1, op2, op3, op4) \
522 ((u32)((op1) | ((op2) << 8) | ((op3) << 16) | ((op4) << 24)))
523 #define GX_PACK_SWAPBUFFERS_PARAM(am, zw) \
524 ((u32) (((am) << REG_G3_SWAP_BUFFERS_XS_SHIFT) | \
525 ((zw) << REG_G3_SWAP_BUFFERS_DP_SHIFT)))
526 #define GX_PACK_MTXMODE_PARAM(mode) ((u32) ((mode) << REG_G3_MTX_MODE_M_SHIFT))
527 #define GX_PACK_POPMTX_PARAM(num) ((u32) (num))
528 #define GX_PACK_STOREMTX_PARAM(num) ((u32) (num))
529 #define GX_PACK_RESTOREMTX_PARAM(num) ((u32) (num))
530 #define GX_PACK_LIGHTVECTOR_PARAM(lightID, x, y, z) \
531 ((u32)GX_VECFX10((x), (y), (z)) | \
532 ((u32)(lightID) << REG_G3_LIGHT_VECTOR_LNUM_SHIFT))
533 #define GX_PACK_LIGHTCOLOR_PARAM(lightID, rgb) \
534 ((u32)((rgb) | \
535 ((u32)(lightID) << REG_G3_LIGHT_COLOR_LNUM_SHIFT)))
536 #define GX_PACK_DIFFAMB_PARAM(diffuse, ambient, IsSetVtxColor) \
537 ((u32)((diffuse) | \
538 ((ambient) << REG_G3_DIF_AMB_AMBIENT_RED_SHIFT) | \
539 ((IsSetVtxColor != FALSE) << REG_G3_DIF_AMB_C_SHIFT)))
540 #define GX_PACK_SPECEMI_PARAM(specular, emission, IsShininess) \
541 ((u32)((specular) | \
542 ((emission) << REG_G3_SPE_EMI_EMISSION_RED_SHIFT) | \
543 ((IsShininess != FALSE) << REG_G3_SPE_EMI_S_SHIFT)))
544 #define GX_PACK_POLYGONATTR_PARAM(light, polyMode, cullMode, polygonID, alpha, misc) \
545 ((u32)(((light) << REG_G3_POLYGON_ATTR_LE_SHIFT) | \
546 ((polyMode) << REG_G3_POLYGON_ATTR_PM_SHIFT) | \
547 ((cullMode) << REG_G3_POLYGON_ATTR_BK_SHIFT) | \
548 (misc) | \
549 ((polygonID) << REG_G3_POLYGON_ATTR_ID_SHIFT) | \
550 ((alpha) << REG_G3_POLYGON_ATTR_ALPHA_SHIFT)))
551 #define GX_PACK_BEGIN_PARAM(primitive) \
552 ((u32)((primitive) << REG_G3_BEGIN_VTXS_TYPE_SHIFT))
553 #define GX_PACK_COLOR_PARAM(rgb) ((u32)(rgb))
554 #define GX_PACK_NORMAL_PARAM(x, y, z) ((u32)GX_VECFX10((x), (y), (z)))
555 #define GX_PACK_VTX10_PARAM(x, y, z) ((u32)GX_VECVTX10((x), (y), (z)))
556 #define GX_PACK_VTXXY_PARAM(x, y) (GX_FX16PAIR((x), (y)))
557 #define GX_PACK_VTXXZ_PARAM(x, z) (GX_FX16PAIR((x), (z)))
558 #define GX_PACK_VTXYZ_PARAM(y, z) (GX_FX16PAIR((y), (z)))
559 #define GX_PACK_VTXDIFF_PARAM(x, y, z) (GX_VECVTXDIFF((x), (y), (z)))
560 #define GX_PACK_TEXCOORD_PARAM(s, t) (GX_ST((s), (t)))
561 #define GX_PACK_TEXIMAGE_PARAM(texFmt, texGen, s, t, repeat, flip, pltt0, addr) \
562 ((u32)(((addr) >> 3) | \
563 ((texFmt) << REG_G3_TEXIMAGE_PARAM_TEXFMT_SHIFT) | \
564 ((texGen) << REG_G3_TEXIMAGE_PARAM_TGEN_SHIFT) | \
565 ((s) << REG_G3_TEXIMAGE_PARAM_V_SIZE_SHIFT) | \
566 ((t) << REG_G3_TEXIMAGE_PARAM_T_SIZE_SHIFT) | \
567 ((repeat) << REG_G3_TEXIMAGE_PARAM_RS_SHIFT) | \
568 ((flip) << REG_G3_TEXIMAGE_PARAM_FS_SHIFT) | \
569 ((pltt0) << REG_G3_TEXIMAGE_PARAM_TR_SHIFT)))
570 #define GX_PACK_TEXPLTTBASE_PARAM(addr, texFmt) \
571 ((u32)((addr) >> (4 - ((texFmt) == GX_TEXFMT_PLTT4))))
572 #define GX_PACK_VIEWPORT_PARAM(x1, y1, x2, y2) \
573 ((u32)((x1) | ((y1) << 8) | ((x2) << 16) | ((y2) << 24)))
574 #define GX_PACK_VECTORTEST_PARAM(x, y, z) ((u32)GX_VECFX10((x), (y), (z)))
575
576
577
578
579 /* if include from Other Environment for exsample VC or BCB, */
580 /* please define SDK_FROM_TOOL */
581 #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
582
583 //----------------------------------------------------------------------------
584 // Declaration of function
585 //----------------------------------------------------------------------------
586
587 void G3_BeginMakeDL(GXDLInfo *info, void *ptr, u32 length);
588 u32 G3_EndMakeDL(GXDLInfo *info);
589 static void *G3_GetDLStart(const GXDLInfo *info);
590 static u32 G3_GetDLLength(const GXDLInfo *info);
591 static u32 G3_GetDLSize(const GXDLInfo *info);
592
593 static GXTexPlttBaseParam G3_MakeTexPlttBaseParam(u32 plttBaseAddr, GXTexFmt texfmt);
594
595
596 //----------------------------------------------------------------------------
597 // Implementation of inline function
598 //----------------------------------------------------------------------------
599
600
601 /*---------------------------------------------------------------------------*
602 Name: G3_GetDLStart
603
604 Description: Get a pointer to a display list(command list) buffer
605
606 Arguments: info a pointer to struct GXDLInfo
607
608 Returns: a pointer to the display list
609
610 *---------------------------------------------------------------------------*/
G3_GetDLStart(const GXDLInfo * info)611 static inline void *G3_GetDLStart(const GXDLInfo *info)
612 {
613 return (void *)info->bottom;
614 }
615
616
617 /*---------------------------------------------------------------------------*
618 Name: G3_GetDLLength
619
620 Description: Get the length of a display list(command list) buffer
621
622 Arguments: info a pointer to struct GXDLInfo
623
624 Returns: the length of a display list(in bytes)
625 *---------------------------------------------------------------------------*/
G3_GetDLLength(const GXDLInfo * info)626 static inline u32 G3_GetDLLength(const GXDLInfo *info)
627 {
628 return info->length;
629 }
630
631
632 /*---------------------------------------------------------------------------*
633 Name: G3_GetDLSize
634
635 Description: Get the size of the display list generated
636
637 Arguments: info a pointer to struct GXDLInfo
638
639 Returns: the size of the display list
640 *---------------------------------------------------------------------------*/
G3_GetDLSize(const GXDLInfo * info)641 static inline u32 G3_GetDLSize(const GXDLInfo *info)
642 {
643 SDK_ASSERT((u32)info->bottom < (u32)info->curr_param);
644 if ((u32)info->curr_cmd & 3)
645 {
646 return (u32)((u32)info->curr_param - (u32)info->bottom);
647 }
648 else
649 {
650 return (u32)((u32)info->curr_cmd - (u32)info->bottom);
651 }
652 }
653
654
655 /*---------------------------------------------------------------------------*
656 Name: G3_MakeTexPlttBaseParam
657
658 Description: convert texture palette address to value set register.
659 function to shrink if texfmt is constant
660
661 Arguments: plttBaseAddr base address to put texture palette.
662 texfmt texture image format.
663
664 Returns: base address set to reg_G3_TEXPLTT_BASE.
665 *---------------------------------------------------------------------------*/
G3_MakeTexPlttBaseParam(u32 plttBaseAddr,GXTexFmt texfmt)666 static inline GXTexPlttBaseParam G3_MakeTexPlttBaseParam(u32 plttBaseAddr, GXTexFmt texfmt)
667 {
668 SDK_ASSERT(GX_TEXFMT_NONE != texfmt);
669
670 if (GX_TEXFMT_PLTT4 == texfmt)
671 {
672 // If the format of the texture is GX_TEXFMT_PLTT4,
673 // hardware shifts a parameter leftward by 3 bits.
674 SDK_ASSERT((plttBaseAddr & 0x7) == 0);
675 return (GXTexPlttBaseParam)(plttBaseAddr >> 3);
676 }
677 else
678 {
679 // Otherwise, shifts a parameter leftward by 4 bits.
680 SDK_ASSERT((plttBaseAddr & 0xf) == 0);
681 return (GXTexPlttBaseParam)(plttBaseAddr >> 4);
682 }
683 }
684
685
686 #endif // SDK_FROM_TOOL
687
688 #ifdef __cplusplus
689 }/* extern "C" */
690 #endif
691
692 /* NITRO_G3_H_ */
693 #endif
694