1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: gx_MacroShader.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_SHADER_H_ 17 #define NN_GX_CTR_GX_MACRO_SHADER_H_ 18 19 #include <nn/gx/CTR/gx_MacroCommon.h> 20 21 /* Please see man pages for details 22 23 24 */ 25 26 /////////////////////////////////// 27 // Draw API 28 // Geometry Misc Registers 29 /* 30 struct CommandDrawAPIMode0 31 { 32 u32 geometryUse : 2; 33 CMD_PADDING(6); 34 u32 mode : 1; 35 CMD_PADDING(1); // set to 0 [9:9] 36 CMD_PADDING(21); 37 u32 geometryUseMode : 1; 38 }; 39 */ 40 41 // PICA_REG_DRAW_MODE0 0x229 42 #define PICA_CMD_DATA_DRAW_MODE0(useGeometryShader, drawMode, useGeometryShaderSubdivision) \ 43 ( (useGeometryShader ? 2 : 0) | \ 44 (drawMode) << 8 | \ 45 0 << 9 | \ 46 ( (useGeometryShaderSubdivision) ? 1 : 0) << 31) 47 48 #define PICA_CMD_SET_DRAW_MODE0(drawMode) \ 49 PICA_CMD_DATA_DRAW_MODE0(0x0, drawMode, 0x0), \ 50 PICA_CMD_HEADER_SINGLE_BE(PICA_REG_DRAW_MODE0, 0x2) 51 52 #define PICA_CMD_SET_VERTEX_ATTR_ARRAYS_BASE_ADDR_DUMMY() \ 53 0x0, PICA_CMD_HEADER_BURST_BE(PICA_REG_VERTEX_ATTR_ARRAYS_BASE_ADDR, 30, 0x0), \ 54 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \ 55 0x0, 0x0, \ 56 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \ 57 0x0, 0x0, \ 58 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \ 59 0x0, 0x0 60 61 #define PICA_CMD_SET_DRAW_MODE0_DUMMY_BEGIN() \ 62 0x0, PICA_CMD_HEADER_BURST_BE(PICA_REG_VS_OUT_REG_NUM2, 10, 0x0), \ 63 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \ 64 0x0, 0x0, \ 65 PICA_CMD_SET_VERTEX_ATTR_ARRAYS_BASE_ADDR_DUMMY() 66 67 #define PICA_CMD_SET_DRAW_MODE0_DUMMY_END() \ 68 PICA_CMD_SET_VERTEX_ATTR_ARRAYS_BASE_ADDR_DUMMY() 69 70 #define PICA_CMD_SET_VS_GS_MODE(useGeometryShader, useGeometryShaderSubdivision) \ 71 PICA_CMD_SET_DRAW_MODE0_DUMMY_BEGIN(), \ 72 PICA_CMD_DATA_DRAW_MODE0(useGeometryShader, 0x0, useGeometryShaderSubdivision), \ 73 PICA_CMD_HEADER_SINGLE_BE(PICA_REG_DRAW_MODE0, 0x9), \ 74 PICA_CMD_SET_DRAW_MODE0_DUMMY_END() 75 76 /* 77 struct CommandDrawAPIMode0 78 { 79 u32 func : 1; 80 CMD_PADDING(7); 81 u32 mode : 1; 82 CMD_PADDING(23); 83 }; 84 */ 85 86 // PICA_REG_START_DRAW_FUNC 0x245 87 #define PICA_CMD_DATA_START_DRAW_FUNC(data) \ 88 ( (data) ? 1 : 0 ) 89 90 // PICA_REG_DRAW_MODE1 0x253 91 #define PICA_CMD_DATA_DRAW_MODE1(func, mode) \ 92 ( (func) | (mode) << 8 ) 93 94 #define PICA_CMD_SET_DRAW_MODE1(func, mode) \ 95 PICA_CMD_DATA_DRAW_MODE1(func, mode), PICA_CMD_HEADER_SINGLE_BE(PICA_REG_DRAW_MODE1, 0x3) 96 97 // PICA_REG_DRAW_VERTEX_NUM 0x228 98 #define PICA_CMD_DATA_DRAW_VERTEX_NUM(num) (num) 99 100 // PICA_REG_DRAW_VERTEX_OFFSET 0x22a 101 #define PICA_CMD_DATA_DRAW_VERTEX_OFFSET(offset) (offset) 102 103 // PICA_REG_START_DRAW_ARRAY 0x22e 104 #define PICA_CMD_DATA_START_DRAW_ARRAY(start) (start) 105 106 #define PICA_CMD_SET_START_DRAW_ARRAY(start) \ 107 PICA_CMD_DATA_START_DRAW_FUNC(0x0), PICA_CMD_HEADER_SINGLE_BE(PICA_REG_START_DRAW_FUNC0, 0x1), \ 108 PICA_CMD_DATA_START_DRAW_ARRAY(start), PICA_CMD_HEADER_SINGLE(PICA_REG_START_DRAW_ARRAY), \ 109 PICA_CMD_DATA_START_DRAW_FUNC(0x1), PICA_CMD_HEADER_SINGLE_BE(PICA_REG_START_DRAW_FUNC0, 0x1), \ 110 0x1, PICA_CMD_HEADER_SINGLE(PICA_REG_VERTEX_FUNC), \ 111 0, PICA_CMD_HEADER_SINGLE_BE(PICA_REG_DRAW_MODE2, 0x8), \ 112 0, PICA_CMD_HEADER_SINGLE_BE(PICA_REG_DRAW_MODE2, 0x8) 113 114 // PICA_REG_START_DRAW_ELEMENT 0x22f 115 #define PICA_CMD_DATA_START_DRAW_ELEMENT(start) (start) 116 117 #define PICA_CMD_SET_START_DRAW_ELEMENT(start) \ 118 PICA_CMD_DATA_START_DRAW_FUNC(0x0), PICA_CMD_HEADER_SINGLE_BE(PICA_REG_START_DRAW_FUNC0, 0x1), \ 119 PICA_CMD_DATA_START_DRAW_ELEMENT(start), PICA_CMD_HEADER_SINGLE(PICA_REG_START_DRAW_ELEMENT), \ 120 PICA_CMD_DATA_START_DRAW_FUNC(0x1), PICA_CMD_HEADER_SINGLE_BE(PICA_REG_START_DRAW_FUNC0, 0x1), \ 121 0x1, PICA_CMD_HEADER_SINGLE(PICA_REG_VERTEX_FUNC), \ 122 0, PICA_CMD_HEADER_SINGLE_BE(PICA_REG_DRAW_MODE2, 0x8), \ 123 0, PICA_CMD_HEADER_SINGLE_BE(PICA_REG_DRAW_MODE2, 0x8) 124 125 /////////////////////////////////// 126 // Vertex Shader float value 127 /* 128 struct CommandVSFloatAddr 129 { 130 u32 index : 8; 131 CMD_PADDING(23); 132 u32 mode : 1; 133 134 }; 135 */ 136 // PICA_REG_VS_FLOAT_ADDR 0x2c0 137 138 /* Please see man pages for details 139 140 141 */ 142 enum PicaDataVSFloat 143 { 144 // 145 PICA_DATA_VS_F24 = 0x0, 146 // 147 PICA_DATA_VS_F32 = 0x1 148 }; 149 150 #define PICA_CMD_DATA_VS_FLOAT_ADDR(mode, index) \ 151 ( (index) & 0xff | ( (mode) ? 0x80000000 : 0) ) 152 153 #define PICA_CMD_SET_VS_FLOAT_ADDR(mode, index) \ 154 PICA_CMD_DATA_VS_FLOAT_ADDR(mode, index), PICA_CMD_HEADER_SINGLE(PICA_REG_VS_FLOAT_ADDR) 155 156 // PICA_REG_VS_FLOAT 0x2c1 to 0x2c8 157 #define PICA_CMD_DATA_VS_FLOAT(data) (data) 158 159 /////////////////////////////////// 160 // Vertex Shader Bool 161 162 // PICA_REG_VS_BOOL 0x2b0 163 164 #define PICA_CMD_DATA_VS_BOOL(b) \ 165 ( (b) | 0x7fff0000 ) 166 167 /////////////////////////////////// 168 // Vertex Shader Integer 169 /* 170 struct CommandVSInt 171 { 172 u32 x : 8; 173 u32 y : 8; 174 u32 z : 8; 175 CMD_PADDING(8); 176 }; 177 */ 178 // PICA_REG_VS_INT0 0x2b1 to 0x2b4 179 #define PICA_CMD_DATA_VS_INT(x, y, z) ( (x) | (y) << 8 | (z) << 16 ) 180 181 /////////////////////////////////// 182 // Vertex Shader Start Address 183 184 // PICA_REG_VS_START_ADDR 0x2ba 185 #define PICA_CMD_DATA_VS_START_ADDR(data) \ 186 ( (data) | 0x7fff0000 ) 187 188 /////////////////////////////////// 189 // Vertex Shader Attribute Number 190 191 // PICA_REG_VS_ATTR_NUM0 0x2b9 192 #define PICA_CMD_DATA_VS_ATTR_NUM0(num) \ 193 ( ((num - 1) & 0xf) | ( 0xa0000000 ) ) 194 195 // PICA_REG_VS_ATTR_NUM1 0x242 196 #define PICA_CMD_DATA_VS_ATTR_NUM1(num) \ 197 ( (num - 1) & 0xf ) 198 199 #define PICA_CMD_SET_VS_ATTR_NUM(num) \ 200 PICA_CMD_DATA_VS_ATTR_NUM0(num), PICA_CMD_HEADER_SINGLE_BE(PICA_REG_VS_ATTR_NUM0, 0xB), \ 201 PICA_CMD_DATA_VS_ATTR_NUM1(num), PICA_CMD_HEADER_SINGLE(PICA_REG_VS_ATTR_NUM1) \ 202 203 /////////////////////////////////// 204 // Draw API 205 // Vertex Shader Output Register Number 206 // Geometry Shader Output Register Number 207 208 #define PICA_CMD_DATA_VS_GS_OUT_REG_NUM(num) (num) 209 210 // PICA_REG_VS_OUT_REG_NUM0 0x04f 211 // PICA_REG_GS_OUT_REG_NUM0 0x04f 212 #define PICA_CMD_DATA_VS_GS_OUT_REG_NUM0(num) (num) 213 214 // PICA_REG_VS_OUT_REG_NUM1 0x24a 215 #define PICA_CMD_DATA_VS_GS_OUT_REG_NUM1(num) ( (num) - 1 ) 216 217 // PICA_REG_VS_OUT_REG_NUM2 0x251 218 #define PICA_CMD_DATA_VS_GS_OUT_REG_NUM2(num) ( (num) - 1 ) 219 220 221 /* 222 struct CommandVSOutRegNum 223 { 224 u32 num : 4; 225 CMD_PADDING(4); 226 u32 mode : 1; 227 CMD_PADDING(23); 228 }; 229 */ 230 231 232 /* Please see man pages for details 233 234 235 */ 236 enum PicaDataDrawMode 237 { 238 // 239 PICA_DATA_DRAW_TRIANGLE_STRIP = 0x1, 240 // 241 PICA_DATA_DRAW_TRIANGLE_FAN = 0x2, 242 // 243 PICA_DATA_DRAW_TRIANGLES = 0x3, 244 // 245 PICA_DATA_DRAW_GEOMETRY_PRIMITIVE = 0x3 246 }; 247 248 // PICA_REG_VS_OUT_REG_NUM3 0x25e 249 // PICA_REG_GS_OUT_REG_NUM3 0x25e 250 #define PICA_CMD_DATA_VS_GS_OUT_REG_NUM3(num, mode) \ 251 ( (num - 1) | (mode) << 8 ) 252 253 #define PICA_CMD_SET_DRAW_MODE2(mode) \ 254 ((mode) << 8), \ 255 PICA_CMD_HEADER_SINGLE_BE(PICA_REG_VS_OUT_REG_NUM3, 0x2) 256 257 #define PICA_CMD_SET_VS_GS_OUT_REG_NUM(num) \ 258 num, PICA_CMD_HEADER_SINGLE(PICA_REG_VS_OUT_REG_NUM0), \ 259 (num - 1), PICA_CMD_HEADER_SINGLE(PICA_REG_VS_OUT_REG_NUM1), \ 260 (num - 1), PICA_CMD_HEADER_SINGLE(PICA_REG_VS_OUT_REG_NUM2), \ 261 (num - 1), PICA_CMD_HEADER_SINGLE_BE(PICA_REG_VS_OUT_REG_NUM3, 0x1) 262 263 /////////////////////////////////// 264 // Vertex Shader Output Register Mask 265 266 // PICA_REG_VS_OUT_REG_MASK 0x2bd 267 #define PICA_CMD_DATA_VS_OUT_MASK(mask) \ 268 ( (mask) & 0xffff ) 269 270 /////////////////////////////////// 271 // Vertex Shader Output Attribute 272 // Geometry Shader Output Attribute 273 274 /* Please see man pages for details 275 276 277 */ 278 enum PicaDataVSOutAttr 279 { 280 // 281 PICA_DATA_VS_OUT_ATTR_X = 0x00, 282 // 283 PICA_DATA_VS_OUT_ATTR_Y = 0x01, 284 // 285 PICA_DATA_VS_OUT_ATTR_Z = 0x02, 286 // 287 PICA_DATA_VS_OUT_ATTR_W = 0x03, 288 // 289 PICA_DATA_VS_OUT_ATTR_QUART_X = 0x04, 290 // 291 PICA_DATA_VS_OUT_ATTR_QUART_Y = 0x05, 292 // 293 PICA_DATA_VS_OUT_ATTR_QUART_Z = 0x06, 294 // 295 PICA_DATA_VS_OUT_ATTR_QUART_W = 0x07, 296 // 297 PICA_DATA_VS_OUT_ATTR_R = 0x08, 298 // 299 PICA_DATA_VS_OUT_ATTR_G = 0x09, 300 // 301 PICA_DATA_VS_OUT_ATTR_B = 0x0a, 302 // 303 PICA_DATA_VS_OUT_ATTR_A = 0x0b, 304 // 305 PICA_DATA_VS_OUT_ATTR_TEX0_U = 0x0c, 306 // 307 PICA_DATA_VS_OUT_ATTR_TEX0_V = 0x0d, 308 // 309 PICA_DATA_VS_OUT_ATTR_TEX1_U = 0x0e, 310 // 311 PICA_DATA_VS_OUT_ATTR_TEX1_V = 0x0f, 312 // 313 PICA_DATA_VS_OUT_ATTR_TEX0_W = 0x10, 314 // 315 PICA_DATA_VS_OUT_ATTR_VIEW_X = 0x12, 316 // 317 PICA_DATA_VS_OUT_ATTR_VIEW_Y = 0x13, 318 // 319 PICA_DATA_VS_OUT_ATTR_VIEW_Z = 0x14, 320 // 321 PICA_DATA_VS_OUT_ATTR_TEX2_U = 0x16, 322 // 323 PICA_DATA_VS_OUT_ATTR_TEX2_V = 0x17, 324 // 325 PICA_DATA_VS_OUT_ATTR_INVALID = 0x1f 326 }; 327 328 /* 329 struct CommandVSOutAttr 330 { 331 u32 attr_x : 5; 332 CMD_PADDING(3); 333 u32 attr_y : 5; 334 CMD_PADDING(3); 335 u32 attr_z : 5; 336 CMD_PADDING(3); 337 u32 attr_w : 5; 338 CMD_PADDING(3); 339 }; 340 */ 341 342 // PICA_REG_VS_OUT_ATTR0 0x050 to 0x056 343 // PICA_REG_GS_OUT_ATTR0 0x050 to 0x056 344 #define PICA_CMD_DATA_VS_GS_OUT_ATTR(attr_x, attr_y, attr_z, attr_w) \ 345 ( (attr_x) | (attr_y) << 8 | (attr_z) << 16 | (attr_w) << 24 ) 346 347 // PICA_REG_VS_OUT_ATTR_MODE 0x064 348 // PICA_REG_GS_OUT_ATTR_MODE 0x064 349 #define PICA_CMD_DATA_VS_GS_OUT_ATTR_MODE( mode ) (mode) 350 351 /////////////////////////////////// 352 // Vertex Shader Output Attribute clock 353 // Geometry Shader Output Attribute clock 354 /* 355 struct CommandVSOutAttrClk 356 { 357 u32 verZ : 1; 358 u32 col : 1; 359 CMD_PADDING(6); 360 u32 tex0 : 1; 361 u32 tex1 : 1; 362 u32 tex2 : 1; 363 CMD_PADDING(5); 364 u32 tex0_w : 1; 365 CMD_PADDING(7); 366 u32 view_quart : 1; 367 CMD_PADDING(7); 368 }; 369 */ 370 371 // PICA_REG_VS_OUT_ATTR_CLK 0x06f 372 // PICA_REG_GS_OUT_ATTR_CLK 0x06f 373 #define PICA_CMD_DATA_VS_GS_OUT_ATTR_CLK(posZ, col, tex0, tex1, tex2, tex0_w, view_quart) \ 374 ( ((posZ) ? 1 : 0) | \ 375 ((col) ? 1 : 0) << 1 | \ 376 ((tex0) ? 1 : 0) << 8 | \ 377 ((tex1) ? 1 : 0) << 9 | \ 378 ((tex2) ? 1 : 0) << 10 | \ 379 ((tex0_w) ? 1 : 0) << 16 | \ 380 ((view_quart) ? 1 : 0) << 24 ) 381 382 /////////////////////////////////// 383 // Vertex Shader Program Code 384 385 // PICA_REG_VS_PROG_ADDR 0x2cb 386 #define PICA_CMD_DATA_VS_PROG_ADDR(addr) (addr) 387 388 // PICA_REG_VS_PROG_SWIZZLE_ADDR 0x2d5 389 #define PICA_CMD_DATA_VS_PROG_SWIZZLE_ADDR(addr) (addr) 390 391 // PICA_REG_VS_PROG_DATA0 0x2cc to 0x2d3 392 #define PICA_CMD_DATA_VS_PROG_DATA(data) (data) 393 394 // PICA_REG_VS_PROG_SWIZZLE_DATA0 0x2d6 to 0x2dd 395 #define PICA_CMD_DATA_VS_PROG_SWIZZLE_DATA(data) (data) 396 397 // PICA_REG_VS_PROG_END 0x2bf 398 #define PICA_CMD_DATA_VS_PROG_END(data) (data) 399 400 /////////////////////////////////// 401 // Vertex Shader Attribute Input Register Map 402 /* 403 struct CommandVSAttrInputRegMap0 404 u32 index1 : 4; 405 u32 index2 : 4; 406 u32 index3 : 4; 407 u32 index4 : 4; 408 u32 index5 : 4; 409 u32 index6 : 4; 410 u32 index7 : 4; 411 u32 index8 : 4; 412 }; 413 */ 414 415 // PICA_REG_VS_ATTR_IN_REG_MAP0 0x2bb 416 #define PICA_CMD_DATA_VS_ATTR_IN_REG_MAP0(index1, index2, index3, index4, index5, index6, index7, index8) \ 417 ((index1) | (index2) << 4 | (index3) << 8 | (index4) << 12 | \ 418 (index5) << 16 | (index6) << 20 | (index7) << 24 | (index8) << 28 ) 419 420 /* 421 struct CommandVSAttrInputRegMap1 422 { 423 u32 index9 : 4; 424 u32 index10 : 4; 425 u32 index11 : 4; 426 u32 index12 : 4; 427 CMD_PADDING(16); 428 429 }; 430 */ 431 432 // PICA_REG_VS_ATTR_IN_REG_MAP1 0x2bc 433 #define PICA_CMD_DATA_VS_ATTR_IN_REG_MAP1(index9, index10, index11, index12) \ 434 ((index9) | (index10) << 4 | (index11) << 8 | (index12) << 12) 435 436 /////////////////////////////////// 437 // Vertex Shader Fixed Attribute 438 439 // PICA_REG_VS_FIXED_ATTR 0x232 440 #define PICA_CMD_DATA_VS_FIXED_ATTR(order) ( (order) & 0xf ) 441 442 // PICA_REG_VS_FIXED_ATTR_DATA0 0x233 to 0x235 443 #define PICA_CMD_DATA_VS_FIXED_ATTR_DATA(data) (data) 444 445 #define PICA_CMD_SET_VS_FIXED_ATTR(order, c0, c1, c2) \ 446 PICA_CMD_DATA_VS_FIXED_ATTR(order), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_VS_FIXED_ATTR, 4), \ 447 (u32)(c0), (u32)(c1), \ 448 (u32)(c2), PICA_CMD_DATA_ZERO() 449 450 /////////////////////////////////// 451 // Vertex Attribute Arrays 452 /* 453 struct CommandVtxAttrArraysBaseAddr 454 { 455 CMD_PADDING(1); 456 u32 addr : 28; 457 CMD_PADDING(3); 458 }; 459 */ 460 // PICA_REG_VERTEX_ATTR_ARRAYS_BASE_ADDR 0x200 461 #define PICA_CMD_DATA_VERTEX_ATTR_ARRAYS_BASE_ADDR(addr) ( ((u32)(addr) >> 4) << 1 ) 462 463 /* 464 struct CommandVAttrArrays 465 { 466 u32 attr0 : 4; 467 u32 attr1 : 4; 468 u32 attr2 : 4; 469 u32 attr3 : 4; 470 u32 attr4 : 4; 471 u32 attr5 : 4; 472 u32 attr6 : 4; 473 u32 attr7 : 4; 474 }; 475 */ 476 477 478 /* Please see man pages for details 479 480 481 482 */ 483 enum PicaDataVertexAttrType 484 { 485 // 486 PICA_DATA_SIZE_1_BYTE = 0x0, 487 // 488 PICA_DATA_SIZE_1_UNSIGNED_BYTE = 0x1, 489 // 490 PICA_DATA_SIZE_1_SHORT = 0x2, 491 // 492 PICA_DATA_SIZE_1_FLOAT = 0x3, 493 // 494 PICA_DATA_SIZE_2_BYTE = 0x4, 495 // 496 PICA_DATA_SIZE_2_UNSIGNED_BYTE = 0x5, 497 // 498 PICA_DATA_SIZE_2_SHORT = 0x6, 499 // 500 PICA_DATA_SIZE_2_FLOAT = 0x7, 501 // 502 PICA_DATA_SIZE_3_BYTE = 0x8, 503 // 504 PICA_DATA_SIZE_3_UNSIGNED_BYTE = 0x9, 505 // 506 PICA_DATA_SIZE_3_SHORT = 0xa, 507 // 508 PICA_DATA_SIZE_3_FLOAT = 0xb, 509 // 510 PICA_DATA_SIZE_4_BYTE = 0xc, 511 // 512 PICA_DATA_SIZE_4_UNSIGNED_BYTE = 0xd, 513 // 514 PICA_DATA_SIZE_4_SHORT = 0xe, 515 // 516 PICA_DATA_SIZE_4_FLOAT = 0xf 517 }; 518 519 // PICA_REG_VERTEX_ATTR_ARRAYS0 0x201 520 #define PICA_CMD_DATA_VERTEX_ATTR_ARRAYS0(attr0, attr1, attr2, attr3, attr4, attr5, attr6, attr7) \ 521 ((attr0) | (attr1) << 4 | (attr2) << 8 | (attr3) << 12 | \ 522 (attr4) << 16 | (attr5) << 20 | (attr6) << 24 | (attr7) << 28) 523 524 // PICA_REG_VERTEX_ATTR_ARRAYS1 0x202 525 #define PICA_CMD_DATA_VERTEX_ATTR_ARRAYS1(attr8, attr9, attr10, attr11, mask, attrNum) \ 526 ( (attr8) | \ 527 (attr9) << 4 | \ 528 (attr10) << 8 | \ 529 (attr11) << 12 | \ 530 (mask) << 16 | \ 531 ((attrNum) - 1) << 28 ) 532 533 // PICA_REG_LOAD_ARRAY0_ATTR_OFFSET 0x203 534 #define PICA_CMD_DATA_LOAD_ARRAY0_ATTR_OFFSET(offset) (offset) 535 536 /* 537 struct CommandLodArray0Element 538 { 539 u32 attr0 : 4; 540 u32 attr1 : 4; 541 u32 attr2 : 4; 542 u32 attr3 : 4; 543 u32 attr4 : 4; 544 u32 attr5 : 4; 545 u32 attr6 : 4; 546 u32 attr7 : 4; 547 }; 548 */ 549 550 /* Please see man pages for details 551 552 553 */ 554 enum PicaDataVertexAttr 555 { 556 // 557 PICA_DATA_VERTEX_0_ATTR = 0x0, 558 // 559 PICA_DATA_VERTEX_1_ATTR = 0x1, 560 // 561 PICA_DATA_VERTEX_2_ATTR = 0x2, 562 // 563 PICA_DATA_VERTEX_3_ATTR = 0x3, 564 // 565 PICA_DATA_VERTEX_4_ATTR = 0x4, 566 // 567 PICA_DATA_VERTEX_5_ATTR = 0x5, 568 // 569 PICA_DATA_VERTEX_6_ATTR = 0x6, 570 // 571 PICA_DATA_VERTEX_7_ATTR = 0x7, 572 // 573 PICA_DATA_VERTEX_8_ATTR = 0x8, 574 // 575 PICA_DATA_VERTEX_9_ATTR = 0x9, 576 // 577 PICA_DATA_VERTEX_a_ATTR = 0xa, 578 // 579 PICA_DATA_VERTEX_b_ATTR = 0xb, 580 // 581 PICA_DATA_PADDING_4_BYTE = 0xc, 582 // 583 PICA_DATA_PADDING_8_BYTE = 0xd, 584 // 585 PICA_DATA_PADDING_12_BYTE = 0xe, 586 // 587 PICA_DATA_PADDING_16_BYTE = 0xf 588 }; 589 590 // PICA_REG_LOAD_ARRAY0_ELEMENT0 0x204 591 #define PICA_CMD_DATA_LOAD_ARRAY_ELEMENT0(attr0, attr1, attr2, attr3, attr4, attr5, attr6, attr7) \ 592 ( (attr0) | (attr1) << 4 | (attr2) << 8 | (attr3) << 12 | \ 593 (attr4) << 16 | (attr5) << 20 | (attr6) << 24 | (attr7) << 28) 594 595 // PICA_REG_LOAD_ARRAY0_ELEMENT1 0x205 596 #define PICA_CMD_DATA_LOAD_ARRAY_ELEMENT1(attr8, attr9, attr10, attr11, byteNum, elementNum) \ 597 ( (attr8) | \ 598 (attr9) << 4 | \ 599 (attr10) << 8 | \ 600 (attr11) << 12 | \ 601 (byteNum) << 16 | \ 602 (elementNum) << 28 ) 603 604 605 /* 606 struct CommandIndexArrayAddrOffset 607 { 608 u32 offset : 28; 609 CMD_PADDING(3); 610 u32 type : 1; 611 }; 612 */ 613 614 enum PicaDataIndexArray 615 { 616 PICA_DATA_INDEX_ARRAY_UNSIGNED_BYTE = 0x0, 617 PICA_DATA_INDEX_ARRAY_UNSIGNED_SHORT = 0x1 618 }; 619 620 // PICA_REG_INDEX_ARRAY_ADDR_OFFSET 0x227 621 #define PICA_CMD_DATA_INDEX_ARRAY_ADDR_OFFSET(offset, type) \ 622 ( (offset) | ((type) ? 0x80000000 : 0 ) ) 623 624 /////////////////////////////////// 625 // Geometry Shader Over View 626 627 // PICA_REG_VS_COM_MODE 0x244 628 #define PICA_CMD_DATA_VS_COM_MODE(mode) ((mode) ? 1 : 0) 629 630 #define PICA_CMD_SET_VS_COM_MODE(mode) \ 631 PICA_CMD_DATA_VS_COM_MODE(mode), PICA_CMD_HEADER_SINGLE_BE(PICA_REG_VS_COM_MODE, 0x1) 632 633 /////////////////////////////////// 634 // Geometry Shader float value 635 /* 636 struct CommandGSFloatAddr 637 { 638 u32 index : 8; 639 CMD_PADDING(23); 640 u32 mode : 1; 641 642 }; 643 */ 644 645 /* Please see man pages for details 646 647 648 */ 649 enum PicaDataGSFloat 650 { 651 // 652 PICA_DATA_GS_F24 = 0x0, 653 // 654 PICA_DATA_GS_F32 = 0x1 655 }; 656 657 // PICA_REG_GS_FLOAT_ADDR 0x290 658 659 #define PICA_CMD_DATA_GS_FLOAT_ADDR(mode, index) \ 660 ( ((index) & 0xff) | (mode) << 31 ) 661 662 #define PICA_CMD_SET_GS_FLOAT_ADDR(mode, index) \ 663 PICA_CMD_DATA_GS_FLOAT_ADDR(mode, index), PICA_CMD_HEADER_SINGLE(PICA_REG_GS_FLOAT_ADDR) 664 665 // PICA_REG_GS_FLOAT_DATA 0x291 to 0x298 666 #define PICA_CMD_DATA_GS_FLOAT_DATA(data) (data) 667 668 /////////////////////////////////// 669 // Geometry Shader Bool 670 671 // PICA_REG_GS_BOOL 0x280 672 #define PICA_CMD_DATA_GS_BOOL(b) \ 673 ( (b) | 0x7fff0000 ) 674 675 /////////////////////////////////// 676 // Geometry Shader Integer 677 /* 678 struct CommandGSInt 679 { 680 u32 x : 8; 681 u32 y : 8; 682 u32 z : 8; 683 CMD_PADDING(8); 684 }; 685 */ 686 // PICA_REG_GS_INT0 0x281 to 0x284 687 #define PICA_CMD_DATA_GS_INT(x, y, z) ( (x) | (y) << 8 | (z) << 16 ) 688 689 /////////////////////////////////// 690 // Geometry Shader Start Address 691 692 // PICA_REG_GS_START_ADDR 0x28a 693 #define PICA_CMD_DATA_GS_START_ADDR(data) \ 694 ( (data) | 0x7fff0000 ) 695 696 /////////////////////////////////// 697 // Geometry Shader Attribute Number 698 // Geometry Misc Registers 699 /* 700 struct CommandGSAttrNum 701 { 702 u32 num : 4; 703 CMD_PADDING(4); 704 u32 mode0 : 8; 705 CMD_PADDING(8); 706 u32 mode1 : 8; 707 }; 708 */ 709 710 // 0x289[15:8] : 0x1/0x0, 711 // 0x289[31:24] : 0x08/0xa0, 712 713 714 // PICA_REG_GS_ATTR_NUM 0x289 715 #define PICA_CMD_DATA_GS_ATTR_NUM(geometryShaderVertexAttrInputNum, useGeometrySubdivision, useGeometryShader) \ 716 ( ( (geometryShaderVertexAttrInputNum) - 1) | \ 717 ( (useGeometrySubdivision) ? 1 : 0) << 8 | \ 718 ( ((useGeometryShader) ? 0x08 : 0xa0) << 24 ) ) 719 720 #define PICA_CMD_SET_GS_ATTR_NUM(geometryShaderVertexAttrInputNum, useGeometrySubdivision, useGeometryShader) \ 721 PICA_CMD_DATA_GS_ATTR_NUM(geometryShaderVertexAttrInputNum, useGeometrySubdivision, useGeometryShader), \ 722 PICA_CMD_HEADER_SINGLE_BE(PICA_REG_GS_ATTR_NUM, 0xB) 723 724 /////////////////////////////////// 725 // Geometry Shader Output Register Mask 726 727 // PICA_REG_GS_OUT_REG_MASK 0x28d 728 #define PICA_CMD_DATA_GS_OUT_MASK(mask) \ 729 ( (mask) & 0xffff ) 730 731 /////////////////////////////////// 732 // Geometry Shader Program Code 733 734 735 // PICA_REG_GS_PROG_ADDR 0x29b 736 #define PICA_CMD_DATA_GS_PROG_ADDR(addr) (addr) 737 738 // PICA_REG_GS_PROG_SWIZZLE_ADDR 0x2a5 739 #define PICA_CMD_DATA_GS_PROG_SWIZZLE_ADDR(addr) (addr) 740 741 // PICA_REG_GS_PROG_DATA0 0x29c to 0x2a3 742 #define PICA_CMD_DATA_GS_PROG_DATA(data) (data) 743 744 // PICA_REG_GS_PROG_SWIZZLE_DATA0 0x2a6 to 0x2ad 745 #define PICA_CMD_DATA_GS_PROG_SWIZZLE_DATA(data) (data) 746 747 /////////////////////////////////// 748 // Geometry Shader Attribute Input Register Map 749 /* 750 struct CommandGSAttrInputRegMap0 751 u32 index1 : 4; 752 u32 index2 : 4; 753 u32 index3 : 4; 754 u32 index4 : 4; 755 u32 index5 : 4; 756 u32 index6 : 4; 757 u32 index7 : 4; 758 u32 index8 : 4; 759 }; 760 */ 761 762 // PICA_REG_GS_ATTR_IN_REG_MAP0 0x28b 763 #define PICA_CMD_DATA_GS_ATTR_IN_REG_MAP0(index1, index2, index3, index4, index5, index6, index7, index8) \ 764 ( (index1) | (index2) << 4 | (index3) << 8 | (index4) << 12 | \ 765 (index5) << 16 | (index6) << 20 | (index7) << 24 | (index8) << 28 ) 766 767 /* 768 struct CommandGSAttrInputRegMap1 769 { 770 u32 index9 : 4; 771 u32 index10 : 4; 772 u32 index11 : 4; 773 u32 index12 : 4; 774 CMD_PADDING(16); 775 776 }; 777 */ 778 779 // PICA_REG_GS_ATTR_IN_REG_MAP1 0x28c 780 #define PICA_CMD_DATA_GS_ATTR_IN_MAP1(index9, index10, index11, index12) \ 781 ((index9) | (index10) << 4 | (index11) << 8 | (index12) << 12) 782 783 #define PICA_CMD_SET_GS_ATTR_IN_MAP_RESERVED() \ 784 0x76543210, PICA_CMD_HEADER_SINGLE(PICA_REG_GS_ATTR_IN_REG_MAP0), \ 785 0xfedcba98, PICA_CMD_HEADER_SINGLE(PICA_REG_GS_ATTR_IN_REG_MAP1) 786 787 /////////////////////////////////// 788 // Geometry Misc Registers 789 790 /* Please see man pages for details 791 792 793 */ 794 enum PicaDataGSMode 795 { 796 // 797 PICA_DATA_GS_OTHER_MODE = 0x0, 798 // 799 PICA_DATA_GS_SUBDIVISION_MODE = 0x1, 800 // 801 PICA_DATA_GS_SUBDIVISION_CATMULL_MODE = 0x3, 802 // 803 PICA_DATA_GS_SUBDIVISION_LOOP_MODE = 0x5, 804 // 805 PICA_DATA_GS_PARTICLE_MODE = 0x2 806 }; 807 808 // PICA_REG_GS_MISC_REG0 0x252 809 #define PICA_CMD_DATA_GS_MISC_REG0(mode) \ 810 ( (mode & PICA_DATA_GS_SUBDIVISION_MODE) ? 0x1 : ( (mode == PICA_DATA_GS_PARTICLE_MODE) ? 0x01004302 : 0) ) 811 812 #define PICA_CMD_SET_GS_MISC_REG0_SUBDIVISION() \ 813 PICA_CMD_DATA_GS_MISC_REG0(PICA_DATA_GS_SUBDIVISION_MODE), \ 814 PICA_CMD_HEADER_SINGLE(PICA_REG_GS_MISC_REG0) 815 816 #define PICA_CMD_SET_GS_MISC_REG0_SUBDIVISION_CATMULL() \ 817 PICA_CMD_DATA_GS_MISC_REG0(PICA_DATA_GS_SUBDIVISION_CATMULL_MODE), \ 818 PICA_CMD_HEADER_SINGLE(PICA_REG_GS_MISC_REG0) 819 820 #define PICA_CMD_SET_GS_MISC_REG0_SUBDIVISION_LOOP() \ 821 PICA_CMD_DATA_GS_MISC_REG0(PICA_DATA_GS_SUBDIVISION_LOOP_MODE), \ 822 PICA_CMD_HEADER_SINGLE(PICA_REG_GS_MISC_REG0) 823 824 #define PICA_CMD_SET_GS_MISC_REG0_PARTICLE() \ 825 PICA_CMD_DATA_GS_MISC_REG0(PICA_DATA_GS_PARTICLE_MODE), \ 826 PICA_CMD_HEADER_SINGLE(PICA_REG_GS_MISC_REG0) 827 828 #define PICA_CMD_SET_GS_MISC_REG0_OTHER() \ 829 PICA_CMD_DATA_GS_MISC_REG0(PICA_DATA_GS_OTHER_MODE), \ 830 PICA_CMD_HEADER_SINGLE(PICA_REG_GS_MISC_REG0) 831 832 // PICA_REG_GS_MISC_REG1 0x254 833 #define PICA_CMD_DATA_GS_MISC_REG1(mode) \ 834 ( (mode == PICA_DATA_GS_SUBDIVISION_CATMULL_MODE) ? 3 : ( (mode == PICA_DATA_GS_SUBDIVISION_LOOP_MODE) ? 2 : 0) ) 835 836 /////////////////////////////////// 837 // Appendex Registers 838 839 // PICA_REG_START_DRAW_FUNC1 0x25f 840 #define PICA_CMD_DATA_START_DRAW_FUNC1(resetVertexTriangleIndex) \ 841 ( (resetVertexTriangleIndex) ? 1 : 0 ) 842 843 /* 844 845 */ 846 847 #endif // NN_GX_CTR_GX_MACRO_SHADER_H_ 848