1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: gr_ProcedureTexture.h 4 Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. 5 These coded instructions, statements, and computer programs contain 6 proprietary information of Nintendo of America Inc. and/or Nintendo 7 Company Ltd., and are protected by Federal copyright law. They may 8 not be disclosed to third parties or copied or duplicated in any form, 9 in whole or in part, without the prior written consent of Nintendo. 10 $Rev: 33950 $ 11 *--------------------------------------------------------------------------- 12 13 14 */ 15 16 #ifndef NN_GR_PROCEDURE_TEXTURE_H_ 17 #define NN_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_PROCEDURE_TEXTURE_H_ 639