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