1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: gd_Shader.h 4 5 Copyright (C)2011 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 *---------------------------------------------------------------------------*/ 14 #ifndef NN_GD_CTR_GD_SHADER_H_ 15 #define NN_GD_CTR_GD_SHADER_H_ 16 17 #include <nn/gd/CTR/gd_Types.h> 18 #include <nn/gd/CTR/gd_Result.h> 19 #include <nn/gd/CTR/gd_Texture.h> 20 21 #if NN_GD_DOCUMENT_TYPE == ENGLISH 22 /* Please see man pages for details 23 24 */ 25 #else 26 /* Please see man pages for details 27 28 */ 29 #endif 30 31 namespace nn { 32 namespace gd { 33 namespace CTR { 34 35 #if NN_GD_DOCUMENT_TYPE == ENGLISH 36 /* Please see man pages for details 37 */ 38 #else 39 /* Please see man pages for details 40 */ 41 #endif 42 class VertexShader; 43 44 #if NN_GD_DOCUMENT_TYPE == ENGLISH 45 /* Please see man pages for details 46 */ 47 #else 48 /* Please see man pages for details 49 */ 50 #endif 51 class ShaderPipeline; 52 53 #if NN_GD_DOCUMENT_TYPE == ENGLISH 54 /* Please see man pages for details 55 */ 56 #else 57 /* Please see man pages for details 58 */ 59 #endif 60 class ShaderBinary; 61 62 #if NN_GD_DOCUMENT_TYPE == ENGLISH 63 /* Please see man pages for details 64 */ 65 #else 66 /* Please see man pages for details 67 */ 68 #endif 69 class ShaderPipelineUnmanagedRegisters; 70 71 #if NN_GD_DOCUMENT_TYPE == ENGLISH 72 /* Please see man pages for details 73 74 75 */ 76 #else 77 /* Please see man pages for details 78 79 80 */ 81 #endif 82 class UniformLocation 83 { 84 private: 85 u32 m_Data; 86 87 public: 88 #if NN_GD_DOCUMENT_TYPE == ENGLISH 89 /* Please see man pages for details 90 */ 91 #else 92 /* Please see man pages for details 93 */ 94 #endif 95 enum UniformType 96 { 97 Undefined = 0, 98 Boolean = 1, 99 Integer3 = 2, 100 Float = 8, 101 Float2 = 9, 102 Float3 = 10, 103 Float4 = 11, 104 FloatMatrix2 = 12, 105 FloatMatrix3 = 13, 106 FloatMatrix4 = 14, 107 UniformType_RESERVED_MAX_U32 = 0xffffffff 108 }; 109 110 #if NN_GD_DOCUMENT_TYPE == ENGLISH 111 /* Please see man pages for details 112 113 114 */ 115 #else 116 /* Please see man pages for details 117 118 119 */ 120 #endif UniformLocation()121 UniformLocation() 122 { 123 m_Data = 0xFFFFFFFF; 124 } 125 126 #if NN_GD_DOCUMENT_TYPE == ENGLISH 127 /* Please see man pages for details 128 129 130 131 132 133 */ 134 #else 135 /* Please see man pages for details 136 137 138 139 140 141 */ 142 #endif UniformLocation(u8 shaderType,u16 managedLocation,u8 registerLocation,u8 size,UniformType type)143 UniformLocation(u8 shaderType, u16 managedLocation, u8 registerLocation, u8 size, UniformType type) 144 { 145 m_Data = registerLocation | (size << 8) | ((managedLocation & 0x1FF) << 16) | ((type & 0xF) << 26) | (shaderType << 31); 146 } 147 148 #if NN_GD_DOCUMENT_TYPE == ENGLISH 149 /* Please see man pages for details 150 151 */ 152 #else 153 /* Please see man pages for details 154 155 */ 156 #endif UniformLocation(u32 data)157 UniformLocation(u32 data) 158 { 159 this->m_Data = data; 160 } 161 162 #if NN_GD_DOCUMENT_TYPE == ENGLISH 163 /* Please see man pages for details */ 164 #else 165 /* Please see man pages for details */ 166 #endif 167 static UniformLocation invalidValue; 168 169 #if NN_GD_DOCUMENT_TYPE == ENGLISH 170 /* Please see man pages for details 171 172 */ 173 #else 174 /* Please see man pages for details 175 176 */ 177 #endif GetRegister()178 u32 GetRegister() { return m_Data & 0xFF; } 179 180 #if NN_GD_DOCUMENT_TYPE == ENGLISH 181 /* Please see man pages for details 182 183 */ 184 #else 185 /* Please see man pages for details 186 187 */ 188 #endif GetManagedLocation()189 u32 GetManagedLocation() { return (m_Data >> 16) & 0x1FF; } 190 191 #if NN_GD_DOCUMENT_TYPE == ENGLISH 192 /* Please see man pages for details 193 194 */ 195 #else 196 /* Please see man pages for details 197 198 */ 199 #endif GetSize()200 u32 GetSize() { return (m_Data >> 8) & 0xFF; } 201 202 #if NN_GD_DOCUMENT_TYPE == ENGLISH 203 /* Please see man pages for details 204 205 */ 206 #else 207 /* Please see man pages for details 208 209 */ 210 #endif GetRegisterCount()211 u32 GetRegisterCount() { return GetSize() >> 2; } 212 213 #if NN_GD_DOCUMENT_TYPE == ENGLISH 214 /* Please see man pages for details 215 216 */ 217 #else 218 /* Please see man pages for details 219 220 */ 221 #endif GetShaderType()222 u32 GetShaderType() { return (m_Data >> 31); } 223 224 #if NN_GD_DOCUMENT_TYPE == ENGLISH 225 /* Please see man pages for details 226 227 */ 228 #else 229 /* Please see man pages for details 230 231 */ 232 #endif IsValid()233 u32 IsValid() { return m_Data != 0xFFFFFFFF; } 234 235 #if NN_GD_DOCUMENT_TYPE == ENGLISH 236 /* Please see man pages for details 237 238 */ 239 #else 240 /* Please see man pages for details 241 242 */ 243 #endif GetUniformType()244 u32 GetUniformType() { return (m_Data >> 26) & 0xF; } 245 }; // UniformLocation 246 247 248 #if NN_GD_DOCUMENT_TYPE == ENGLISH 249 /* Please see man pages for details 250 251 252 253 254 */ 255 #else 256 /* Please see man pages for details 257 258 259 260 261 */ 262 #endif 263 class ShaderStage 264 { 265 public: 266 267 #if NN_GD_DOCUMENT_TYPE == ENGLISH 268 /* Please see man pages for details */ 269 #else 270 /* Please see man pages for details */ 271 #endif 272 enum ShaderType 273 { 274 SHADER_TYPE_VERTEX = 0, 275 SHADER_TYPE_GEOMETRY = 1, 276 277 SHADER_RESERVED_MAX_U32 = 0xffffffff 278 }; 279 280 #if NN_GD_DOCUMENT_TYPE == ENGLISH 281 /* Please see man pages for details 282 283 284 285 */ 286 #else 287 /* Please see man pages for details 288 289 290 291 292 293 294 295 296 297 298 299 */ 300 #endif 301 static nnResult CreateShaderBinary(const void* shaderBytecode, u32 bytecodeLength, ShaderBinary** shaderBinary); 302 303 #if NN_GD_DOCUMENT_TYPE == ENGLISH 304 /* Please see man pages for details 305 306 307 308 */ 309 #else 310 /* Please see man pages for details 311 312 313 314 315 316 317 318 319 320 */ 321 #endif 322 static nnResult CreateShader(ShaderBinary* shaderBinary, u32 shaderBinaryIndex, VertexShader** vertexShader); 323 324 #if NN_GD_DOCUMENT_TYPE == ENGLISH 325 /* Please see man pages for details 326 327 328 329 330 331 332 333 334 335 */ 336 #else 337 /* Please see man pages for details 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 */ 354 #endif 355 static nnResult CreateShaderPipeline(VertexShader* vertexShader, VertexShader* geometryShader, ShaderPipeline** shaderPipeline, ShaderPipelineUnmanagedRegisters* unmanagedRegister = NULL); 356 357 #if NN_GD_DOCUMENT_TYPE == ENGLISH 358 /* Please see man pages for details 359 360 */ 361 #else 362 /* Please see man pages for details 363 364 365 366 367 368 */ 369 #endif 370 static nnResult SetShaderPipeline(ShaderPipeline* shaderPipeline); 371 372 #if NN_GD_DOCUMENT_TYPE == ENGLISH 373 /* Please see man pages for details 374 375 */ 376 #else 377 /* Please see man pages for details 378 379 380 381 382 383 */ 384 #endif 385 static nnResult ReleaseShaderBinary(ShaderBinary* shaderBinary); 386 387 #if NN_GD_DOCUMENT_TYPE == ENGLISH 388 /* Please see man pages for details 389 390 */ 391 #else 392 /* Please see man pages for details 393 394 395 396 397 398 */ 399 #endif 400 static nnResult ReleaseShader(VertexShader* vertexShader); 401 402 #if NN_GD_DOCUMENT_TYPE == ENGLISH 403 /* Please see man pages for details 404 405 */ 406 #else 407 /* Please see man pages for details 408 409 410 411 412 413 */ 414 #endif 415 static nnResult ReleaseShaderPipeline(ShaderPipeline* shaderPipeline); 416 417 418 #if NN_GD_DOCUMENT_TYPE == ENGLISH 419 /* Please see man pages for details 420 421 422 423 */ 424 #else 425 /* Please see man pages for details 426 427 428 429 430 431 432 433 434 */ 435 #endif 436 static nnResult SetShaderPipelineConstantF(ShaderPipeline* shaderPipeline, UniformLocation uniformLocation, f32* v); 437 438 #if NN_GD_DOCUMENT_TYPE == ENGLISH 439 /* Please see man pages for details 440 441 442 443 444 */ 445 #else 446 /* Please see man pages for details 447 448 449 450 451 452 453 454 455 456 */ 457 #endif 458 static nnResult SetShaderPipelineConstantB(ShaderPipeline* shaderPipeline, UniformLocation uniformLocation, u16 v, u32 count); 459 460 #if NN_GD_DOCUMENT_TYPE == ENGLISH 461 /* Please see man pages for details 462 463 464 465 */ 466 #else 467 /* Please see man pages for details 468 469 470 471 472 473 474 475 476 */ 477 #endif 478 static nnResult SetShaderPipelineConstantI(ShaderPipeline* shaderPipeline, UniformLocation uniformLocation, u8* v); 479 480 #if NN_GD_DOCUMENT_TYPE == ENGLISH 481 /* Please see man pages for details 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 */ 512 #else 513 /* Please see man pages for details 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 */ 550 #endif 551 static nnResult SetFloatConstantBuffer(ShaderType shaderType, u32 firstRegisterIndex, u32 registerCount, f32* constantBufferSrc); 552 553 #if NN_GD_DOCUMENT_TYPE == ENGLISH 554 /* Please see man pages for details 555 556 557 */ 558 #else 559 /* Please see man pages for details 560 561 562 563 564 565 566 */ 567 #endif 568 static UniformLocation GetShaderUniformLocation(ShaderPipeline* shaderPipeline, const char* name); 569 570 }; // ShaderStage 571 572 573 #if NN_GD_DOCUMENT_TYPE == ENGLISH 574 /* Please see man pages for details 575 576 577 */ 578 #else 579 /* Please see man pages for details 580 581 582 */ 583 #endif 584 class UnmanagedRegistersInterval 585 { 586 public: 587 #if NN_GD_DOCUMENT_TYPE == ENGLISH 588 /* Please see man pages for details */ 589 #else 590 /* Please see man pages for details */ 591 #endif 592 ShaderStage::ShaderType m_ShaderType; 593 594 #if NN_GD_DOCUMENT_TYPE == ENGLISH 595 /* Please see man pages for details */ 596 #else 597 /* Please see man pages for details */ 598 #endif 599 u32 m_FirstUnmanagedRegister; 600 601 #if NN_GD_DOCUMENT_TYPE == ENGLISH 602 /* Please see man pages for details */ 603 #else 604 /* Please see man pages for details */ 605 #endif 606 u32 m_RegisterCount; 607 }; 608 609 610 #if NN_GD_DOCUMENT_TYPE == ENGLISH 611 /* Please see man pages for details 612 613 614 */ 615 #else 616 /* Please see man pages for details 617 618 619 */ 620 #endif 621 class ShaderPipelineUnmanagedRegisters 622 { 623 public: 624 #if NN_GD_DOCUMENT_TYPE == ENGLISH 625 /* Please see man pages for details */ 626 #else 627 /* Please see man pages for details */ 628 #endif 629 UnmanagedRegistersInterval* m_ArrayUnmanagedRegistersInterval; 630 631 #if NN_GD_DOCUMENT_TYPE == ENGLISH 632 /* Please see man pages for details */ 633 #else 634 /* Please see man pages for details */ 635 #endif 636 u32 m_CountUnmanagedRegistersInterval; 637 }; 638 639 } // namespace CTR 640 } // namespace gd 641 } // namespace nn 642 643 #endif //NN_GD_CTR_GD_SHADER_H_ 644