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: 34282 $
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   @addtogroup   nn_gx_CTR_Pica   PicaMacroHeader
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 /*!
46     @brief カラーバッファのフォーマットのピクセルサイズです。
47            PICA_REG_RENDER_BUFFER_COLOR_MODE レジスタ ( 0x117[1:0] ) で使います。
48 */
49 enum PicaDataColorPixelSize
50 {
51     //! カラーバッファのフォーマットのピクセルサイズが 16 bit です。
52     PICA_DATA_COLOR_PIXEL_SIZE16 = 0x0,
53     //! カラーバッファのフォーマットのピクセルサイズが 32 bit です。
54     PICA_DATA_COLOR_PIXEL_SIZE32 = 0x2
55 };
56 
57 
58 /*!
59     @brief カラーバッファのフォーマットです。
60            PICA_REG_RENDER_BUFFER_COLOR_MODE レジスタ ( 0x117[18:16] ) で使います。
61 */
62 enum PicaDataColor
63 {
64     //! RGBA8_OES フォーマットです。
65     PICA_DATA_COLOR_RGBA8_OES = 0x0,
66     //! GAS_DMP フォーマットです。
67     PICA_DATA_COLOR_GAS_DMP   = 0x0,
68     //! RGB5_A1 フォーマットです。
69     PICA_DATA_COLOR_RGB5_A1   = 0x2,
70     //! RGB565 フォーマットです。
71     PICA_DATA_COLOR_RGB565    = 0x3,
72     //! RGBA4 フォーマットです。
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 /*!
82     @brief デプスバッファのフォーマットです。
83            PICA_REG_RENDER_BUFFER_DEPTH_MODE レジスタ ( 0x116[1:0] ) で使います。
84 */
85 enum PicaDataDepth
86 {
87     //! DEPTH_COMPONENT16 フォーマットです。
88     PICA_DATA_DEPTH_COMPONENT16     = 0x0,
89     //! DEPTH_COMPONENT24_OES フォーマットです。
90     PICA_DATA_DEPTH_COMPONENT24_OES = 0x2,
91     //! DEPTH_COMPONENT24_STENCIL8_EXT フォーマットです。
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 /*!
150     @brief ガスのシェーディング参照テーブルの入力です。
151            PICA_REG_GAS_LIGHT_Z_COLOR レジスタ ( 0x122[8:8] ) で使います。
152            dmp_Gas.colorLutInput ユニフォームに相当します。
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 /*!
177     @brief デプステストの比較関数を設定します。
178            PICA_REG_GAS_DELTAZ_DEPTH レジスタ ( 0x126[25:24] ) で使います。
179            glDepthFunc() の引数 func に相当します
180 */
181 enum PicaDataDepthTest2
182 {
183     //! GL_NEVER です。
184     PICA_DATA_DEPTH_TEST2_NEVER   = 0x0,
185     //! GL_ALWAYS です。
186     PICA_DATA_DEPTH_TEST2_ALWAYS  = 0x1,
187     //! GL_GREATER です。
188     PICA_DATA_DEPTH_TEST2_GREATER = 0x2,
189     //! GL_GEQUAL です。
190     PICA_DATA_DEPTH_TEST2_GEQUAL  = 0x2,
191     //! GL_OTHER です。
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 /*!
213     @brief フォグ機能を設定します。
214            PICA_REG_GAS_FOG_MODE レジスタ ( 0x0e0[2:0] ) で使います。
215            dmp_Fog.mode ユニフォームに相当します。
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 /*!
228     @brief ガスのシェーディングで使用する密度情報を設定します。
229            PICA_REG_GAS_FOG_MODE レジスタ ( 0x0e0[3:3] ) で使います。
230            dmp_Gas.shadingDensitySrc ユニフォームに相当します。
231 */
232 enum PicaDataGasShadingDensitySrc
233 {
234     //! フォグへの入力密度情報 D1 をシェーディングに使用します。
235     PICA_DATA_GAS_PLAIN_DENSITY_DMP = 0x0,
236     //! フォグへの入力密度情報 D2 をシェーディングに使用します。
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 /*!
299     @brief フラグメントオペレーションの設定をします。
300            PICA_REG_COLOR_OPERATION レジスタ ( 0x100[1:0] ) で使います。
301            dmp_FragOperation.mode ユニフォームに相当します。
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 /*!
314     @brief 論理演算とブレンドの設定をします。
315            PICA_REG_COLOR_OPERATION レジスタ ( 0x100[8:8] ) で使います。
316            glEnable(GL_COLOR_LOGIC_OP), glDisable(GL_COLOR_LOGIC_OP) に相当します。
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 /*!
369     @brief アルファテストの比較関数を設定をします。
370            PICA_REG_FRAGOP_ALPHA_TEST レジスタ ( 0x104[6:4] ) で使います。
371            dmp_FragOperation.alphaTestFunc ユニフォームに相当します。
372 */
373 enum PicaDataAlphaTest
374 {
375     //! GL_NEVER です。
376     PICA_DATA_ALPHA_TEST_NEVER    = 0x0,
377     //! GL_ALWAYS です。
378     PICA_DATA_ALPHA_TEST_ALWAYS   = 0x1,
379     //! GL_EQUAL です。
380     PICA_DATA_ALPHA_TEST_EQUAL    = 0x2,
381     //! GL_NOTEQUAL です。
382     PICA_DATA_ALPHA_TEST_NOTEQUAL = 0x3,
383     //! GL_LESS です。
384     PICA_DATA_ALPHA_TEST_LESS     = 0x4,
385     //! GL_LEQUAL です。
386     PICA_DATA_ALPHA_TEST_LEQUAL   = 0x5,
387     //! GL_GREATER です。
388     PICA_DATA_ALPHA_TEST_GREATER  = 0x6,
389     //! GL_GEQUAL です。
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 /*!
460     @brief デプステストの比較関数を設定します。
461            PICA_REG_DEPTH_COLOR_MASK レジスタ ( 0x107[6:4] ) で使います。
462            glDepthFunc() の引数 func に相当します。
463 */
464 enum PicaDataDepthTest
465 {
466     //! GL_NEVER です。
467     PICA_DATA_DEPTH_TEST_NEVER    = 0x0,
468     //! GL_ALWAYS です。
469     PICA_DATA_DEPTH_TEST_ALWAYS   = 0x1,
470     //! GL_EQUAL です。
471     PICA_DATA_DEPTH_TEST_EQUAL    = 0x2,
472     //! GL_NOTEQUAL です。
473     PICA_DATA_DEPTH_TEST_NOTEQUAL = 0x3,
474     //! GL_LESS です。
475     PICA_DATA_DEPTH_TEST_LESS     = 0x4,
476     //! GL_LEQUAL です。
477     PICA_DATA_DEPTH_TEST_LEQUAL   = 0x5,
478     //! GL_GREATER です。
479     PICA_DATA_DEPTH_TEST_GREATER  = 0x6,
480     //! GL_GEQUAL です。
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 /*!
518     @brief ブレンドのモードを設定します。
519            PICA_REG_DEPTH_COLOR_MASK レジスタ ( 0x101[2:0] ) で使います。
520            glBlendEquation(), glBlendEquationSeparate() に相当します。
521 */
522 enum PicaDataBlendEquation
523 {
524     //! GL_FUNC_ADD です。
525     PICA_DATA_BLEND_EQUATION_ADD                = 0,
526     //! GL_FUNC_SUBTRACT です。
527     PICA_DATA_BLEND_EQUATION_SUBTRACT           = 1,
528     //! GL_FUNC_REVERSE_SUBTRACT です。
529     PICA_DATA_BLEND_EQUATION_REVERSE_SUBTRACT   = 2,
530     //! GL_MIN です。
531     PICA_DATA_BLEND_EQUATION_MIN                = 3,
532     //! GL_MAX です。
533     PICA_DATA_BLEND_EQUATION_MAX                = 4
534 };
535 
536 /*!
537     @brief ブレンドの関数を設定します。
538            PICA_REG_DEPTH_COLOR_MASK レジスタ( 0x101[19:16] ) で使います。
539            glBlendFunc(), glBlendFuncSeparate() の引数に相当します。
540 */
541 enum PicaDataBlendFunc
542 {
543     //! GL_ZERO です。
544     PICA_DATA_BLEND_FUNC_ZERO                     =  0,
545     //! GL_ONE です。
546     PICA_DATA_BLEND_FUNC_ONE                      =  1,
547     //! GL_SRC_COLOR です。
548     PICA_DATA_BLEND_FUNC_SRC_COLOR                =  2,
549     //! GL_ONE_MINUS_SRC_COLOR です。
550     PICA_DATA_BLEND_FUNC_ONE_MINUS_SRC_COLOR      =  3,
551     //! GL_DST_COLOR です。
552     PICA_DATA_BLEND_FUNC_DST_COLOR                =  4,
553     //! GL_ONE_MINUS_DST_COLOR です。
554     PICA_DATA_BLEND_FUNC_ONE_MINUS_DST_COLOR      =  5,
555     //! GL_SRC_ALPHA です。
556     PICA_DATA_BLEND_FUNC_SRC_ALPHA                =  6,
557     //! GL_ONE_MINUS_SRC_ALPHA です。
558     PICA_DATA_BLEND_FUNC_ONE_MINUS_SRC_ALPHA      =  7,
559     //! GL_DST_ALPHA です。
560     PICA_DATA_BLEND_FUNC_DST_ALPHA                =  8,
561     //! GL_ONE_MINUS_DST_ALPHA です。
562     PICA_DATA_BLEND_FUNC_ONE_MINUS_DST_ALPHA      =  9,
563     //! GL_CONSTANT_COLOR です。
564     PICA_DATA_BLEND_FUNC_CONSTANT_COLOR           = 10,
565     //! GL_ONE_MINUS_CONSTANT_COLOR です。
566     PICA_DATA_BLEND_FUNC_ONE_MINUS_CONSTANT_COLOR = 11,
567     //! GL_CONSTANT_ALPHA です。
568     PICA_DATA_BLEND_FUNC_CONSTANT_ALPHA           = 12,
569     //! GL_ONE_MINUS_CONSTANT_ALPHA です。
570     PICA_DATA_BLEND_FUNC_ONE_MINUS_CONSTANT_ALPHA = 13,
571     //! GL_SRC_ALPHA_SATURATE です。
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 /*!
602     @brief 論理演算を設定します。
603            PICA_REG_LOGIC_OP レジスタ( 0x102[3:0] ) で使います。
604            glLogicOp() の引数 opcode に相当します。
605 */
606 enum PicaDataLogicOp
607 {
608     //! GL_CLEAR です。
609     PICA_DATA_LOGIC_CLEAR                   = 0x0,
610     //! GL_AND です。
611     PICA_DATA_LOGIC_AND                     = 0x1,
612     //! GL_AND_REVERSE です。
613     PICA_DATA_LOGIC_AND_REVERSE             = 0x2,
614     //! GL_COPY です。
615     PICA_DATA_LOGIC_COPY                    = 0x3,
616     //! GL_SET です。
617     PICA_DATA_LOGIC_SET                     = 0x4,
618     //! GL_COPY_INVERTED です。
619     PICA_DATA_LOGIC_COPY_INVERTED           = 0x5,
620     //! GL_NOOP です。
621     PICA_DATA_LOGIC_NOOP                    = 0x6,
622     //! GL_INVERT です。
623     PICA_DATA_LOGIC_INVERT                  = 0x7,
624     //! GL_NAND です。
625     PICA_DATA_LOGIC_NAND                    = 0x8,
626     //! GL_OR です。
627     PICA_DATA_LOGIC_OR                      = 0x9,
628     //! GL_NOR です。
629     PICA_DATA_LOGIC_NOR                     = 0xa,
630     //! GL_XOR です。
631     PICA_DATA_LOGIC_XOR                     = 0xb,
632     //! GL_EQUIV です。
633     PICA_DATA_LOGIC_EQUIV                   = 0xc,
634     //! GL_AND_INVERTED です。
635     PICA_DATA_LOGIC_AND_INVERTED            = 0xd,
636     //! GL_OR_REVERSE です。
637     PICA_DATA_LOGIC_OR_REVERSE              = 0xe,
638     //! GL_OR_INVERTED です。
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 /*!
672     @brief アーリーデプステストの比較関数を設定します。
673            PICA_REG_EARLY_DEPTH_FUNC レジスタ( 0x061[1:0] ) で使います。
674            glEarlyDepthFuncDMP() に相当します。
675 */
676 enum PicaDataEarlyDepth
677 {
678     //! GL_GEQUAL です。
679     PICA_DATA_EARLY_DEPTH_GEQUAL  = 0x0,
680     //! GL_GREATER です。
681     PICA_DATA_EARLY_DEPTH_GREATER = 0x1,
682     //! GL_LEQUAL です。
683     PICA_DATA_EARLY_DEPTH_LEQUAL  = 0x2,
684     //! GL_LESS です。
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 /*!
706     @brief ステンシルテストの比較関数を設定します。
707            PICA_REG_STENCIL_TEST レジスタ( 0x105[6:4] ) で使います。
708            glStencilFunc() の引数 func に相当します。
709 */
710 enum PicaDataStencilTest
711 {
712     //! GL_NEVER です。
713     PICA_DATA_STENCIL_TEST_NEVER    = 0x0,
714     //! GL_ALWAYS です。
715     PICA_DATA_STENCIL_TEST_ALWAYS   = 0x1,
716     //! GL_EQUAL です。
717     PICA_DATA_STENCIL_TEST_EQUAL    = 0x2,
718     //! GL_NOTEQUAL です。
719     PICA_DATA_STENCIL_TEST_NOTEQUAL = 0x3,
720     //! GL_LESS です。
721     PICA_DATA_STENCIL_TEST_LESS     = 0x4,
722     //! GL_LEQUAL です。
723     PICA_DATA_STENCIL_TEST_LEQUAL   = 0x5,
724     //! GL_GREATER です。
725     PICA_DATA_STENCIL_TEST_GREATER  = 0x6,
726     //! GL_GEQUAL です。
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 /*!
755     @brief ステンシルバッファの変更方法を設定します。
756            PICA_REG_STENCIL_OP レジスタ( 0x106[2:0], [6:4], [10:8] ) で使います。
757            glStencilOp() の引数 func, zfail, zpass に相当します。
758 */
759 enum PicaDataStencilOp
760 {
761     //! GL_KEEP です。
762     PICA_DATA_STENCIL_OP_KEEP      = 0x0,
763     //! GL_ZERO です。
764     PICA_DATA_STENCIL_OP_ZERO      = 0x1,
765     //! GL_REPLACE です。
766     PICA_DATA_STENCIL_OP_REPLACE   = 0x2,
767     //! GL_INCR です。
768     PICA_DATA_STENCIL_OP_INCR      = 0x3,
769     //! GL_DECR です。
770     PICA_DATA_STENCIL_OP_DECR      = 0x4,
771     //! GL_INVERT です。
772     PICA_DATA_STENCIL_OP_INVERT    = 0x5,
773     //! GL_INCR_WRAP です。
774     PICA_DATA_STENCIL_OP_INCR_WRAP = 0x6,
775     //! GL_DECR_WRAP です。
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 /*!
838     @brief レンダリングのブロックフォーマットを設定します。
839            PICA_REG_RENDER_BLOCK_FORMAT レジスタ( 0x11b[0:0] ) で使います。
840            glRenderBlockModeDMP() に相当します。
841 */
842 enum PicaDataRenderBlockFormat
843 {
844     //! カラーバッファを 8 ブロックフォーマットに設定します。
845     PICA_DATA_RENDER_BLOCK8_MODE_DMP  = 0x0,
846     //! カラーバッファを 32 ブロックフォーマットに設定します。
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