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