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