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