1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gx_MacroFragment.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_FRAGMENT_H_
17 #define NN_GX_CTR_GX_MACRO_FRAGMENT_H_
18 
19 #include <nn/gx/CTR/gx_MacroCommon.h>
20 
21 /* Please see man pages for details
22 
23 
24 */
25 
26 // PICA_REG_FRAG_LIGHT_EN0           0x08f
27 // PICA_REG_FRAG_LIGHT_EN1           0x1c6
28 #define PICA_CMD_DATA_FRAG_LIGHT_EN(flag) ( (flag) ? 1 : 0 )
29 #define PICA_CMD_DATA_FRAG_LIGHT_EN_INV(flag) ( (flag) ? 0 : 1 )
30 
31 #define PICA_CMD_SET_FRAG_LIGHT_ENABLE(flag) \
32     PICA_CMD_DATA_FRAG_LIGHT_EN(flag), PICA_CMD_HEADER_SINGLE(PICA_REG_FRAG_LIGHT_EN0), \
33     PICA_CMD_DATA_FRAG_LIGHT_EN_INV(flag), PICA_CMD_HEADER_SINGLE(PICA_REG_FRAG_LIGHT_EN1)
34 
35 // PICA_REG_FRAG_LIGHT_SRC_NUM     0x1c2
36 #define PICA_CMD_DATA_FRAG_LIGHT_NUM(num) ( (num > 0) ? (num - 1) : 0 )
37 
38 #define PICA_CMD_SET_FRAG_LIGHT_NUM(num) \
39     PICA_CMD_DATA_FRAG_LIGHT_NUM(num), PICA_CMD_HEADER_SINGLE( PICA_REG_FRAG_LIGHT_SRC_NUM )
40 
41 /*
42 struct CommandFragLightSrc
43 {
44     u32 Id1   : 3;
45     u32 Id2   : 3;
46     u32 Id3   : 3;
47     u32 Id4   : 3;
48     u32 Id5   : 3;
49     u32 Id6   : 3;
50     u32 Id7   : 3;
51     u32 Id8   : 3;
52     CMD_PADDING(8);
53 };
54 */
55 
56 // PICA_REG_FRAG_LIGHT_SRC_EN_ID      0x1d9
57 #define PICA_CMD_DATA_FRAG_LIGHT_EN_ID(Id1, Id2, Id3, Id4, Id5, Id6, Id7, Id8) \
58     ( (Id1)       | (Id2) <<  4 | (Id3) <<  8 | (Id4) << 12 | \
59       (Id5) << 16 | (Id6) << 20 | (Id7) << 24 | (Id8) << 28 )
60 
61 ///////////////////////////////////
62 // Fragment Global Ambient
63 // Fragment LightEnv MiscGlobal
64 
65 // PICA_REG_FRAG_LIGHT_AMBIENT     0x1c0
66 #define PICA_CMD_DATA_FRAG_LIGHT_AMBIENT(color) \
67     ( (color.b) | (color.g) << 10 | (color.r) << 20 )
68 
69 ///////////////////////////////////
70 // Fragment Light Source
71 // Fragment LightEnv Misc
72 
73 // PICA_REG_FRAG_LIGHT0_SPECULAR0       0x140 to 0x1b0
74 // PICA_REG_FRAG_LIGHT0_SPECULAR1       0x141 to 0x1b1
75 // PICA_REG_FRAG_LIGHT0_DIFFUSE       0x142 to 0x1b2
76 // PICA_REG_FRAG_LIGHT0_AMBIENT        0x143 to 0x1b3
77 #define PICA_CMD_DATA_FRAG_LIGHT_SRC(color) \
78     ( (color.b) | (color.g) << 10 | (color.r) << 20 )
79 
80 /*
81 struct CommandFragLightPositionXY
82 {
83     u32 x     : 16;
84     u32 y     : 16;
85 };
86 */
87 // PICA_REG_FRAG_LIGHT0_POSITION_XY         0x144 to 0x1b4
88 #define PICA_CMD_DATA_FRAG_LIGHT_POSITION_XY(x, y) \
89     ( (x) | (y) << 16 )
90 
91 // PICA_REG_FRAG_LIGHT0_SPOT_XY    0x146 to 0x1b6
92 #define PICA_CMD_DATA_FRAG_LIGHT_SPOT_XY(x, y) \
93     ( (x) | (y) << 16 )
94 
95 /*
96 struct CommandFragLightPositionZ
97 {
98     u32 z     : 16;
99     CMD_PADDING(16);
100 };
101 */
102 
103 // PICA_REG_FRAG_LIGHT0_POSITION_Z          0x145 to 0x1b5
104 #define PICA_CMD_DATA_FRAG_LIGHT_POSITION_Z(z) ( z )
105 
106 // PICA_REG_FRAG_LIGHT0_SPOT_Z     0x147 to 0x1b7
107 #define PICA_CMD_DATA_FRAG_LIGHT_SPOT_Z(z) ( z )
108 
109 //  PICA_REG_FRAG_LIGHT0_DIST_ATTN_BIAS       0x14a to 0x1ba
110 #define PICA_CMD_DATA_FRAG_LIGHT_DIST_ATTN_BIAS(bias) ( bias )
111 
112 // PICA_REG_FRAG_LIGHT0_DIST_ATTN_SCALE       0x14b to 0x1bb
113 #define PICA_CMD_DATA_FRAG_LIGHT_DIST_ATTN_SCALE(scale) ( scale )
114 
115 
116 /*
117 struct CommandFragLightType
118 {
119     u32 w              : 1;
120     u32 twoSideDiffuse : 1;
121     u32 geomFactor0    : 1;
122     u32 geomFactor1    : 1;
123     CMD_PADDING(28);
124 };
125 */
126 // PICA_REG_FRAG_LIGHT0_TYPE       0x149 to 0x1b9
127 #define PICA_CMD_DATA_FRAG_LIGHT_TYPE(w, twoSideDiffuse, geomFactor0, geomFactor1) \
128     ( ((w) == 0) ? 1 : 0              | \
129       ((twoSideDiffuse) ? 1 : 0) << 1 | \
130       ((geomFactor0) ? 1 : 0)    << 2 | \
131       ((geomFactor1) ? 1 : 0)    << 3)
132 
133 /*
134 struct CommandFragLightFuncMode1
135 {
136     u32 shadowed                   : 8;
137     u32 spotEnabled                : 8;
138     u32 lutEnabledD0               : 1;
139     u32 lutEnabledD1               : 1;
140     CMD_PADDING(1);
141     u32 fresnelSelector : 1;
142     u32 lutEnabledRefl             : 3;
143     CMD_PADDING(1);
144     u32 distanceAttenuationEnabled : 8;
145 };
146 */
147 
148 // PICA_REG_FRAG_LIGHT_FUNC_MODE1       0x1c4
149 // i is the number of light source number
150 #define PICA_CMD_DATA_FRAG_LIGHT_FUNC_MODE1(shadowed, spotEnabled, lutEnabledD0,  \
151     lutEnabledD1, fresnelSelector, lutEnabledRefl, distanceAttenuationEnabled, i) \
152     ( ((shadowed) ? 0 : 1)        << i   | \
153       ((spotEnabled) ? 0 : 1)     << 8+i | \
154       ((lutEnabledD0) ? 0 : 1)    << 16  | \
155       ((lutEnabledD1) ? 0 : 1)    << 17  | \
156       1                           << 18  | \
157       ((fresnelSelector) ? 0 : 1) << 19  | \
158       ((lutEnabledRefl) ? 0 : 7)  << 20  | \
159       ((distanceAttenuationEnabled) ? 0 : 1) << 24+i )
160 
161 #define PICA_CMD_DATA_FRAG_LIGHT_FUNC_MODE1_LIGHT_SOURCE(i, \
162     shadowed, spotEnabled, distanceAttenuationEnabled)      \
163     ( ((shadowed) ? 0 : 1)        << i   |                  \
164       ((spotEnabled) ? 0 : 1)     << 8+i |                  \
165       1                           << 18  |                  \
166       ((distanceAttenuationEnabled) ? 0 : 1) << 24+i )
167 
168 #define PICA_CMD_DATA_FRAG_LIGHT_FUNC_MODE1_LUT(lutEnabledD0, \
169     lutEnabledD1, fresnelSelector, lutEnabledRefl)            \
170     ( ((lutEnabledD0) ? 0 : 1)    << 16 |                     \
171       ((lutEnabledD1) ? 0 : 1)    << 17 |                     \
172       1 << 18                           |                     \
173       ((fresnelSelector) ? 0 : 1) << 19 |                     \
174       ((lutEnabledRefl) ? 0 : 7)  << 20 )
175 
176 ///////////////////////////////////
177 // Fragment light Lut Table
178 /*
179 struct CommandFragLightLut
180 {
181     u32 index : 8;
182     u32 type   : 4;
183     CMD_PADDING(20);
184 };
185 */
186 
187 /* Please see man pages for details
188 
189 
190 */
191 enum PicaDataFragLightSampler
192 {
193     //
194     PICA_DATA_SAMPLER_D0 = 0x0,
195     //
196     PICA_DATA_SAMPLER_D1 = 0x1,
197     //
198     PICA_DATA_SAMPLER_FR = 0x3,
199     //
200     PICA_DATA_SAMPLER_RB = 0x4,
201     //
202     PICA_DATA_SAMPLER_RG = 0x5,
203     //
204     PICA_DATA_SAMPLER_RR = 0x6,
205 
206     //
207     PICA_DATA_SAMPLER_SP = 0x8,
208     //
209     PICA_DATA_FRAG_LIGHT0_SAMPLER_SP = 0x8 + 0x0,
210     //
211     PICA_DATA_FRAG_LIGHT1_SAMPLER_SP = 0x8 + 0x1,
212     //
213     PICA_DATA_FRAG_LIGHT2_SAMPLER_SP = 0x8 + 0x2,
214     //
215     PICA_DATA_FRAG_LIGHT3_SAMPLER_SP = 0x8 + 0x3,
216     //
217     PICA_DATA_FRAG_LIGHT4_SAMPLER_SP = 0x8 + 0x4,
218     //
219     PICA_DATA_FRAG_LIGHT5_SAMPLER_SP = 0x8 + 0x5,
220     //
221     PICA_DATA_FRAG_LIGHT6_SAMPLER_SP = 0x8 + 0x6,
222     //
223     PICA_DATA_FRAG_LIGHT7_SAMPLER_SP = 0x8 + 0x7,
224 
225     //
226     PICA_DATA_SAMPLER_DA  = 0x10,
227     //
228     PICA_DATA_FRAG_LIGHT0_SAMPLER_DA = 0x10 + 0x0,
229     //
230     PICA_DATA_FRAG_LIGHT1_SAMPLER_DA = 0x10 + 0x1,
231     //
232     PICA_DATA_FRAG_LIGHT2_SAMPLER_DA = 0x10 + 0x2,
233     //
234     PICA_DATA_FRAG_LIGHT3_SAMPLER_DA = 0x10 + 0x3,
235     //
236     PICA_DATA_FRAG_LIGHT4_SAMPLER_DA = 0x10 + 0x4,
237     //
238     PICA_DATA_FRAG_LIGHT5_SAMPLER_DA = 0x10 + 0x5,
239     //
240     PICA_DATA_FRAG_LIGHT6_SAMPLER_DA = 0x10 + 0x6,
241     //
242     PICA_DATA_FRAG_LIGHT7_SAMPLER_DA = 0x10 + 0x7
243 };
244 // PICA_REG_FRAG_LIGHT_LUT          0x1c5
245 #define PICA_CMD_DATA_FRAG_LIGHT_LUT(index, type) \
246     ( (index) | (type) << 8)
247 
248 /*
249 struct CommandFragLightLutData
250 {
251     u32 d1  : 12;
252     u32 d2  : 12;
253     CMD_PADDING(8);
254 };
255 */
256 // PICA_REG_FRAG_LIGHT_LUT_DATA0   0x1c8 to 0x1cf
257 #define PICA_CMD_DATA_FRAG_LIGHT_LUT_DATA(data1, data2) \
258     ( (data1) | (data2) << 12 )
259 
260 ///////////////////////////////////
261 // Fragment LightEnv absLutInput
262 /*
263 struct CommandFragLightEnvAbsLutInput
264 {
265     CMD_PADDING(1);
266     u32 D0  : 1;
267     CMD_PADDING(3);
268     u32 D1  : 1;
269     CMD_PADDING(3);
270     u32 SP  : 1;
271     CMD_PADDING(3);
272     u32 FR  : 1;
273     CMD_PADDING(3);
274     u32 RB  : 1;
275     CMD_PADDING(3);
276     u32 RG  : 1;
277     CMD_PADDING(3);
278     u32 RR  : 1;
279     CMD_PADDING(6);
280 };
281 */
282 // PICA_REG_FRAG_LIGHT_ABSLUTINPUT  0x1d0
283 #define PICA_CMD_DATA_FRAG_LIGHT_ABSLUTINPUT(D0, D1, SP, FR, RB, RG, RR) \
284     ( ((D0) ? 0 : 1) <<  1 | \
285       ((D1) ? 0 : 1) <<  5 | \
286       ((SP) ? 0 : 1) <<  9 | \
287       ((FR) ? 0 : 1) << 13 | \
288       ((RB) ? 0 : 1) << 17 | \
289       ((RG) ? 0 : 1) << 21 | \
290       ((RR) ? 0 : 1) << 25 )
291 
292 ///////////////////////////////////
293 // Fragment LightEnv LutInput
294 /*
295 struct CommandFragLightEnvLutInput
296 {
297     u32 D0  : 3;
298     CMD_PADDING(1);
299     u32 D1  : 3;
300     CMD_PADDING(1);
301     u32 SP  : 3;
302     CMD_PADDING(1);
303     u32 FR  : 3;
304     CMD_PADDING(1);
305     u32 RB  : 3;
306     CMD_PADDING(1);
307     u32 RG  : 3;
308     CMD_PADDING(1);
309     u32 RR  : 3;
310     CMD_PADDING(5);
311 };
312 */
313 
314 /* Please see man pages for details
315 
316 
317 */
318 enum PicaDataFragLightEnvLutInput
319 {
320     //
321     PICA_DATA_FRAG_LIGHT_ENV_NH_DMP = 0x0,
322     //
323     PICA_DATA_FRAG_LIGHT_ENV_VH_DMP = 0x1,
324     //
325     PICA_DATA_FRAG_LIGHT_ENV_NV_DMP = 0x2,
326     //
327     PICA_DATA_FRAG_LIGHT_ENV_LN_DMP = 0x3,
328     //
329     PICA_DATA_FRAG_LIGHT_ENV_SP_DMP = 0x4,
330     //
331     PICA_DATA_FRAG_LIGHT_ENV_CP_DMP = 0x5
332 };
333 
334 // PICA_REG_FRAG_LIGHT_LUTINPUT    0x1d1
335 #define PICA_CMD_DATA_FRAG_LIGHT_ENV_LUTINPUT(D0, D1, SP, FR, RB, RG, RR) \
336     ( (D0) | (D1) << 4 | (SP) << 8 | \
337       (FR) << 12 | (RB) << 16 | (RG) << 20 | (RR) << 24 )
338 
339 ///////////////////////////////////
340 // Fragment LightEnv lutScale
341 /*
342 struct CommandFragLightEnvLutScale
343 {
344     u32 D0  : 3;
345     CMD_PADDING(1);
346     u32 D1  : 3;
347     CMD_PADDING(1);
348     u32 SP  : 3;
349     CMD_PADDING(1);
350     u32 FR  : 3;
351     CMD_PADDING(1);
352     u32 RB  : 3;
353     CMD_PADDING(1);
354     u32 RG  : 3;
355     CMD_PADDING(1);
356     u32 RR  : 3;
357     CMD_PADDING(5);
358 };
359 */
360 
361 /* Please see man pages for details
362 
363 
364 */
365 enum PicaDataFragLightEnvLutScale
366 {
367     //
368     PICA_DATA_FRAG_LIGHT_ENV_LUTSCALE_1_0  = 0x0,
369     //
370     PICA_DATA_FRAG_LIGHT_ENV_LUTSCALE_2_0  = 0x1,
371     //
372     PICA_DATA_FRAG_LIGHT_ENV_LUTSCALE_4_0  = 0x2,
373     //
374     PICA_DATA_FRAG_LIGHT_ENV_LUTSCALE_8_0  = 0x3,
375     //
376     PICA_DATA_FRAG_LIGHT_ENV_LUTSCALE_0_25 = 0x6,
377     //
378     PICA_DATA_FRAG_LIGHT_ENV_LUTSCALE_0_5  = 0x7
379 };
380 
381 //  PICA_REG_FRAG_LIGHT_LUTSCALE    0x1d2
382 #define PICA_CMD_DATA_FRAG_LIGHT_ENV_LUTSCALE(D0, D1, SP, FR, RB, RG, RR) \
383     ( (D0) | (D1) << 4 | (SP) << 8 | \
384       (FR) << 12 | (RB) << 16 | (RG) << 20 | (RR) << 24 )
385 
386 
387 ///////////////////////////////////
388 // Fragment LightEnv Shadow
389 // Fragment LightEnv Misc
390 /*
391 struct CommandFragLightEnvFuncMode0
392 {
393     u32 common          : 1;
394     CMD_PADDING(1);
395     u32 fresnelSelector : 2;
396     u32 config          : 4;
397     CMD_PADDING(8);
398     u32 shadowPrimary   : 1;
399     u32 shadowSecondary : 1;
400     u32 invertShadow    : 1;
401     u32 shadowAlpha     : 1;
402     CMD_PADDING(2);
403     u32 bumpSelector    : 2;
404     u32 shadowSelector  : 2;
405     CMD_PADDING(1);
406     u32 clampHighlights : 1;
407     u32 bumpMode        : 2;
408     u32 bumpRenorm      : 1;
409     CMD_PADDING(1);   // 0x1
410 };
411 */
412 
413 // 0x1c3 [0:0]
414 #define PICA_CMD_DATA_FRAG_LIGHT_ENV_SHADOW_ATTN(shadowPrimary, shadowSecondary, shadowAlpha) \
415     ( ( (shadowPrimary) | (shadowSecondary) | (shadowAlpha) ) ? 1 : 0 )
416 
417 /* Please see man pages for details
418 
419 
420 
421 */
422 enum PicaDataFragLightEnvTexture
423 {
424     //
425     PICA_DATA_FRAG_LIGHT_ENV_TEXTURE0 = 0x0,
426     //
427     PICA_DATA_FRAG_LIGHT_ENV_TEXTURE1 = 0x1,
428     //
429     PICA_DATA_FRAG_LIGHT_ENV_TEXTURE2 = 0x2,
430     //
431     PICA_DATA_FRAG_LIGHT_ENV_TEXTURE3 = 0x3
432 };
433 
434 // 0x1c3 [7:4]
435 
436 /* Please see man pages for details
437 
438 
439 
440 */
441 enum PicaDataFragLightEnvLayerConfig
442 {
443     //
444     PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG0 = 0x0,
445     //
446     PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG1 = 0x1,
447     //
448     PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG2 = 0x2,
449     //
450     PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG3 = 0x3,
451     //
452     PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG4 = 0x4,
453     //
454     PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG5 = 0x5,
455     //
456     PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG6 = 0x6,
457     //
458     PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG7 = 0x8
459 };
460 
461 // 0x1c3 [3:2]
462 /* Please see man pages for details
463 
464 
465 
466 */
467 enum PicaDataFragLightEnvFresnel
468 {
469     //
470     PICA_DATA_FRAG_LIGHT_ENV_NO_FRESNEL            = 0x0,
471     //
472     PICA_DATA_FRAG_LIGHT_ENV_PRI_ALPHA_FRESNEL     = 0x1,
473     //
474     PICA_DATA_FRAG_LIGHT_ENV_SEC_ALPHA_FRESNEL     = 0x2,
475     //
476     PICA_DATA_FRAG_LIGHT_ENV_PRI_SEC_ALPHA_FRESNEL = 0x3
477 };
478 
479 // 0x1c3 [29:28]
480 /* Please see man pages for details
481 
482 
483 
484 */
485 enum PicaDataFragLightEnvBump
486 {
487     //
488     PICA_DATA_FRAG_LIGHT_ENV_BUMP_NOT_USED_DMP = 0x0,
489     //
490     PICA_DATA_FRAG_LIGHT_ENV_BUMP_AS_BUMP_DMP  = 0x1,
491     //
492     PICA_DATA_FRAG_LIGHT_ENV_BUMP_AS_TANG_DMP  = 0x2
493 };
494 
495 #define PICA_CMD_DATA_FRAG_LIGHT_ENV_BUMP(bumpMode, bumpRenorm) \
496     ( ((bumpRenorm) | (bumpMode ==  PICA_DATA_FRAG_LIGHT_ENV_BUMP_NOT_USED_DMP) ) ? 0 : 1 )
497 
498 // PICA_REG_FRAG_LIGHT_FUNC_MODE0      0x1c3
499 #define PICA_CMD_DATA_FRAG_LIGHT_FUNC_MODE0(fresnelSelector, config,          \
500      shadowPrimary, shadowSecondary, invertShadow, shadowAlpha, bumpSelector, \
501      shadowSelector,  clampHighlights, bumpMode, bumpRenorm)                  \
502      ( PICA_CMD_DATA_FRAG_LIGHT_ENV_SHADOW_ATTN(shadowPrimary, shadowSecondary, shadowAlpha) | \
503        ( (fresnelSelector)           <<  2) | \
504        ( (config)                    <<  4) | \
505        ( 4                           <<  8) | \
506        ( ((shadowPrimary) ? 1 : 0)   << 16) | \
507        ( ((shadowSecondary) ? 1 : 0) << 17) | \
508        ( ((invertShadow) ? 1 : 0)    << 18) | \
509        ( ((shadowAlpha) ? 1 : 0)     << 19) | \
510        ( (bumpSelector)              << 22) | \
511        ( (shadowSelector)            << 24) | \
512        ( ((clampHighlights) ? 1 : 0) << 27) | \
513        ( (bumpMode)                  << 28) | \
514        ( PICA_CMD_DATA_FRAG_LIGHT_ENV_BUMP(bumpMode, bumpRenorm) << 30) | \
515          0x80000000 )
516 
517 /*
518 
519 */
520 
521 #endif // NN_GX_CTR_GX_MACRO_FRAGMENT_H_
522