1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: gr_ProcedureTexture.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_GR_CTR_GR_PROCEDURE_TEXTURE_H_ 17 #define NN_GR_CTR_GR_PROCEDURE_TEXTURE_H_ 18 19 #include <nn/gr/CTR/gr_Utility.h> 20 21 namespace nn 22 { 23 namespace gr 24 { 25 namespace CTR 26 { 27 28 /* Please see man pages for details 29 30 */ 31 class ProcedureTexture 32 { 33 public: 34 static const u32 PROCTEX_LOOKUP_TABLE_ELEMENT_NUM = 128; // 35 static const u32 PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM = 256; // 36 37 public : 38 /* Please see man pages for details 39 40 41 42 */ 43 PicaDataProcTexMap rgbMap; 44 45 /* Please see man pages for details 46 47 48 49 */ 50 51 PicaDataProcTexMap alphaMap; 52 53 /* Please see man pages for details 54 55 56 57 */ 58 bool alphaSeparate; 59 60 /* Please see man pages for details 61 62 63 64 */ 65 PicaDataProcTexClamp clampU; 66 67 /* Please see man pages for details 68 69 70 71 */ 72 PicaDataProcTexClamp clampV; 73 74 /* Please see man pages for details 75 76 77 78 */ 79 PicaDataProcTexShift shiftU; 80 81 /* Please see man pages for details 82 83 84 85 */ 86 PicaDataProcTexShift shiftV; 87 88 /* Please see man pages for details 89 90 91 92 */ 93 PicaDataProcTexFilter minFilter; 94 95 /* Please see man pages for details 96 97 98 99 */ 100 f32 texBias; 101 102 /* Please see man pages for details 103 104 105 106 */ 107 u8 texOffset; 108 109 /* Please see man pages for details 110 111 112 113 */ 114 u8 texWidth; 115 116 /* Please see man pages for details 117 118 119 120 */ 121 bool isEnableNoise; 122 NN_PADDING1; 123 124 /* Please see man pages for details 125 126 127 128 */ 129 f32 noiseUAmplitude; 130 131 /* Please see man pages for details 132 133 134 135 */ 136 f32 noiseVAmplitude; 137 138 /* Please see man pages for details 139 140 141 142 */ 143 f32 noiseUFrequency; 144 145 /* Please see man pages for details 146 147 148 149 */ 150 f32 noiseVFrequency; 151 152 /* Please see man pages for details 153 154 155 156 */ 157 f32 noiseUPhase; 158 159 /* Please see man pages for details 160 161 162 163 */ 164 f32 noiseVPhase; 165 166 public : 167 /* Please see man pages for details 168 169 170 171 172 173 */ 174 void SetNoiseLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 175 const u32 lookUpTableIndex = 0, 176 const f32 lastDiffValue = 0.0f ); 177 178 /* Please see man pages for details 179 180 181 182 183 184 */ 185 void SetNoiseLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 186 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 187 const u32 lookUpTableIndex = 0 ); 188 189 /* Please see man pages for details 190 191 192 193 194 195 */ 196 void SetRgbMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 197 const u32 lookUpTableIndex = 0, 198 const f32 lastDiffValue = 0.0f ); 199 200 /* Please see man pages for details 201 202 203 204 205 206 */ 207 void SetRgbMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 208 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 209 const u32 lookUpTableIndex = 0 ); 210 211 /* Please see man pages for details 212 213 214 215 216 217 */ 218 void SetAlphaMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 219 const u32 lookUpTableIndex = 0, 220 const f32 lastDiffValue = 0.0f ); 221 222 /* Please see man pages for details 223 224 225 226 227 228 */ 229 void SetAlphaMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 230 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 231 const u32 lookUpTableIndex = 0 ); 232 233 /* Please see man pages for details 234 235 236 237 238 */ 239 void SetRedLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 240 const u32 lookUpTableIndex = 0 ); 241 242 /* Please see man pages for details 243 244 245 246 247 248 249 */ 250 void SetRedLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 251 const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 252 const u32 lookUpTableIndex = 0, 253 const u32 diffLookUpTableIndex = 0 ); 254 255 /* Please see man pages for details 256 257 258 259 260 */ 261 void SetGreenLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 262 const u32 lookUpTableIndex = 0 ); 263 264 /* Please see man pages for details 265 266 267 268 269 270 271 */ 272 void SetGreenLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 273 const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 274 const u32 lookUpTableIndex = 0, 275 const u32 diffLookUpTableIndex = 0 ); 276 277 /* Please see man pages for details 278 279 280 281 282 */ 283 void SetBlueLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 284 const u32 lookUpTableIndex = 0 ); 285 286 /* Please see man pages for details 287 288 289 290 291 292 293 */ 294 void SetBlueLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 295 const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 296 const u32 lookUpTableIndex = 0, 297 const u32 diffLookUpTableIndex = 0 ); 298 299 /* Please see man pages for details 300 301 302 303 304 */ 305 void SetAlphaLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 306 const u32 lookUpTableIndex = 0 ); 307 308 /* Please see man pages for details 309 310 311 312 313 314 315 */ 316 void SetAlphaLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 317 const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 318 const u32 lookUpTableIndex = 0, 319 const u32 diffLookUpTableIndex = 0 ); 320 321 /* Please see man pages for details 322 323 324 325 326 327 328 */ 329 bit32* MakeAllCommand( bit32* command, bool isAddDummyCommand = true ) const 330 { 331 // Set command 332 command = MakeConfigCommand( command, isAddDummyCommand ); 333 334 // Procedural texture lookup table command 335 command = MakeTableCommand( command ); 336 337 return command; 338 } 339 340 /* Please see man pages for details 341 342 343 344 345 346 347 */ 348 bit32* MakeConfigCommand( bit32* command, bool isAddDummyCommand = true ) const 349 { 350 command = MakeProcedureTextureModeCommand( command, isAddDummyCommand ); 351 command = MakeTextureCommand( command, false, false ); 352 command = MakeNoiseCommand( command, false, false ); 353 354 return command; 355 } 356 357 /* Please see man pages for details 358 359 360 361 362 363 364 */ 365 bit32* MakeProcedureTextureModeCommand( bit32* command, bool isAddDummyCommand = true ) const 366 { 367 if ( isAddDummyCommand ) 368 { 369 command = MakeDummyCommand( command ); 370 } 371 372 // f32 -> f16 373 u16 texBiasFloat16 = Float32ToFloat16( texBias ); 374 u8 texBiasFloat16Low8 = ( texBiasFloat16 & 0xFF ); 375 376 // 0x0a8 377 *command++ = PICA_CMD_DATA_PROCTEX0( clampU, clampV, 378 rgbMap, alphaMap, 379 ( alphaSeparate ? 1 : 0), 380 ( isEnableNoise ? 1 : 0 ), 381 shiftU, shiftV, 382 texBiasFloat16Low8 ); 383 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE3_PROCTEX0 ); 384 385 return command; 386 } 387 388 /* Please see man pages for details 389 390 391 392 393 394 395 396 */ 397 bit32* MakeTextureCommand( bit32* command, bool isAddProcedureTextureModeCommand = true, bool isAddDummyCommand = true ) const 398 { 399 if ( isAddProcedureTextureModeCommand ) 400 { 401 command = MakeProcedureTextureModeCommand( command, isAddDummyCommand ); 402 } 403 else if ( isAddDummyCommand ) 404 { 405 command = MakeDummyCommand( command ); 406 } 407 408 // f32 -> f16 409 u16 texBiasFloat16 = Float32ToFloat16( texBias ); 410 u8 texBiasFloat16Hi8 = ( ( texBiasFloat16 >> 8 ) & 0xFF ); 411 412 // 0x0ac 413 *command++ = PICA_CMD_DATA_PROCTEX4( minFilter, texWidth, texBiasFloat16Hi8 ); 414 *command++ = PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEXTURE3_PROCTEX4, 0x2 ); 415 416 // 0x0ad 417 *command++ = PICA_CMD_DATA_PROCTEX5( texOffset ); 418 // Padding 419 *command++ = 0x0; 420 421 return command; 422 } 423 424 /* Please see man pages for details 425 426 427 428 429 430 431 432 */ 433 bit32* MakeNoiseCommand( bit32* command, bool isAddProcedureTextureModeCommand = true, bool isAddDummyCommand = true ) const 434 { 435 if ( isAddProcedureTextureModeCommand ) 436 { 437 command = MakeProcedureTextureModeCommand( command, isAddDummyCommand ); 438 } 439 else if ( isAddDummyCommand ) 440 { 441 command = MakeDummyCommand( command ); 442 } 443 444 // 0x0a9 445 *command++ = PICA_CMD_DATA_PROCTEX1( Float32ToFloat16( noiseUPhase ), 446 Float32ToFix16( noiseUAmplitude ) ); 447 *command++ = PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEXTURE3_PROCTEX1, 0x3 ); 448 449 // 0x0aa 450 *command++ = PICA_CMD_DATA_PROCTEX2( Float32ToFloat16( noiseVPhase ), 451 Float32ToFix16( noiseVAmplitude ) ); 452 // 0x0ab 453 *command++ = PICA_CMD_DATA_PROCTEX3( Float32ToFloat16( noiseUFrequency ), 454 Float32ToFloat16( noiseVFrequency ) ); 455 456 return command; 457 } 458 459 /* Please see man pages for details 460 461 462 463 464 465 */ 466 bit32* MakeTableCommand( bit32* command ) const; 467 468 469 /* Please see man pages for details 470 471 472 473 474 475 */ MakeDummyCommand(bit32 * command)476 static bit32* MakeDummyCommand( bit32* command ) 477 { 478 *command++ = 0x0; 479 *command++ = PICA_CMD_HEADER_BURST_BE( PICA_REG_TEXTURE_FUNC, 0x3, 0x0 ); 480 481 *command++ = 0x0; 482 *command++ = 0x0; 483 484 return command; 485 } 486 487 public : 488 /* Please see man pages for details 489 490 */ ProcedureTexture()491 ProcedureTexture() : 492 rgbMap( PICA_DATA_PROCTEX_U_DMP ), 493 alphaMap( PICA_DATA_PROCTEX_U_DMP ), 494 alphaSeparate( false ), 495 clampU( PICA_DATA_PROCTEX_CLAMP_TO_EDGE ), clampV( PICA_DATA_PROCTEX_CLAMP_TO_EDGE ), 496 shiftU( PICA_DATA_PROCTEX_NONE_DMP ), shiftV( PICA_DATA_PROCTEX_NONE_DMP ), 497 minFilter( PICA_DATA_PROCTEX_LINEAR ), 498 texBias( 0.5f ), texOffset( 0 ), texWidth( 0 ), 499 isEnableNoise( false ), 500 noiseUAmplitude( 0.0f ), noiseVAmplitude( 0.0f ), 501 noiseUFrequency( 0.0f ), noiseVFrequency( 0.0f ), 502 noiseUPhase( 0.0f ), noiseVPhase( 0.0f ) 503 { 504 } 505 506 protected: 507 /* Please see man pages for details 508 509 510 511 512 513 514 515 */ 516 void SetLookUpDualTables_( bit32* command, 517 PicaDataProcTexRefTable procTexLookUpTable, 518 const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 519 const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 520 const u32 lookUpTableIndex = 0 ); 521 522 /* Please see man pages for details 523 524 525 526 527 528 */ 529 void SetColorLookUpDualTables_( const u32 colorShiftNum, 530 const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 531 const u32 lookUpTableIndex = 0 ); 532 533 /* Please see man pages for details 534 535 536 537 538 539 */ 540 void SetColorLookUpTable_( const u32 colorShiftNum, 541 const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 542 const u32 lookUpTableIndex = 0 ); 543 544 /* Please see man pages for details 545 546 547 548 549 550 */ 551 void SetColorDiffLookUpTable_( const u32 colorShiftNum, 552 const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 553 const u32 diffLookUpTableIndex = 0 ); 554 555 /* Please see man pages for details 556 557 558 559 560 */ 561 void GetColorDiffLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 562 f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ] ); 563 564 /* Please see man pages for details 565 566 567 568 569 570 */ 571 void GetDiffLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 572 f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 573 const f32 lastDiffValue = 0.0f ); 574 575 protected : 576 // 577 static const u32 PROCTEX_LOOKUP_TABLE_OPTION_CMD_NUM = 4; 578 579 // 580 static const u32 PROCTEX_LOOKUP_TABLE_CMD_NUM = PROCTEX_LOOKUP_TABLE_ELEMENT_NUM + PROCTEX_LOOKUP_TABLE_OPTION_CMD_NUM; 581 582 // 583 static const u32 PROCTEX_COLOR_LOOKUP_TABLE_OPTION_CMD_NUM = 6; 584 585 // 586 static const u32 PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM = PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM + PROCTEX_COLOR_LOOKUP_TABLE_OPTION_CMD_NUM; 587 588 /* Please see man pages for details 589 590 */ 591 enum ProcedureTextureColorShift 592 { 593 // 594 PROCTEX_RED_COLOR_SHIFT_NUM = 0, 595 // 596 PROCTEX_GREEN_COLOR_SHIFT_NUM = 8, 597 // 598 PROCTEX_BLUE_COLOR_SHIFT_NUM = 16, 599 // 600 PROCTEX_ALPHA_COLOR_SHIFT_NUM = 24 601 }; 602 603 /* Please see man pages for details 604 605 606 */ 607 u32 m_NoiseLookUpTableCommand[ PROCTEX_LOOKUP_TABLE_CMD_NUM ]; 608 609 /* Please see man pages for details 610 611 612 */ 613 u32 m_RgbMapLookUpTableCommand[ PROCTEX_LOOKUP_TABLE_CMD_NUM ]; 614 615 /* Please see man pages for details 616 617 618 */ 619 u32 m_AlphaMapLookUpTableCommand[ PROCTEX_LOOKUP_TABLE_CMD_NUM ]; 620 621 /* Please see man pages for details 622 623 624 */ 625 u32 m_ColorLookUpTableCommand[ PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM ]; 626 627 /* Please see man pages for details 628 629 630 */ 631 u32 m_ColorDiffLookUpTableCommand[ PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM ]; 632 }; 633 634 } // namespace CTR 635 } // namespace gr 636 } //namespace nn 637 638 #endif // NN_GR_CTR_GR_PROCEDURE_TEXTURE_H_ 639