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