1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gx_MacroTexture.h
4 
5   Copyright (C)2009-2012 Nintendo Co., Ltd.  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   $Rev: 46347 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_GX_CTR_GX_MACRO_TEXTURE_H_
17 #define NN_GX_CTR_GX_MACRO_TEXTURE_H_
18 
19 #include <nn/gx/CTR/gx_MacroCommon.h>
20 
21 /* Please see man pages for details
22 
23 
24 */
25 
26 ///////////////////////////////////
27 // Texture address
28 
29 // PICA_REG_TEXTURE0_ADDR1      0x085
30 // PICA_REG_TEXTURE0_ADDR2       0x086
31 // PICA_REG_TEXTURE0_ADDR3       0x087
32 // PICA_REG_TEXTURE0_ADDR4       0x088
33 // PICA_REG_TEXTURE0_ADDR5       0x089
34 // PICA_REG_TEXTURE0_ADDR6       0x08a
35 // PICA_REG_TEXTURE2_ADDR        0x09d
36 // PICA_REG_TEXTURE1_ADDR        0x095
37 #define PICA_CMD_DATA_TEXTURE_ADDR( addr ) \
38     ( (u32)(addr) >> 3 )
39 
40 /*
41 struct CommandTexCubeMap
42 {
43     CMD_PADDING(22);
44     u32 CubeMap   : 6;
45     CMD_PADDING(4);
46 };
47 */
48 
49 /* Please see man pages for details
50 
51 */
52 enum PicaDataTexture
53 {
54     //
55     PICA_DATA_TEXTURE_2D                  = 0x0,
56     //
57     PICA_DATA_TEXTURE_CUBE_MAP_POSITIVE_X = 0x0,
58     //
59     PICA_DATA_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x1,
60     //
61     PICA_DATA_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x2,
62     //
63     PICA_DATA_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x3,
64     //
65     PICA_DATA_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x4,
66     //
67     PICA_DATA_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x5
68 };
69 
70 // PICA_REG_TEXTURE0_ADDR1      0x085
71 #define PICA_CMD_DATA_TEXTURE_CUBE_MAP_ADDR(cubeMapAddr) \
72     ( (cubeMapAddr) & 0x3fffff )
73 
74 ///////////////////////////////////
75 // Texture combiner
76 // TexEnv
77 
78 /*
79 struct CommandTexEnvSrc
80 {
81     u32 srcRgb0   : 4;
82     u32 srcRgb1   : 4;
83     u32 srcRgb2   : 4;
84     CMD_PADDING(4);
85     u32 srcAlpha0 : 4;
86     u32 srcAlpha1 : 4;
87     u32 srcAlpha2 : 4;
88     CMD_PADDING(4);
89 };
90 */
91 
92 /* Please see man pages for details
93 
94 
95 
96 */
97 enum PicaDataTexEnvSrc
98 {
99     //
100     PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR                = 0x0,
101     //
102     PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_PRIMARY_COLOR_DMP   = 0x1,
103     //
104     PICA_DATA_TEX_ENV_SRC_RGBA_FRAGMENT_SECONDARY_COLOR_DMP = 0x2,
105     //
106     PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0                     = 0x3,
107     //
108     PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE1                     = 0x4,
109     //
110     PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE2                     = 0x5,
111     //
112     PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE3                     = 0x6,
113     //
114     PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS_BUFFER_DMP          = 0xd,
115     //
116     PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT                     = 0xe,
117     //
118     PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS                     = 0xf
119 };
120 
121 #define PICA_TEX_ENV_SRC_RGB0_SHIFT         0
122 #define PICA_TEX_ENV_SRC_RGB1_SHIFT         4
123 #define PICA_TEX_ENV_SRC_RGB2_SHIFT         8
124 #define PICA_TEX_ENV_SRC_ALPHA0_SHIFT      16
125 #define PICA_TEX_ENV_SRC_ALPHA1_SHIFT      20
126 #define PICA_TEX_ENV_SRC_ALPHA2_SHIFT      24
127 
128 // PICA_REG_TEX_ENV0            0x0c0
129 // PICA_REG_TEX_ENV1            0x0c8
130 // PICA_REG_TEX_ENV2            0x0d0
131 // PICA_REG_TEX_ENV3            0x0d8
132 // PICA_REG_TEX_ENV4            0x0f0
133 // PICA_REG_TEX_ENV5            0x0f8
134 #define PICA_CMD_DATA_TEX_ENV_SRC( srcRgb0, srcRgb1, srcRgb2, \
135                                    srcAlpha0, srcAlpha1, srcAlpha2 ) \
136     ( (srcRgb0)   << PICA_TEX_ENV_SRC_RGB0_SHIFT   | \
137       (srcRgb1)   << PICA_TEX_ENV_SRC_RGB1_SHIFT   | \
138       (srcRgb2)   << PICA_TEX_ENV_SRC_RGB2_SHIFT   | \
139       (srcAlpha0) << PICA_TEX_ENV_SRC_ALPHA0_SHIFT | \
140       (srcAlpha1) << PICA_TEX_ENV_SRC_ALPHA1_SHIFT | \
141       (srcAlpha2) << PICA_TEX_ENV_SRC_ALPHA2_SHIFT )
142 
143 /*
144 struct CommandTexEnvOperand
145 {
146     u32 operandRg0    : 4;
147     u32 operandRg1    : 4;
148     u32 operandRg2    : 4;
149     u32 operandAlpha0 : 3;
150     CMD_PADDING(1);
151     u32 operandAlpha1 : 3;
152     CMD_PADDING(1);
153     u32 operandAlpha2 : 3;
154     CMD_PADDING(9);
155 };
156 */
157 
158 /* Please see man pages for details
159 
160 
161 
162 */
163 enum PicaDataTexEnvOperand
164 {
165     //
166     PICA_DATA_OPE_RGB_SRC_COLOR            = 0x0,
167     //
168     PICA_DATA_OPE_RGB_ONE_MINUS_SRC_COLOR  = 0x1,
169     //
170     PICA_DATA_OPE_RGB_SRC_ALPHA            = 0x2,
171     //
172     PICA_DATA_OPE_RGB_ONE_MINUS_SRC_ALPHA  = 0x3,
173     //
174     PICA_DATA_OPE_RGB_SRC_R_DMP            = 0x4,
175     //
176     PICA_DATA_OPE_RGB_ONE_MINUS_SRC_R_DMP  = 0x5,
177     //
178     PICA_DATA_OPE_RGB_SRC_G_DMP            = 0x8,
179     //
180     PICA_DATA_OPE_RGB_ONE_MINUS_SRC_G_DMP  = 0x9,
181     //
182     PICA_DATA_OPE_RGB_SRC_B_DMP            = 0xc,
183     //
184     PICA_DATA_OPE_RGB_ONE_MINUS_SRC_B_DMP  = 0xd,
185     //
186     PICA_DATA_OPE_ALPHA_SRC_ALPHA           = 0x0,
187     //
188     PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_ALPHA = 0x1,
189     //
190     PICA_DATA_OPE_ALPHA_SRC_R_DMP           = 0x2,
191     //
192     PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_R_DMP = 0x3,
193     //
194     PICA_DATA_OPE_ALPHA_SRC_G_DMP           = 0x4,
195     //
196     PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_G_DMP = 0x5,
197     //
198     PICA_DATA_OPE_ALPHA_SRC_B_DMP           = 0x6,
199     //
200     PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_B_DMP = 0x7
201 };
202 
203 
204 #define PICA_TEX_ENV_OPE_RGB0_SHIFT         0
205 #define PICA_TEX_ENV_OPE_RGB1_SHIFT         4
206 #define PICA_TEX_ENV_OPE_RGB2_SHIFT         8
207 #define PICA_TEX_ENV_OPE_ALPHA0_SHIFT      12
208 #define PICA_TEX_ENV_OPE_ALPHA1_SHIFT      16
209 #define PICA_TEX_ENV_OPE_ALPHA2_SHIFT      20
210 
211 // PICA_REG_TEX_ENV0_OPERAND    0x0c1
212 // PICA_REG_TEX_ENV1_OPERAND    0x0c9
213 // PICA_REG_TEX_ENV2_OPERAND    0x0d1
214 // PICA_REG_TEX_ENV3_OPERAND    0x0d9
215 // PICA_REG_TEX_ENV4_OPERAND    0x0f1
216 // PICA_REG_TEX_ENV5_OPERAND    0x0f9
217 #define PICA_CMD_DATA_TEX_ENV_OPERAND(operandRgb0, operandRgb1, operandRgb2, \
218                                       operandAlpha0, operandAlpha1, operandAlpha2) \
219     ( (operandRgb0)   << PICA_TEX_ENV_OPE_RGB0_SHIFT   | \
220       (operandRgb1)   << PICA_TEX_ENV_OPE_RGB1_SHIFT   | \
221       (operandRgb2)   << PICA_TEX_ENV_OPE_RGB2_SHIFT   | \
222       (operandAlpha0) << PICA_TEX_ENV_OPE_ALPHA0_SHIFT | \
223       (operandAlpha1) << PICA_TEX_ENV_OPE_ALPHA1_SHIFT | \
224       (operandAlpha2) << PICA_TEX_ENV_OPE_ALPHA2_SHIFT )
225 
226 /*
227 struct CommandTexEnvCombine
228 {
229     u32 combineRgb   : 4;
230     CMD_PADDING(12);
231     u32 combineAlpha : 4;
232     CMD_PADDING(12);
233 };
234 */
235 
236 /* Please see man pages for details
237 
238 
239 
240 */
241 enum PicaDataTexEnvCombine
242 {
243     //
244     PICA_DATA_TEX_ENV_COMBINE_REPLACE      = 0x0,
245     //
246     PICA_DATA_TEX_ENV_COMBINE_MODULATE     = 0x1,
247     //
248     PICA_DATA_TEX_ENV_COMBINE_ADD          = 0x2,
249     //
250     PICA_DATA_TEX_ENV_COMBINE_ADD_SIGNED   = 0x3,
251     //
252     PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE  = 0x4,
253     //
254     PICA_DATA_TEX_ENV_COMBINE_SUBTRACT     = 0x5,
255     //
256     PICA_DATA_TEX_ENV_COMBINE_DOT3_RGB     = 0x6,
257     //
258     PICA_DATA_TEX_ENV_COMBINE_DOT3_RGBA    = 0x7,
259     //
260     PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP = 0x8,
261     //
262     PICA_DATA_TEX_ENV_COMBINE_ADD_MULT_DMP = 0x9
263 };
264 
265 // PICA_REG_TEX_ENV0_COMBINE    0x0c2
266 // PICA_REG_TEX_ENV1_COMBINE    0x0ca
267 // PICA_REG_TEX_ENV2_COMBINE    0x0d2
268 // PICA_REG_TEX_ENV3_COMBINE    0x0da
269 // PICA_REG_TEX_ENV4_COMBINE    0x0f2
270 // PICA_REG_TEX_ENV5_COMBINE    0x0fa
271 #define PICA_CMD_DATA_TEX_ENV_COMBINE( combineRgb, combineAlpha ) \
272     ( (combineRgb) | (combineAlpha) << 16 )
273 
274 /*
275 struct CommandTexEnvConst
276 {
277     u32 constRgb1  : 8;
278     u32 constRgb2  : 8;
279     u32 constRgb3  : 8;
280     u32 constRgb4  : 8;
281 };
282 */
283 // PICA_REG_TEX_ENV0_COLOR      0x0c3
284 // PICA_REG_TEX_ENV1_COLOR      0x0cb
285 // PICA_REG_TEX_ENV2_COLOR      0x0d3
286 // PICA_REG_TEX_ENV3_COLOR      0x0db
287 // PICA_REG_TEX_ENV4_COLOR      0x0f3
288 // PICA_REG_TEX_ENV5_COLOR      0x0fb
289 #define PICA_CMD_DATA_TEX_ENV_CONST( constRgb0, constRgb1, constRgb2, constRgb3 ) \
290     ((constRgb0) | (constRgb1) << 8 | (constRgb2) << 16 | (constRgb3) << 24)
291 
292 /*
293 struct CommandTexEnvScale
294 {
295     u32 scaleRgb   : 2;
296     CMD_PADDING(14);
297     u32 scaleAlpha : 2;
298     CMD_PADDING(14);
299 };
300 */
301 
302 /* Please see man pages for details
303 
304 
305 
306 */
307 enum PicaDataTexEnvScale
308 {
309     //
310     PICA_DATA_TEX_ENV_SCALE_1 = 0x0,
311     //
312     PICA_DATA_TEX_ENV_SCALE_2 = 0x1,
313     //
314     PICA_DATA_TEX_ENV_SCALE_4 = 0x2
315 };
316 
317 // PICA_REG_TEX_ENV0_SCALE      0x0c4
318 // PICA_REG_TEX_ENV1_SCALE      0x0cc
319 // PICA_REG_TEX_ENV2_SCALE      0x0d4
320 // PICA_REG_TEX_ENV3_SCALE      0x0dc
321 // PICA_REG_TEX_ENV4_SCALE      0x0f4
322 // PICA_REG_TEX_ENV5_SCALE      0x0fc
323 #define PICA_CMD_DATA_TEX_ENV_SCALE( scaleRgb, scaleAlpha ) \
324     ( (scaleRgb) | (scaleAlpha) << 16 )
325 
326 #define PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_WHITE 0xffffffff
327 #define PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK 0x00000000
328 
329 // PICA_REG_TEX_ENV_BUF_COLOR    0x0fd
330 #define PICA_CMD_DATA_COLOR( color8 ) \
331     ( (color8.r) | (color8.g) << 8 | (color8.b) << 16 | (color8.a) << 24 )
332 
333 /*
334 struct CommandTexEnvBufInput
335 {
336     CMD_PADDING(8);
337     u32 bufInput1 : 4; // 1 bit in this field
338     CMD_PADDING(4);
339     u32 bufInput2 : 4; // 1 bin in this field
340     CMD_PADDING(12);
341 };
342 */
343 
344 
345 /* Please see man pages for details
346 
347 
348 
349 */
350 enum PicaDataTexEnvBufferInput
351 {
352     //
353     PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP = 0x0,
354     //
355     PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS            = 0x1
356 };
357 
358 // PICA_REG_TEX_ENV_BUF_INPUT    0x0e0
359 // i is index of dmp_TexEnv[i]. The values are 1, 2, 3, 4 only.
360 
361 #define PICA_CMD_DATA_TEX_ENV_BUFFER_INPUT(i, bufInput0, bufInput1) \
362     ((bufInput0) << 7+(i) | (bufInput1) << 11+(i))
363 
364 // 0x0e0 [15:8]
365 #define PICA_CMD_SET_TEX_ENV_BUFFER_INPUT(bufInput0_0, bufInput0_1,     \
366                                           bufInput1_0, bufInput1_1,     \
367                                           bufInput2_0, bufInput2_1,     \
368                                           bufInput3_0, bufInput3_1)     \
369   ( PICA_CMD_DATA_TEX_ENV_BUFFER_INPUT(1, bufInput0_0, bufInput0_1) |   \
370     PICA_CMD_DATA_TEX_ENV_BUFFER_INPUT(2, bufInput1_0, bufInput1_1) |   \
371     PICA_CMD_DATA_TEX_ENV_BUFFER_INPUT(3, bufInput2_0, bufInput2_1) |   \
372     PICA_CMD_DATA_TEX_ENV_BUFFER_INPUT(4, bufInput3_0, bufInput3_1) ) , \
373     PICA_CMD_HEADER_SINGLE_BE(PICA_REG_GAS_FOG_MODE, 0x2)
374 
375 ///////////////////////////////////
376 // Shadow Textrue
377 //
378 /*
379 struct CommandTextureShadow
380 {
381     u32 perspectiveShadow : 1;
382     u32 shadowZBias       : 23;
383     u32 shadowZScale      : 8;
384 };
385 */
386 
387 // PICA_REG_TEXTURE0_SHADOW      0x08b
388 #define PICA_CMD_DATA_TEXTURE_SHADOW(perspectiveShadow, shadowZBias, shadowZScale) \
389     (( (perspectiveShadow) ? 0 : 1) | (shadowZBias) << 1 | (shadowZScale) << 24)
390 
391 ///////////////////////////////////
392 // Texture Sampler
393 // Texture Texcoord
394 // Texture Cache Clear
395 /*
396 struct CommandTextureFunc
397 {
398     u32 type0_0 : 1;
399     u32 type1   : 1;
400     u32 type2   : 1;
401     CMD_PADDING(1);   // 0x0
402     CMD_PADDING(4);
403     u32 texcoord3   : 2;
404     u32 type3   : 1;
405     CMD_PADDING(1);
406     CMD_PADDING(1);   // 0x1
407     u32 texcoord2   : 1;
408     CMD_PADDING(2);
409     u32 clear : 1;
410     CMD_PADDING(15);
411 
412 };
413 */
414 
415 //  Texture Sampler
416 
417 /* Please see man pages for details
418 
419 
420 
421 */
422 enum PicaDataTexture0SamplerType
423 {
424     //
425     PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_2D              = 0x0,
426     //
427     PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_CUBE_MAP        = 0x1,
428     //
429     PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_SHADOW_2D_DMP   = 0x2,
430     //
431     PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_PROJECTION_DMP  = 0x3,
432     //
433     PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_SHADOW_CUBE_DMP = 0x4,
434     //
435     PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_FALSE           = 0x5,
436     //
437     PICA_DATA_TEXTURE0_SAMPLER_TYPE_FALSE                   = 0x5
438 };
439 
440 /* Please see man pages for details
441 
442 
443 
444 */
445 enum PicaDataTexture1SamplerType
446 {
447     //
448     PICA_DATA_TEXTURE1_SAMPLER_TYPE_FALSE      = 0x0,
449     //
450     PICA_DATA_TEXTURE1_SAMPLER_TYPE_TEXTURE_2D = 0x1
451 };
452 
453 /* Please see man pages for details
454 
455 
456 
457 */
458 enum PicaDataTexture2SamplerType
459 {
460     //
461     PICA_DATA_TEXTURE2_SAMPLER_TYPE_FALSE      = 0x0,
462     //
463     PICA_DATA_TEXTURE2_SAMPLER_TYPE_TEXTURE_2D = 0x1
464 };
465 
466 /* Please see man pages for details
467 
468 
469 
470 */
471 enum PicaDataTexture3SamplerType
472 {
473     //
474     PICA_DATA_TEXTURE3_SAMPLER_TYPE_FALSE                  = 0x0,
475     //
476     PICA_DATA_TEXTURE3_SAMPLER_TYPE_TEXTURE_PROCEDURAL_DMP = 0x1
477 };
478 
479 
480 /* Please see man pages for details
481 
482 
483 
484 */
485 enum PicaDataTexture2TexCoord
486 {
487     //
488     PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE1 = 0x1,
489     //
490     PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE2 = 0x0
491 };
492 
493 /* Please see man pages for details
494 
495 
496 
497 */
498 enum PicaDataTexture3TexCoord
499 {
500     //
501     PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE0 = 0x0,
502     //
503     PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE1 = 0x1,
504     //
505     PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE2 = 0x2
506 };
507 
508 // PICA_REG_TEXTURE_FUNC 0x080
509 #define PICA_CMD_DATA_TEXTURE_FUNC(texture0SamplerType, texture1SamplerType, texture2SamplerType, \
510                                    texture3Texcoord, texture3SamplerType, \
511                                    texture2Texcoord, clearTextureCache)   \
512     ( ((texture0SamplerType == PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_FALSE) ? 0 : 1)  | \
513       ((texture1SamplerType) ? 1 : 0)     <<  1  | \
514       ((texture2SamplerType) ? 1 : 0)     <<  2  | \
515       0                                   <<  3  | \
516        (texture3Texcoord)                 <<  8  | \
517       ((texture3SamplerType) ? 1 : 0)     << 10  | \
518       1                                   << 12  | \
519       ((texture2Texcoord) ? 1 : 0)        << 13  | \
520       (clearTextureCache)                 << 16  | \
521       0 << 17 )
522 
523 #define PICA_CMD_SET_TEXTURE_FUNC_CLEAR(texture0SamplerType, texture1SamplerType, texture2SamplerType, \
524                                         texture3SamplerType, texture2Texcoord, texture3Texcoord)       \
525     PICA_CMD_DATA_TEXTURE_FUNC(texture0SamplerType, texture1SamplerType, texture2SamplerType,          \
526                                texture3Texcoord, texture3SamplerType,                                  \
527                                texture2Texcoord, 0x1),                                                 \
528     PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEXTURE_FUNC, 0xB ),                                           \
529     1 << 16,                                                                                           \
530     PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEXTURE_FUNC, 0x4 )
531 
532 #define PICA_CMD_SET_TEXTURE_FUNC(texture0SamplerType, texture1SamplerType, texture2SamplerType, \
533                                         texture3SamplerType, texture2Texcoord, texture3Texcoord) \
534     PICA_CMD_DATA_TEXTURE_FUNC(texture0SamplerType, texture1SamplerType, texture2SamplerType,    \
535                                texture3Texcoord, texture3SamplerType,                            \
536                                texture2Texcoord, 0x0),                                           \
537     PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEXTURE_FUNC, 0xB )
538 
539 ///////////////////////////////////
540 // Procedural Texture
541 //
542 /*
543 struct CommandProcTex0
544 {
545     u32 ptClampU        : 3;
546     u32 ptClampV        : 4;
547     u32 ptRgbMap        : 4;
548     u32 ptAlphaMap      : 4;
549     u32 ptAlphaSeparate : 1;
550     u32 ptNoiseEnable   : 1;
551     u32 ptShiftU        : 2;
552     u32 ptShiftV        : 2;
553     u32 ptTexBias1       : 8;
554     CMD_PADDING(3);
555 };
556 */
557 
558 /* Please see man pages for details
559 
560 
561 
562 */
563 enum PicaDataProcTexMap
564 {
565     //
566     PICA_DATA_PROCTEX_U_DMP        = 0x0,
567     //
568     PICA_DATA_PROCTEX_U2_DMP       = 0x1,
569     //
570     PICA_DATA_PROCTEX_V_DMP        = 0x2,
571     //
572     PICA_DATA_PROCTEX_V2_DMP       = 0x3,
573     //
574     PICA_DATA_PROCTEX_ADD_DMP      = 0x4,
575     //
576     PICA_DATA_PROCTEX_ADD2_DMP     = 0x5,
577     //
578     PICA_DATA_PROCTEX_ADDSQRT2_DMP = 0x6,
579     //
580     PICA_DATA_PROCTEX_MIN_DMP      = 0x7,
581     //
582     PICA_DATA_PROCTEX_MAX_DMP      = 0x8,
583     //
584     PICA_DATA_PROCTEX_RMAX_DMP     = 0x9
585 };
586 
587 /* Please see man pages for details
588 
589 
590 
591 */
592 enum PicaDataProcTexClamp
593 {
594     //
595     PICA_DATA_PROCTEX_CLAMP_TO_ZERO_DMP       = 0x0,
596     //
597     PICA_DATA_PROCTEX_CLAMP_TO_EDGE           = 0x1,
598     //
599     PICA_DATA_PROCTEX_SYMMETRICAL_REPEAT_DMP  = 0x2,
600     //
601     PICA_DATA_PROCTEX_MIRRORED_REPEAT         = 0x3,
602     //
603     PICA_DATA_PROCTEX_PULSE_DMP               = 0x4
604 };
605 
606 /* Please see man pages for details
607 
608 
609 
610 */
611 enum PicaDataProcTexShift
612 {
613     //
614     PICA_DATA_PROCTEX_NONE_DMP = 0x0,
615     //
616     PICA_DATA_PROCTEX_ODD_DMP  = 0x1,
617     //
618     PICA_DATA_PROCTEX_EVEN_DMP = 0x2
619 };
620 
621 // PICA_REG_TEXTURE3_PROCTEX0     0x0a8
622 #define PICA_CMD_DATA_PROCTEX0(ptClampU, ptClampV, \
623     ptRgbMap, ptAlphaMap, ptAlphaSeparate,         \
624     ptNoiseEnable, ptShiftU, ptShiftV, ptTexBiasF16Low8) \
625     ( (ptClampU)                         | \
626       (ptClampV)                   <<  3 | \
627       (ptRgbMap)                   <<  6 | \
628       (ptAlphaMap)                 << 10 | \
629       (ptAlphaSeparate ? 1 : 0)    << 14 | \
630       (ptNoiseEnable ? 1 : 0)      << 15 | \
631       (ptShiftU)                   << 16 | \
632       (ptShiftV)                   << 18 | \
633       (ptTexBiasF16Low8)           << 20 )
634 
635 
636 
637 // PICA_REG_TEXTURE3_PROCTEX1    0x0a9
638 #define PICA_CMD_DATA_PROCTEX1(ptNoiseU1, ptNoiseU2) \
639     ( (ptNoiseU1) << 16 | (ptNoiseU2) )
640 
641 // PICA_REG_TEXTURE3_PROCTEX2    0x0aa
642 #define PICA_CMD_DATA_PROCTEX2(ptNoiseV1, ptNoiseV2) \
643     ( (ptNoiseV1) << 16 | (ptNoiseV2) )
644 
645 // PICA_REG_TEXTURE3_PROCTEX3    0x0ab
646 #define PICA_CMD_DATA_PROCTEX3(ptNoiseU0, ptNoiseV0) \
647     ( (ptNoiseU0) | (ptNoiseV0) << 16 )
648 
649 /*
650 struct CommandProcTex4
651 {
652     u32 ptMinFilter  : 3;
653     CMD_PADDING(8);     // 0x60
654     u32 ptTexWidth   : 8;
655     u32 ptTexBias2   : 8;
656     CMD_PADDING(5);
657 };
658 */
659 
660 /* Please see man pages for details
661 
662 
663 
664 */
665 enum PicaDataProcTexFilter
666 {
667     //
668     PICA_DATA_PROCTEX_NEAREST                = 0x0,
669     //
670     PICA_DATA_PROCTEX_LINEAR                 = 0x1,
671     //
672     PICA_DATA_PROCTEX_NEAREST_MIPMAP_NEAREST = 0x2,
673     //
674     PICA_DATA_PROCTEX_LINEAR_MIPMAP_NEAREST  = 0x3,
675     //
676     PICA_DATA_PROCTEX_NEAREST_MIPMAP_LINEAR  = 0x4,
677     //
678     PICA_DATA_PROCTEX_LINEAR_MIPMAP_LINEAR   = 0x5
679 };
680 
681 // PICA_REG_TEXTURE3_PROCTEX4    0x0ac
682 #define PICA_CMD_DATA_PROCTEX4(ptMinFilter, ptTexWidth, ptTexBiasF16Hi8) \
683     ( (ptMinFilter)                 | \
684        0x60                   <<  3 | \
685       (ptTexWidth)            << 11 | \
686       (ptTexBiasF16Hi8) << 19 )
687 
688 /*
689 struct CommandProcTex5
690 {
691     u32 ptTexOffset  : 8;
692     CMD_PADDING(24);   // 0xe0c080
693 };
694 */
695 
696 // PICA_REG_TEXTURE3_PROCTEX5    0x0ad
697 #define PICA_CMD_DATA_PROCTEX5(ptTexOffset) \
698     ( (ptTexOffset) | 0xe0c08000 )
699 
700 ///////////////////////////////////
701 // Procedural texture Reference Table
702 /*
703 struct CommandProTexRefTab
704 {
705     u32 index : 8;
706     u32 attrib   : 4;
707     CMD_PADDING(20);
708 };
709 */
710 
711 
712 /* Please see man pages for details
713 
714 
715 
716 */
717 enum PicaDataProcTexRefTable
718 {
719     //
720     PICA_DATA_PROCTEX_NOISE_REF_TABLE      = 0x0,
721     //
722     PICA_DATA_PROCTEX_RGB_MAP_REF_TABLE    = 0x2,
723     //
724     PICA_DATA_PROCTEX_ALPHA_MAP_REF_TABLE  = 0x3,
725     //
726     PICA_DATA_PROCTEX_COLOR_REF_TABLE      = 0x4,
727     //
728     PICA_DATA_PROCTEX_COLOR_DIFF_REF_TABLE = 0x5
729 };
730 
731 // PICA_REG_PROCTEX_LUT         0x0af
732 #define PICA_CMD_DATA_PROCTEX_LUT(index, refTable) \
733     ((index) | (refTable) << 8)
734 
735 // PICA_REG_PROCTEX_LUT_DATA0  0x0b0
736 // PICA_REG_PROCTEX_LUT_DATA1  0x0b1
737 // PICA_REG_PROCTEX_LUT_DATA2  0x0b2
738 // PICA_REG_PROCTEX_LUT_DATA3  0x0b3
739 // PICA_REG_PROCTEX_LUT_DATA4  0x0b4
740 // PICA_REG_PROCTEX_LUT_DATA5  0x0b5
741 // PICA_REG_PROCTEX_LUT_DATA6  0x0b6
742 // PICA_REG_PROCTEX_LUT_DATA7  0x0b7
743 #define PICA_CMD_DATA_PROCTEX_LUT_DATA(data) (data)
744 
745 ///////////////////////////////////
746 // Texture Resolution
747 /*
748 struct CommandTexSize
749 {
750     u32 height : 16;
751     u32 width  : 16;
752 };
753 */
754 
755 // PICA_REG_TEXTURE0_SIZE        0x082
756 // PICA_REG_TEXTURE1_SIZE        0x092
757 // PICA_REG_TEXTURE2_SIZE        0x09a
758 #define PICA_CMD_DATA_TEXTURE_SIZE( width, height ) \
759     ( (height) | (width) << 16 )
760 
761 ///////////////////////////////////
762 // Texture Format
763 
764 /* Please see man pages for details
765 
766 
767 
768 */
769 enum PicaDataTextureFormat
770 {
771     //
772     PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_BYTE                    = 0x0,
773     //
774     PICA_DATA_TEXTURE_FORMAT_SHADOW_UNSIGNED_INT                   = 0x0,
775     //
776     PICA_DATA_TEXTURE_FORMAT_GAS_DMP_UNSIGNED_SHORT                = 0x0,
777     //
778     PICA_DATA_TEXTURE_FORMAT_RGB_UNSIGNED_BYTE                     = 0x1,
779     //
780     PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_SHORT_5_5_5_1           = 0x2,
781     //
782     PICA_DATA_TEXTURE_FORMAT_RGB_UNSIGNED_SHORT_5_6_5              = 0x3,
783     //
784     PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_SHORT_4_4_4_4           = 0x4,
785     //
786     PICA_DATA_TEXTURE_FORMAT_LUMINANCE_ALPHA_UNSIGNED_BYTE         = 0x5,
787     //
788     PICA_DATA_TEXTURE_FORMAT_HILO8_DMP_UNSIGNED_BYTE               = 0x6,
789     //
790     PICA_DATA_TEXTURE_FORMAT_LUMINANCE_UNSIGNED_BYTE               = 0x7,
791     //
792     PICA_DATA_TEXTURE_FORMAT_ALPHA_UNSIGNED_BYTE                   = 0x8,
793     //
794     PICA_DATA_TEXTURE_FORMAT_LUMINANCE_ALPHA_UNSIGNED_BYTE_4_4_DMP = 0x9,
795     //
796     PICA_DATA_TEXTURE_FORMAT_LUMINANCE_UNSIGNED_4BITS_DMP          = 0xa,
797     //
798     PICA_DATA_TEXTURE_FORMAT_ALPHA_UNSIGNED_4BITS_DMP              = 0xb,
799     //
800     PICA_DATA_TEXTURE_FORMAT_ETC1_RGB8_NATIVE_DMP                  = 0xc,
801     //
802     PICA_DATA_TEXTURE_FORMAT_ETC1_ALPHA_RGB8_A4_NATIVE_DMP         = 0xd
803 };
804 
805 // PICA_REG_TEXTURE0_FORMAT      0x08e
806 // PICA_REG_TEXTURE1_FORMAT      0x096
807 // PICA_REG_TEXTURE2_FORMAT      0x09e
808 #define PICA_CMD_DATA_TEXTURE_FORMAT_TYPE( type ) (type)
809 
810 ///////////////////////////////////
811 // Texture Wrap Mode
812 // Texture Wrap Filter
813 // Texture Sampler
814 // Texture Format
815 // Texture Shadow Enable
816 /*
817 struct CommandTex0WrapFilter
818 {
819     CMD_PADDING(1);
820     u32 magFilter  : 1;
821     u32 minFilter1 : 1;
822     CMD_PADDING(1);
823     u32 isETC1    : 2;
824     CMD_PADDING(2);
825     u32 wrapT     : 3;
826     CMD_PADDING(1);
827     u32 wrapS     : 3;
828     CMD_PADDING(1);
829     CMD_PADDING(2);       // set to 0 [17:16]
830     CMD_PADDING(2);
831     u32 enable    : 1;
832     CMD_PADDING(3);
833     u32 minFilter2 : 1;
834     CMD_PADDING(3);
835     u32 type1_1 : 3;
836     CMD_PADDING(1);
837 };
838 */
839 
840 
841 /* Please see man pages for details
842 
843 
844 
845 */
846 enum PicaDataTextureMagFilter
847 {
848     //
849     PICA_DATA_TEXTURE_MAG_FILTER_NEAREST                = 0x0,
850     //
851     PICA_DATA_TEXTURE_MAG_FILTER_LINEAR                 = 0x1
852 };
853 
854 
855 /* Please see man pages for details
856 
857 
858 
859 */
860 enum PicaDataTextureMinFilter
861 {
862     //
863     PICA_DATA_TEXTURE_MIN_FILTER_NEAREST                = 0x0,
864     //
865     PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_NEAREST = 0x1,
866     //
867     PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR  = 0x2,
868     //
869     PICA_DATA_TEXTURE_MIN_FILTER_LINEAR                 = 0x3,
870     //
871     PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST  = 0x4,
872     //
873     PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR   = 0x5
874 };
875 
876 #define PICA_CMD_DATA_TEXTURE_MIN_FILTER0(texture0MinFilter) \
877     ( ( ( (texture0MinFilter) == PICA_DATA_TEXTURE_MIN_FILTER_LINEAR ) ||                \
878         ( (texture0MinFilter) == PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST ) || \
879         ( (texture0MinFilter) == PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR  ) )  \
880         ? 1 : 0 )
881 
882 #define PICA_CMD_DATA_TEXTURE_MIN_FILTER1(texture0MinFilter) \
883     ( ( ( (texture0MinFilter) == PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR ) || \
884         ( (texture0MinFilter) == PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR  ) )  \
885         ? 1 : 0 )
886 
887 /* Please see man pages for details
888 
889 
890 
891 */
892 enum PicaDataTextureWrap
893 {
894     //
895     PICA_DATA_TEXTURE_WRAP_CLAMP_TO_EDGE   = 0,
896     //
897     PICA_DATA_TEXTURE_WRAP_CLAMP_TO_BORDER = 1,
898     //
899     PICA_DATA_TEXTURE_WRAP_REPEAT          = 2,
900     //
901     PICA_DATA_TEXTURE_WRAP_MIRRORED_REPEAT = 3
902 };
903 
904 
905 #define PICA_CMD_DATA_TEXTURE_WRAP_FILTER( textureMagFilter, textureMinFilter, \
906     textureFormat, textureWrapT, textureWrapS, \
907     useShadowTexture, textureSamplerType )     \
908     (  (textureMagFilter)                                                         <<  1 | \
909        PICA_CMD_DATA_TEXTURE_MIN_FILTER0(textureMinFilter)                        <<  2 | \
910       ((textureFormat == PICA_DATA_TEXTURE_FORMAT_ETC1_RGB8_NATIVE_DMP) ? 2 : 0 ) <<  4 | \
911        (textureWrapT)                                                             <<  8 | \
912        (textureWrapS)                                                             << 12 | \
913        0                                                                          << 16 | \
914        (useShadowTexture)                                                         << 20 | \
915        PICA_CMD_DATA_TEXTURE_MIN_FILTER1(textureMinFilter)                        << 24 | \
916        (textureSamplerType) << 28 )
917 
918 #define PICA_CMD_DATA_TEXTURE0_WRAP_FILTER( textureMagFilter, textureMinFilter,        \
919                                             textureFormat, textureWrapT, textureWrapS, \
920                                             useShadowTexture, textureSamplerType )     \
921     PICA_CMD_DATA_TEXTURE_WRAP_FILTER( textureMagFilter, textureMinFilter,             \
922                                        textureFormat, textureWrapT, textureWrapS,      \
923                                        useShadowTexture, textureSamplerType )
924 
925 #define PICA_CMD_DATA_TEXTURE1_WRAP_FILTER( textureMagFilter, textureMinFilter,    \
926                                         textureFormat, textureWrapT, textureWrapS) \
927     PICA_CMD_DATA_TEXTURE_WRAP_FILTER( textureMagFilter, textureMinFilter,         \
928                                        textureFormat, textureWrapT, textureWrapS,  \
929                                        0x0, 0x0)
930 
931 #define PICA_CMD_DATA_TEXTURE2_WRAP_FILTER( textureMagFilter, textureMinFilter,     \
932                                         textureFormat, textureWrapT, textureWrapS ) \
933     PICA_CMD_DATA_TEXTURE_WRAP_FILTER( textureMagFilter, textureMinFilter,          \
934                                        textureFormat, textureWrapT, textureWrapS,   \
935                                        0x0, 0x0)
936 
937 /*
938 struct CommandTex12WrapFilter
939 {
940     CMD_PADDING(1);
941     u32 magFilter  : 1;
942     u32 minFilter1 : 1;
943     CMD_PADDING(1);
944     u32 isETC1    : 2;
945     CMD_PADDING(2);
946     u32 wrapT     : 3;
947     CMD_PADDING(1);
948     u32 wrapS     : 3;
949     CMD_PADDING(2);       // set to 0 [17:16]
950     CMD_PADDING(7);
951     u32 minFilter2 : 1;
952     CMD_PADDING(7);
953 };
954 */
955 
956 ///////////////////////////////////
957 // Texture LOD Level
958 // Texture LOD Bias
959 /*
960 struct CommandTexLODLev
961 {
962     u32 bias : 12;
963     u32 max : 4;
964     CMD_PADDING(4);
965     u32 min : 4;
966     CMD_PADDING(4);
967 };
968 */
969 
970 // PICA_REG_TEXTURE0_LOD         0x084
971 // PICA_REG_TEXTURE1_LOD         0x094
972 // PICA_REG_TEXTURE2_LOD         0x09c
973 #define PICA_CMD_DATA_TEXTURE_LOD_LEVEL(lodBias, maxLodLevel, minLodLevel) \
974     (  (lodBias)                              | \
975        (maxLodLevel)                    << 16 | \
976       (((minLodLevel) < 0) ? 0 : (minLodLevel)) << 24 )
977 
978 ///////////////////////////////////
979 // Texture Border Color
980 
981 // PICA_REG_TEXTURE0_BORDER_COLOR  0x081
982 // PICA_REG_TEXTURE1_BORDER_COLOR  0x091
983 // PICA_REG_TEXTURE2_BORDER_COLOR  0x099
984 #define PICA_CMD_DATA_BORDER_COLOR( color8 ) \
985     ( (color8.r)       | \
986       (color8.g) <<  8 | \
987       (color8.b) << 16 | \
988       (color8.a) << 24 )
989 
990 /*
991 
992 */
993 
994 #endif  // NN_GX_CTR_GX_MACRO_TEXTURE_H_
995