1  /*---------------------------------------------------------------------------*
2   Project:  PICA register macro header
3   File:     gx_MacroMisc.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: 25941 $
14  *---------------------------------------------------------------------------*/
15 #ifndef NN_GX_CTR_PICA_MACRO_MISC_H_
16 #define NN_GX_CTR_PICA_MACRO_MISC_H_
17 
18 #include <nn/gx/CTR/gx_MacroCommon.h>
19 
20 
21 
22 ///////////////////////////////////
23 // Render Buffer
24 
25 // PICA_REG_RENDER_BUFFER_COLOR_ADDR   0x11d
26 #define PICA_CMD_DATA_RENDER_BUFFER_COLOR_ADDR( addr ) ( (addr) >> 3 )
27 
28 
29 // PICA_REG_RENDER_BUFFER_DEPTH_ADDR   0x11c
30 #define PICA_CMD_DATA_RENDER_BUFFER_DEPTH_ADDR( addr ) ( (addr) >> 3 )
31 
32 /*
33 struct CommandRenderBufColorMode
34 {
35     u32 pixSize : 2;
36     CMD_PADDING(14);
37     u32 format  : 3;
38     CMD_PADDING(13);
39 };
40 */
41 
42 enum PicaDataColorPixelSize
43 {
44     PICA_DATA_COLOR_PIXEL_SIZE16 = 0x0,
45     PICA_DATA_COLOR_PIXEL_SIZE32 = 0x2
46 };
47 
48 enum PicaDataColor
49 {
50     PICA_DATA_COLOR_RGBA8_OES = 0x0,
51     PICA_DATA_COLOR_GAS_DMP   = 0x0,
52     PICA_DATA_COLOR_RGB5_A1   = 0x2,
53     PICA_DATA_COLOR_RGB565    = 0x3,
54     PICA_DATA_COLOR_RGBA4     = 0x4
55 };
56 
57 // PICA_REG_RENDER_BUFFER_COLOR_MODE   0x117
58 #define PICA_CMD_DATA_RENDER_BUFFER_COLOR_MODE( pixSize, format ) \
59     ( (pixSize) | (format) << 16 )
60 
61 enum PicaDataDepth
62 {
63     PICA_DATA_DEPTH_COMPONENT16     = 0x0,
64     PICA_DATA_DEPTH_COMPONENT24_OES = 0x2,
65     PICA_DATA_DEPTH24_STENCIL8_EXT  = 0x3
66 };
67 
68 // PICA_REG_RENDER_BUFFER_DEPTH_MODE   0x116
69 #define PICA_CMD_DATA_RENDER_BUFFER_DEPTH_MODE( mode ) (mode)
70 
71 /*
72 struct CommandRenderBufResolution
73 {
74     u32 width   : 11;
75     CMD_PADDING(1);
76     u32 height  : 10;
77     CMD_PADDING(2);
78     CMD_PADDING(8):   // 0x01
79 };
80 */
81 // PICA_REG_RENDER_BUFFER_RESOLUTION0    0x11e
82 // PICA_REG_RENDER_BUFFER_RESOLUTION1    0x6e
83 #define PICA_CMD_DATA_RENDER_BUFFER_RESOLUTION( width, height ) \
84     ( (width)            | \
85       (height - 1) << 12 | \
86       0x01000000 )
87 
88 
89 ///////////////////////////////////
90 // Gas Light
91 // Fog
92 // Depth Test
93 // Gas
94 /*
95 struct CommandGasLightXY
96 {
97     u32 lightXY1 : 8;
98     u32 lightXY2 : 8;
99     u32 lightXY3 : 8;
100     CMD_PADDING(8);
101 };
102 */
103 // PICA_REG_GAS_LIGHT_XY            0x120
104 #define PICA_CMD_DATA_GAS_LIGHT_XY(lightXY1, lightXY2, lightXY3) \
105     ( (lightXY1) | (lightXY2) << 8 | (lightXY3) << 16 )
106 
107 // PICA_REG_GAS_LIGHT_Z             0x121
108 #define PICA_CMD_DATA_GAS_LIGHT_Z(lightZ1, lightZ2, lightZ3) \
109     ( (lightZ1) | (lightZ2) << 8 | (lightZ3) << 16 )
110 
111 /*
112 struct CommandGasLightZColor
113 {
114     u32 lightz         : 8;
115     u32 colorLutInput  : 1;
116     CMD_PADDING(23);
117 };
118 */
119 
120 // colorLutInput
121 enum PicaDataGasColorLutInput
122 {
123     PICA_DATA_GAS_DENSITY_DMP      = 0x0,
124     PICA_DATA_GAS_LIGHT_FACTOR_DMP = 0x1
125 };
126 
127 // PICA_REG_GAS_LIGHT_Z_COLOR         0x122
128 #define PICA_CMD_DATA_GAS_LIGHT_Z_COLOR(lightZ4, colorLutInput) \
129     ( (lightZ4) | ((colorLutInput) ? 1 : 0) << 8 )
130 
131 /*
132 struct CommandGasDeltaZDepth
133 {
134     u32 deltaZ     : 24;
135     u32 depthFunc  : 2;
136     CMD_PADDING(6);
137 };
138 */
139 
140 enum PicaDataDepthTest2
141 {
142     PICA_DATA_DEPTH_TEST2_NEVER   = 0x0,
143     PICA_DATA_DEPTH_TEST2_ALWAYS  = 0x1,
144     PICA_DATA_DEPTH_TEST2_GREATER = 0x2,
145     PICA_DATA_DEPTH_TEST2_GEQUAL  = 0x2,
146     PICA_DATA_DEPTH_TEST2_OTHER   = 0x3
147 };
148 
149 // PICA_REG_GAS_DELTAZ_DEPTH        0x126
150 #define PICA_CMD_DATA_GAS_DELTAZ_DEPTH(deltaZ, depthTest2Func) \
151     ( (deltaZ) | (depthTest2Func) << 24 )
152 
153 /*
154 struct CommandGasFogMode
155 {
156     u32 FogMode            : 3;
157     u32 shadingDensitySrc  : 1;
158     CMD_PADDING(12);
159     u32 zFlip              : 1;
160     CMD_PADDING(15);
161 };
162 */
163 
164 // Fog
165 enum PicaDataFogMode
166 {
167     PICA_DATA_FOG_FALSE  = 0x0,
168     PICA_DATA_FOG        = 0x5,
169     PICA_DATA_GAS        = 0x7
170 };
171 
172 enum PicaDataGasShadingDensitySrc
173 {
174     PICA_DATA_GAS_PLAIN_DENSITY_DMP = 0x0,
175     PICA_DATA_GAS_DEPTH_DENSITY_DMP = 0x1
176 };
177 
178 // PICA_REG_GAS_FOG_MODE            0x0e0
179 #define PICA_CMD_DATA_GAS_FOG_MODE(fogMode, shadingDensitySrc, zFlip) \
180     ( (fogMode) | \
181       ((shadingDensitySrc) ? 1 : 0) << 3 | \
182       ((zFlip) ? 1 : 0) << 16)
183 
184 #define PICA_CMD_SET_GAS_FOG_MODE(fogMode, shadingDensitySrc, zFlip) \
185     PICA_CMD_DATA_GAS_FOG_MODE(fogMode, shadingDensitySrc, zFlip), \
186     PICA_CMD_HEADER_SINGLE_BE(PICA_REG_GAS_FOG_MODE, 0x5)
187 
188 // PICA_REG_GAS_ATTENUATION         0x0e4
189 #define PICA_CMD_DATA_GAS_ATTENUATION(attenuation) (attenuation)
190 
191 // PICA_REG_GAS_ACCMAX              0x0e5
192 #define PICA_CMD_DATA_GAS_ACCMAX(accMax) (accMax)
193 
194 ///////////////////////////////////
195 // Gas shading Lut Table
196 
197 // PICA_REG_GAS_LUT_INDEX           0x123
198 #define PICA_CMD_DATA_GAS_LUT_INDEX(index) (index)
199 
200 // PICA_REG_GAS_LUT_DATA            0x124
201 #define PICA_CMD_DATA_GAS_LUT_DATA(color8) \
202     ( (color8.r) | (color8.g) << 8 | (color8.b) << 16 )
203 
204 ///////////////////////////////////
205 // Fog
206 
207 // PICA_REG_FOG_COLOR               0x0e1
208 #define PICA_CMD_DATA_FOG_COLOR(color8) \
209     ( (color8.r) | (color8.g) << 8 | (color8.b) << 16 )
210 
211 ///////////////////////////////////
212 // Fog Reference Table
213 
214 // PICA_REG_FOG_LUT_INDEX       0x0e6
215 #define PICA_CMD_DATA_FOG_LUT_INDEX(index) (index)
216 
217 // PICA_REG_FOG_LUT_DATA0       0x0e8 to 0x0ef
218 #define PICA_CMD_DATA_FOG_LUT_DATA(data) (data)
219 
220 
221 ///////////////////////////////////
222 // Fragment Operation mode
223 // Blend / LogicOp
224 /*
225 struct CommandColorOperation
226 {
227     u32 fragOpMode : 2;
228     CMD_PADDING(6);
229     u32 blendMode  : 1;
230     CMD_PADDING(7);
231     CMD_PADDING(16);      // 0x0e4
232 
233 };
234 */
235 
236 // 0x100 [1:0]
237 enum PicaDataFragOpMode
238 {
239     PICA_DATA_FRAGOP_MODE_DMP         = 0x0,
240     PICA_DATA_FRAGOP_MODE_GAS_ACC_DMP = 0x1,
241     PICA_DATA_FRAGOP_MODE_SHADOW_DMP  = 0x3
242 };
243 
244 // 0x100 [8:8]
245 enum PicaDataColorLogicOp
246 {
247     PICA_DATA_ENABLE_COLOR_LOGIC_OP = 0x0,
248     PICA_DATA_ENABLE_BLEND          = 0x1
249 };
250 
251 // PICA_REG_COLOR_OPERATION             0x100
252 #define PICA_CMD_DATA_COLOR_OPERATION(fragOpMode, blendMode) \
253     ( (fragOpMode) | (blendMode) << 8 | 0x0e4 << 16 )
254 
255 ///////////////////////////////////
256 // Fragment Operation  shadow
257 
258 // PICA_REG_FRAGOP_SHADOW          0x130
259 #define PICA_CMD_DATA_FRAGOP_SHADOW(penumbraScale, penumbraBias) \
260     (( (penumbraScale) << 16) | (penumbraBias) )
261 
262 ///////////////////////////////////
263 // Fragment Operation Double buffer
264 
265 // PICA_REG_FRAGOP_WSCALE          0x06d
266 #define PICA_CMD_DATA_FRAGOP_WSCALE(value) ((value == 0) ? 1 : 0)
267 
268 // PICA_REG_FRAGOP_WSCALE_DATA1    0x04d
269 // PICA_REG_FRAGOP_WSCALE_DATA2    0x04e
270 #define PICA_CMD_DATA_FRAGOP_WSCALE_DATA(data) (data)
271 
272 ///////////////////////////////////
273 // Fragment Operation User Clipping
274 
275 // PICA_REG_FRAGOP_CLIP            0x047
276 
277 // 0x47 [0:0]
278 #define PICA_CMD_DATA_FRAGOP_CLIP(mode) ((mode) ? 1 : 0)
279 
280 #define PICA_CMD_SET_FRAGOP_CLIP(mode) \
281     PICA_CMD_DATA_FRAGOP_CLIP(mode),   \
282     PICA_CMD_HEADER_SINGLE_BE(PICA_REG_FRAGOP_CLIP, 0x1)
283 
284 // PICA_REG_FRAGOP_CLIP_DATA1      0x048
285 // PICA_REG_FRAGOP_CLIP_DATA2      0x049
286 // PICA_REG_FRAGOP_CLIP_DATA3      0x04a
287 // PICA_REG_FRAGOP_CLIP_DATA4      0x04b
288 #define PICA_CMD_DATA_FRAGOP_CLIP_DATA(data) (data)
289 
290 ///////////////////////////////////
291 // Fragment Operation AlphaTest
292 
293 enum PicaDataAlphaTest
294 {
295     PICA_DATA_ALPHA_TEST_NEVER    = 0x0,
296     PICA_DATA_ALPHA_TEST_ALWAYS   = 0x1,
297     PICA_DATA_ALPHA_TEST_EQUAL    = 0x2,
298     PICA_DATA_ALPHA_TEST_NOTEQUAL = 0x3,
299     PICA_DATA_ALPHA_TEST_LESS     = 0x4,
300     PICA_DATA_ALPHA_TEST_LEQUAL   = 0x5,
301     PICA_DATA_ALPHA_TEST_GREATER  = 0x6,
302     PICA_DATA_ALPHA_TEST_GEQUAL   = 0x7
303 };
304 
305 /*
306 struct CommandAlphaTest
307 {
308     u32 alphaTestFunc   : 7;
309     CMD_PADDING(1);
310     u32 alphaRefValue   : 8; // [0-255]
311     CMD_PADDING(16);
312 };
313 */
314 
315 #define PICA_CMD_DATA_FRAGOP_ALPHA_TEST_DISABLE() 0x0
316 
317 // PICA_REG_FRAGOP_ALPHA_TEST      0x104
318 #define PICA_CMD_DATA_FRAGOP_ALPHA_TEST( enable, func, value ) \
319     ( ((enable) ? 1 : 0) | \
320        (func)  << 4      | \
321        (value) << 8 )
322 
323 #define PICA_CMD_SET_DISABLE_ALPHA_TEST()      \
324     PICA_CMD_DATA_FRAGOP_ALPHA_TEST_DISABLE(), \
325     PICA_CMD_HEADER_SINGLE_BE( PICA_REG_FRAGOP_ALPHA_TEST, 0x1 )
326 
327 #define PICA_CMD_SET_ENABLE_ALPHA_TEST(func, value)    \
328     PICA_CMD_DATA_FRAGOP_ALPHA_TEST(0x1, func, value), \
329     PICA_CMD_HEADER_SINGLE_BE( PICA_REG_FRAGOP_ALPHA_TEST, 0x3 )
330 
331 ///////////////////////////////////
332 // Frame Buffer Access Control
333 
334 // PICA_REG_FRAME_BUFFER_MODE1      0x112
335 // PICA_REG_FRAME_BUFFER_MODE2      0x113
336 // PICA_REG_FRAME_BUFFER_MODE3      0x114
337 // PICA_REG_FRAME_BUFFER_MODE4      0x115
338 
339 #define PICA_CMD_DATA_FRAME_BUFFER_MODE(mode) (mode)
340 
341 
342 
343 ///////////////////////////////////
344 // Viewport Position Setting
345 
346 // PICA_REG_VIEWPORT_WIDTH1         0x041
347 // PICA_REG_VIEWPORT_WIDTH2         0x042
348 #define PICA_CMD_DATA_VIEWPORT_WIDTH(width)   (width)
349 
350 // PICA_REG_VIEWPORT_HEIGHT1        0x043
351 // PICA_REG_VIEWPORT_HEIGHT2        0x044
352 #define PICA_CMD_DATA_VIEWPORT_HEIGHT(height) (height)
353 
354 /*
355 struct CommandViewportXY
356 {
357     u32 x : 10;
358     CMD_PADDING(6);
359     u32 y : 10;
360     CMD_PADDING(6);
361 };
362 */
363 // PICA_REG_VIEWPORT_XY             0x068
364 #define PICA_CMD_DATA_VIEWPORT_XY(x, y)  ( (x) | (y) << 16 )
365 
366 
367 ///////////////////////////////////
368 // Depth test
369 // Color Mask
370 
371 enum PicaDataDepthTest
372 {
373     PICA_DATA_DEPTH_TEST_NEVER    = 0x0,
374     PICA_DATA_DEPTH_TEST_ALWAYS   = 0x1,
375     PICA_DATA_DEPTH_TEST_EQUAL    = 0x2,
376     PICA_DATA_DEPTH_TEST_NOTEQUAL = 0x3,
377     PICA_DATA_DEPTH_TEST_LESS     = 0x4,
378     PICA_DATA_DEPTH_TEST_LEQUAL   = 0x5,
379     PICA_DATA_DEPTH_TEST_GREATER  = 0x6,
380     PICA_DATA_DEPTH_TEST_GEQUAL   = 0x7
381 };
382 
383 /*
384 struct CommandDepthColorMask
385 {
386     u32 depthFunc   : 7;
387     CMD_PADDING(1);
388     u32 red   : 1;
389     u32 green : 1;
390     u32 blue  : 1;
391     u32 alpha : 1;
392     u32 depthMask   : 1;
393     CMD_PADDING(19);
394 };
395 */
396 
397 #define PICA_CMD_DATA_DEPTH_TEST_DISABLE() 0x0
398 
399 // PICA_REG_DEPTH_COLOR_MASK          0x107
400 #define PICA_CMD_DATA_DEPTH_COLOR_MASK( enableDepthTest, depthFunc,          \
401                                         red, green, blue, alpha, depthMask ) \
402     ( ((enableDepthTest) ? 1 : 0) | \
403       (depthFunc << 4)            | \
404       ((red)   ? 0x100 : 0)       | \
405       ((green) ? 0x200 : 0)       | \
406       ((blue)  ? 0x400 : 0)       | \
407       ((alpha) ? 0x800 : 0)       | \
408       ((depthMask) ? 0x1000 : 0) )
409 
410 
411 ///////////////////////////////////
412 // Blend / LogicOp
413 
414 // Blend Equation
415 
416 // 0x101 [2:0]
417 enum PicaDataBlendEquation
418 {
419     PICA_DATA_BLEND_EQUATION_ADD                = 0,
420     PICA_DATA_BLEND_EQUATION_SUBTRACT           = 1,
421     PICA_DATA_BLEND_EQUATION_REVERSE_SUBTRACT   = 2,
422     PICA_DATA_BLEND_EQUATION_MIN                = 3,
423     PICA_DATA_BLEND_EQUATION_MAX                = 4
424 };
425 
426 // 0x101 [19:16]
427 enum PicaDataBlendFunc
428 {
429     PICA_DATA_BLEND_FUNC_ZERO                     =  0,
430     PICA_DATA_BLEND_FUNC_ONE                      =  1,
431     PICA_DATA_BLEND_FUNC_SRC_COLOR                =  2,
432     PICA_DATA_BLEND_FUNC_ONE_MINUS_SRC_COLOR      =  3,
433     PICA_DATA_BLEND_FUNC_DST_COLOR                =  4,
434     PICA_DATA_BLEND_FUNC_ONE_MINUS_DST_COLOR      =  5,
435     PICA_DATA_BLEND_FUNC_SRC_ALPHA                =  6,
436     PICA_DATA_BLEND_FUNC_ONE_MINUS_SRC_ALPHA      =  7,
437     PICA_DATA_BLEND_FUNC_DST_ALPHA                =  8,
438     PICA_DATA_BLEND_FUNC_ONE_MINUS_DST_ALPHA      =  9,
439     PICA_DATA_BLEND_FUNC_CONSTANT_COLOR           = 10,
440     PICA_DATA_BLEND_FUNC_ONE_MINUS_CONSTANT_COLOR = 11,
441     PICA_DATA_BLEND_FUNC_CONSTANT_ALPHA           = 12,
442     PICA_DATA_BLEND_FUNC_ONE_MINUS_CONSTANT_ALPHA = 13,
443     PICA_DATA_BLEND_FUNC_SRC_ALPHA_SATURATE       = 14
444 };
445 
446 // PICA_REG_BLEND_FUNC               0x101
447 #define PICA_CMD_DATA_BLEND_FUNC_SEPARATE(eqRgb, eqAlpha, srcRgb, dstRgb, srcAlpha, dstAlpha) \
448     ((eqRgb) | (eqAlpha) << 8 | (srcRgb) << 16 | (dstRgb) << 20 | (srcAlpha) << 24 | (dstAlpha) << 28)
449 
450 #define PICA_CMD_DATA_BLEND_FUNC( eq, src, dst) \
451     PICA_CMD_DATA_BLEND_FUNC_SEPARATE(eq, eq, src, dst, src, dst)
452 
453 #define PICA_CMD_SET_BLEND_FUNC( eq, src, dst ) \
454     PICA_CMD_DATA_COLOR_OPERATION( PICA_DATA_FRAGOP_MODE, PICA_DATA_ENABLE_BLEND ), \
455     PICA_CMD_HEADER_SINGLE( PICA_REG_COLOR_OPERATION ), \
456     PICA_CMD_DATA_BLEND_FUNC( eq, src, dst ), \
457     PICA_CMD_HEADER_SINGLE( PICA_REG_BLEND_FUNC )
458 
459 #define PICA_CMD_SET_BLEND_FUNC_SEPARATE( eqRgb, eqAlpha, srcRgb, dstRgb, srcAlpha, dstAlpha) \
460     PICA_CMD_DATA_COLOR_OPERATION( PICA_DATA_FRAGOP_MODE, PICA_DATA_ENABLE_BLEND ), \
461     PICA_CMD_HEADER_SINGLE( PICA_REG_COLOR_OPERATION ), \
462     PICA_CMD_DATA_BLEND_FUNC_SEPARATE( eqRgb, eqAlpha, srcRgb, dstRgb, srcAlpha, dstAlpha ),  \
463     PICA_CMD_HEADER_SINGLE( PICA_REG_BLEND_FUNC )
464 
465 #define PICA_CMD_SET_BLEND_DEFAULT() \
466     PICA_CMD_SET_BLEND_FUNC( PICA_DATA_BLEND_EQUATION_ADD, PICA_DATA_BLEND_FUNC_SRC_ALPHA, PICA_DATA_BLEND_FUNC_ONE_MINUS_SRC_ALPHA )
467 
468 #define PICA_CMD_SET_BLEND_NOTHING() \
469     PICA_CMD_SET_BLEND_FUNC( PICA_DATA_BLEND_EQUATION_ADD, PICA_DATA_BLEND_FUNC_ONE, PICA_DATA_BLEND_FUNC_ZERO )
470 
471 
472 
473 // PICA_REG_LOGIC_OP                0x102
474 
475 enum PicaDataLogicOp
476 {
477     PICA_DATA_LOGIC_CLEAR                   = 0x0,
478     PICA_DATA_LOGIC_AND                     = 0x1,
479     PICA_DATA_LOGIC_AND_REVERSE             = 0x2,
480     PICA_DATA_LOGIC_COPY                    = 0x3,
481     PICA_DATA_LOGIC_SET                     = 0x4,
482     PICA_DATA_LOGIC_COPY_INVERTED           = 0x5,
483     PICA_DATA_LOGIC_NOOP                    = 0x6,
484     PICA_DATA_LOGIC_INVERT                  = 0x7,
485     PICA_DATA_LOGIC_NAND                    = 0x8,
486     PICA_DATA_LOGIC_OR                      = 0x9,
487     PICA_DATA_LOGIC_NOR                     = 0xa,
488     PICA_DATA_LOGIC_XOR                     = 0xb,
489     PICA_DATA_LOGIC_EQUIV                   = 0xc,
490     PICA_DATA_LOGIC_AND_INVERTED            = 0xd,
491     PICA_DATA_LOGIC_OR_REVERSE              = 0xe,
492     PICA_DATA_LOGIC_OR_INVERTED             = 0xf
493 };
494 
495 #define PICA_CMD_DATA_LOGIC_OP( logicOp ) (logicOp)
496 
497 // 0x101
498 // [31:28] = 0x0, [27:24] = 0x1, [23:20] = 0x0, [19:16] = 0x1
499 #define PICA_CMD_DATA_LOGIC_OP_ENABLE() \
500     ( (0x1 << 16) | (0x1 << 24) )
501 
502 #define PICA_CMD_SET_LOGIC_OP( logicOp ) \
503     PICA_CMD_DATA_COLOR_OPERATION( PICA_DATA_FRAGOP_MODE, PICA_DATA_ENABLE_COLOR_LOGIC_OP ), \
504     PICA_CMD_HEADER_SINGLE( PICA_REG_COLOR_OPERATION ), \
505     PICA_CMD_DATA_LOGIC_OP(logicOp), PICA_CMD_HEADER_SINGLE( PICA_REG_LOGIC_OP )
506 
507 // PICA_REG_BLEND_COLOR             0x103
508 #define PICA_CMD_DATA_BLEND_COLOR( color8 ) \
509     ( (color8.r) | (color8.g) << 8 | (color8.b) << 16 | (color8.a) << 24 )
510 
511 ///////////////////////////////////
512 // Early Depth Test
513 
514 // PICA_REG_EARLY_DEPTH_TEST1       0x062
515 // PICA_REG_EARLY_DEPTH_TEST2       0x118
516 #define PICA_CMD_DATA_EARLY_DEPTH_TEST( mode ) ((mode) ? 1 : 0)
517 
518 #define PICA_CMD_DATA_EARLY_DEPTH_TEST_DISABLE() 0x0
519 
520 #define PICA_CMD_SET_DISABLE_EARLY_DEPTH_TEST() \
521     PICA_CMD_DATA_EARLY_DEPTH_TEST_DISABLE(), PICA_CMD_HEADER_SINGLE_BE( PICA_REG_EARLY_DEPTH_TEST1, 0x1), \
522     PICA_CMD_DATA_EARLY_DEPTH_TEST_DISABLE(), PICA_CMD_HEADER_SINGLE( PICA_REG_EARLY_DEPTH_TEST2 )
523 
524 enum PicaDataEarlyDepth
525 {
526     PICA_DATA_EARLY_DEPTH_GEQUAL  = 0x0,
527     PICA_DATA_EARLY_DEPTH_GREATER = 0x1,
528     PICA_DATA_EARLY_DEPTH_LEQUAL  = 0x2,
529     PICA_DATA_EARLY_DEPTH_LESS    = 0x3
530 };
531 
532 // PICA_REG_EARLY_DEPTH_FUNC        0x061
533 #define PICA_CMD_DATA_EARLY_DEPTH_FUNC( func ) (func)
534 
535 #define PICA_CMD_SET_EARLY_DEPTH_FUNC(func) \
536     PICA_CMD_DATA_EARLY_DEPTH_FUNC(func), PICA_CMD_HEADER_SINGLE_BE( PICA_REG_EARLY_DEPTH_FUNC, 0x1)
537 
538 // PICA_REG_EARLY_DEPTH_DATA        0x06a
539 #define PICA_CMD_DATA_EARLY_DEPTH_DATA( depth ) (depth)
540 
541 #define PICA_CMD_SET_EARLY_DEPTH_DATA(data) \
542     PICA_CMD_DATA_EARLY_DEPTH_DATA(data), PICA_CMD_HEADER_SINGLE_BE( PICA_REG_EARLY_DEPTH_DATA, 0x7)
543 
544 
545 
546 ///////////////////////////////////
547 // Stencil Test
548 enum PicaDataStencilTest
549 {
550     PICA_DATA_STENCIL_TEST_NEVER    = 0x0,
551     PICA_DATA_STENCIL_TEST_ALWAYS   = 0x1,
552     PICA_DATA_STENCIL_TEST_EQUAL    = 0x2,
553     PICA_DATA_STENCIL_TEST_NOTEQUAL = 0x3,
554     PICA_DATA_STENCIL_TEST_LESS     = 0x4,
555     PICA_DATA_STENCIL_TEST_LEQUAL   = 0x5,
556     PICA_DATA_STENCIL_TEST_GREATER  = 0x6,
557     PICA_DATA_STENCIL_TEST_GEQUAL   = 0x7
558 };
559 
560 /*
561 struct CommandStencilTest
562 {
563     u32 glStencilFunc : 7;
564     CMD_PADDING(1);
565     u32 glStencilMask : 8;
566     u32 ref           : 8
567     u32 mask          : 8;
568 };
569 */
570 
571 // PICA_REG_STENCIL_TEST            0x105
572 #define PICA_CMD_DATA_STENCIL_TEST( enableStencilTest, stencilFunc, stencilMask, ref, mask) \
573     ( ((enableStencilTest) ? 1 : 0 ) | \
574       (stencilFunc) << 4             | \
575       (stencilMask) << 8             | \
576       (ref) << 16                    | \
577       (mask) << 24 )
578 
579 #define PICA_CMD_DATA_STENCIL_TEST_DISABLE() 0x0
580 
581 #define PICA_CMD_SET_DISABLE_STENCIL_TEST()\
582     PICA_CMD_DATA_STENCIL_TEST_DISABLE(), PICA_CMD_HEADER_SINGLE( PICA_REG_STENCIL_TEST )
583 
584 enum PicaDataStencilOp
585 {
586     PICA_DATA_STENCIL_OP_KEEP      = 0x0,
587     PICA_DATA_STENCIL_OP_ZERO      = 0x1,
588     PICA_DATA_STENCIL_OP_REPLACE   = 0x2,
589     PICA_DATA_STENCIL_OP_INCR      = 0x3,
590     PICA_DATA_STENCIL_OP_DECR      = 0x4,
591     PICA_DATA_STENCIL_OP_INVERT    = 0x5,
592     PICA_DATA_STENCIL_OP_INCR_WRAP = 0x6,
593     PICA_DATA_STENCIL_OP_DECR_WRAP = 0x7
594 };
595 
596 /*
597 struct CommandStencilOp
598 {
599     u32 fail  : 3;
600     CMD_PADDING(1);
601     u32 zfail : 3;
602     CMD_PADDING(1);
603     u32 zpass : 3
604     CMD_PADDING(21);
605 };
606 */
607 
608 // PICA_REG_STENCIL_OP              0x106
609 #define PICA_CMD_DATA_STENCIL_OP( fail, zfail, zpass) \
610     ( (fail)       | \
611       (zfail) << 4 | \
612       (zpass) << 8 )
613 
614 ///////////////////////////////////
615 // Cull Face
616 
617 // PICA_REG_CULL_FACE               0x040 [1:0]
618 #define PICA_CMD_DATA_CULL_FACE( mode ) (mode)
619 
620 #define PICA_CMD_SET_CULL_FACE( mode ) \
621     PICA_CMD_DATA_CULL_FACE( mode ) , PICA_CMD_HEADER_SINGLE( PICA_REG_CULL_FACE )
622 
623 ///////////////////////////////////
624 // Scissor
625 
626 // PICA_REG_SCISSOR                 0x065 [1:0]
627 #define PICA_CMD_DATA_SCISSOR( mode ) ((mode) ? 3 : 0)
628 
629 /*
630 struct CommandScissorSize
631 {
632     u32 size1  : 10;
633     CMD_PADDING(6);
634     u32 size2  : 10;
635     CMD_PADDING(6);
636 };
637 */
638 
639 // PICA_REG_SCISSOR_XY              0x066
640 #define PICA_CMD_DATA_SCISSOR_XY( x, y, colorBufferWidth, colorBufferHeight) \
641     ( ((x) < 0) ? 0 : ( (x >= colorBufferWidth)  ? (colorBufferWidth - 1)  : (x) ) ) | \
642     ( ((y) < 0) ? 0 : ( (y >= colorBufferHeight) ? (colorBufferHeight - 1) : (y) ) << 16 )
643 
644 
645 // PICA_REG_SCISSOR_SIZE            0x067
646 #define PICA_CMD_DATA_SCISSOR_SIZE( x, y ) \
647     ( ((x) < 0) ? 0 : (x) | \
648     ( ((y) < 0) ? 0 : (y)) << 16 )
649 
650 ///////////////////////////////////
651 // Render Block Format
652 
653 enum PicaDataRenderBlockFormat
654 {
655     PICA_DATA_RENDER_BLOCK8_MODE_DMP  = 0x0,
656     PICA_DATA_RENDER_BLOCK32_MODE_DMP = 0x1
657 };
658 
659 // PICA_REG_RENDER_BLOCK_FORMAT     0x11b
660 #define PICA_CMD_DATA_RENDER_BLOCK_FORMAT( mode ) ( (mode) ? 1 : 0 )
661 
662 ///////////////////////////////////
663 // Appendex registers
664 
665 // PICA_REG_COLOR_BUFFER_CLEAR0     0x110   Append: clear buffer register
666 // PICA_REG_COLOR_BUFFER_CLEAR1     0x111   Append: clear buffer register
667 
668 #define PICA_CMD_DATA_COLOR_DEPTH_BUFFER_CLEAR( data ) \
669     ( (data) ? 1 : 0 )
670 
671 #define PICA_CMD_SET_COLOR_DEPTH_BUFFER_CLEAR( data1, data2 ) \
672     PICA_CMD_DATA_COLOR_DEPTH_BUFFER_CLEAR(data1), PICA_CMD_HEADER_SINGLE(PICA_REG_COLOR_DEPTH_BUFFER_CLEAR1), \
673     PICA_CMD_DATA_COLOR_DEPTH_BUFFER_CLEAR(data2), PICA_CMD_HEADER_SINGLE(PICA_REG_COLOR_DEPTH_BUFFER_CLEAR0)
674 
675 #endif // NN_GX_CTR_PICA_MACRO_MISC_H_
676 
677