1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: gd_Resource.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_RESOURCE_H_ 15 #define NN_GD_CTR_GD_RESOURCE_H_ 16 17 #include <nn/gd/CTR/gd_Types.h> 18 #include <nn/gd/CTR/gd_Result.h> 19 20 #include <nn/gd/CTR/gd_Memory.h> 21 22 #if NN_GD_DOCUMENT_TYPE == ENGLISH 23 /* Please see man pages for details 24 25 */ 26 #else 27 /* Please see man pages for details 28 29 */ 30 #endif 31 32 namespace nn { 33 namespace gd { 34 namespace CTR { 35 36 #if NN_GD_DOCUMENT_TYPE == ENGLISH 37 /* Please see man pages for details 38 */ 39 #else 40 /* Please see man pages for details 41 */ 42 #endif 43 class VertexBufferResourceDescription; 44 45 #if NN_GD_DOCUMENT_TYPE == ENGLISH 46 /* Please see man pages for details 47 */ 48 #else 49 /* Please see man pages for details 50 */ 51 #endif 52 class VertexBufferResourceProperties; 53 54 #if NN_GD_DOCUMENT_TYPE == ENGLISH 55 /* Please see man pages for details 56 */ 57 #else 58 /* Please see man pages for details 59 */ 60 #endif 61 class VertexBufferResource; 62 63 #if NN_GD_DOCUMENT_TYPE == ENGLISH 64 /* Please see man pages for details 65 */ 66 #else 67 /* Please see man pages for details 68 */ 69 #endif 70 class Texture2DResourceDescription; 71 72 #if NN_GD_DOCUMENT_TYPE == ENGLISH 73 /* Please see man pages for details 74 */ 75 #else 76 /* Please see man pages for details 77 */ 78 #endif 79 class Texture2DResourceProperties; 80 81 #if NN_GD_DOCUMENT_TYPE == ENGLISH 82 /* Please see man pages for details 83 */ 84 #else 85 /* Please see man pages for details 86 */ 87 #endif 88 class Texture2DResource; 89 90 91 #if NN_GD_DOCUMENT_TYPE == ENGLISH 92 /* Please see man pages for details 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 */ 147 #else 148 /* Please see man pages for details 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 */ 206 #endif 207 class Resource 208 { 209 public: 210 211 #if NN_GD_DOCUMENT_TYPE == ENGLISH 212 /* Please see man pages for details 213 214 215 */ 216 #else 217 /* Please see man pages for details 218 219 220 */ 221 #endif 222 enum NativeFormat 223 { 224 NATIVE_FORMAT_RGBA_8888 = 0, 225 NATIVE_FORMAT_RGB_888 = 1, 226 NATIVE_FORMAT_RGBA_5551 = 2, 227 NATIVE_FORMAT_RGB_565 = 3, 228 NATIVE_FORMAT_RGBA_4444 = 4, 229 NATIVE_FORMAT_LUMINANCE_ALPHA_88 = 5, 230 NATIVE_FORMAT_HILO_88 = 6, 231 NATIVE_FORMAT_LUMINANCE_8 = 7, 232 NATIVE_FORMAT_ALPHA_8 = 8, 233 NATIVE_FORMAT_LUMINANCE_ALPHA_44 = 9, 234 NATIVE_FORMAT_LUMINANCE_4 = 10, 235 NATIVE_FORMAT_ALPHA_4 = 11, 236 NATIVE_FORMAT_ETC1_RGB8 = 12, 237 NATIVE_FORMAT_ETC1_A4 = 13, 238 NATIVE_FORMAT_GAS = 14, 239 NATIVE_FORMAT_SHADOW = 15, 240 NATIVE_FORMAT_DEPTH_16 = 16, 241 NATIVE_FORMAT_DEPTH_24 = 17, 242 NATIVE_FORMAT_DEPTH_24_STENCIL_8 = 18, 243 244 NATIVE_FORMAT_RESERVED_MAX_U32 = 0xffffffffu 245 }; 246 247 #if NN_GD_DOCUMENT_TYPE == ENGLISH 248 /* Please see man pages for details */ 249 #else 250 /* Please see man pages for details */ 251 #endif 252 typedef NativeFormat NativeResourceFormat; 253 254 #if NN_GD_DOCUMENT_TYPE == ENGLISH 255 /* Please see man pages for details 256 257 258 259 */ 260 #else 261 /* Please see man pages for details 262 263 264 265 */ 266 #endif 267 enum Format 268 { 269 FORMAT_RGBA_8888 = 100, 270 FORMAT_RGB_888 = 101, 271 FORMAT_RGBA_5551 = 102, 272 FORMAT_RGB_565 = 103, 273 FORMAT_RGBA_4444 = 104, 274 FORMAT_LUMINANCE_ALPHA_88 = 105, 275 FORMAT_LUMINANCE_8 = 106, 276 FORMAT_ALPHA_8 = 107, 277 FORMAT_LUMINANCE_ALPHA_44 = 108, 278 FORMAT_LUMINANCE_4 = 109, 279 FORMAT_ALPHA_4 = 110, 280 FORMAT_HILO_88 = 111, 281 282 FORMAT_RESERVED_MAX_U32 = 0xffffffffu 283 }; 284 285 #if NN_GD_DOCUMENT_TYPE == ENGLISH 286 /* Please see man pages for details */ 287 #else 288 /* Please see man pages for details */ 289 #endif 290 typedef Format ResourceFormat; 291 292 #if NN_GD_DOCUMENT_TYPE == ENGLISH 293 /* Please see man pages for details */ 294 #else 295 /* Please see man pages for details */ 296 #endif 297 enum CompressedFormat 298 { 299 FORMAT_ETC1_RGB8 = 111, 300 FORMAT_ETC1_A4 = 112, 301 302 FORMAT_ETC1_RESERVED_MAX_U32 = 0xffffffffu 303 }; 304 305 #if NN_GD_DOCUMENT_TYPE == ENGLISH 306 /* Please see man pages for details */ 307 #else 308 /* Please see man pages for details */ 309 #endif 310 typedef CompressedFormat CompressedResourceFormat; 311 312 #if NN_GD_DOCUMENT_TYPE == ENGLISH 313 /* Please see man pages for details */ 314 #else 315 /* Please see man pages for details */ 316 #endif 317 enum MapUsage 318 { 319 MAP_READ_ONLY = 0, 320 MAP_WRITE_ONLY = 1, 321 MAP_READ_WRITE = 2, 322 323 MAP_RESERVED_MAX_U32 = 0xffffffffu 324 }; 325 326 /* Please see man pages for details 327 328 */ 329 #if NN_GD_DOCUMENT_TYPE == ENGLISH 330 /* Please see man pages for details 331 332 */ 333 #else 334 /* Please see man pages for details 335 336 */ 337 #endif 338 class Helper 339 { 340 public: 341 #if NN_GD_DOCUMENT_TYPE == ENGLISH 342 /* Please see man pages for details 343 344 345 346 347 348 349 350 351 */ 352 #else 353 /* Please see man pages for details 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 */ 385 #endif 386 static nnResult ConvertTextureResourceToNativeFormat(Format format, u32 width, u32 height, const u8* dataSrc, u8* dataDst, NativeFormat* pnativeFormat = NULL); 387 388 #if NN_GD_DOCUMENT_TYPE == ENGLISH 389 /* Please see man pages for details 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 */ 424 #else 425 /* Please see man pages for details 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 */ 460 #endif 461 static nnResult GenerateMipMapsCPU(NativeFormat format, u32 width, u32 height, const u8* dataSrc, u8* dataDst, u32 countMipLevelToGenerate); 462 463 #if NN_GD_DOCUMENT_TYPE == ENGLISH 464 /* Please see man pages for details 465 466 467 468 469 470 471 472 473 */ 474 #else 475 /* Please see man pages for details 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 */ 492 #endif 493 static nnResult ConvertCompressedTextureResourceToNativeFormat(CompressedFormat format, u32 width, u32 height, u8* dataSrc, u8* dataDst, NativeFormat* pnativeFormat = NULL); 494 }; 495 496 #if NN_GD_DOCUMENT_TYPE == ENGLISH 497 /* Please see man pages for details 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 */ 519 #else 520 /* Please see man pages for details 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 551 552 553 */ 554 #endif 555 static nnResult CreateTexture2DResource(const Texture2DResourceDescription* description, const void* initialData, gdBool autoGenerateMipMapsFromData, Texture2DResource** texture2DResource, gdBool copyInitialData = GD_TRUE); 556 557 #if NN_GD_DOCUMENT_TYPE == ENGLISH 558 /* Please see man pages for details 559 560 561 562 563 564 565 566 567 568 */ 569 #else 570 /* Please see man pages for details 571 572 573 574 575 576 577 578 579 */ 580 #endif 581 static nnResult CreateTexture2DResourceCastFrom(const Texture2DResource* initialTexture2DResource, Resource::NativeFormat format, Memory::MemoryLayout layout, Texture2DResource** texture2DResource); 582 583 #if NN_GD_DOCUMENT_TYPE == ENGLISH 584 /* Please see man pages for details 585 586 587 */ 588 #else 589 /* Please see man pages for details 590 591 592 593 594 595 596 */ 597 #endif 598 static nnResult GetTexture2DResourceProperties(const Texture2DResource* texture2DResource, Texture2DResourceProperties* properties); 599 600 #if NN_GD_DOCUMENT_TYPE == ENGLISH 601 /* Please see man pages for details 602 603 */ 604 #else 605 /* Please see man pages for details 606 607 608 609 610 611 612 */ 613 #endif 614 static nnResult ReleaseTexture2DResource(Texture2DResource* texture2DResource); 615 616 #if NN_GD_DOCUMENT_TYPE == ENGLISH 617 /* Please see man pages for details 618 619 620 621 622 623 624 625 */ 626 #else 627 /* Please see man pages for details 628 629 630 631 632 633 634 635 636 637 638 639 640 641 */ 642 #endif 643 static nnResult MapTexture2DResource(Texture2DResource* texture2DResource, s32 mipLevelIndex, MapUsage usage, void** data); 644 645 #if NN_GD_DOCUMENT_TYPE == ENGLISH 646 /* Please see man pages for details 647 648 649 */ 650 #else 651 /* Please see man pages for details 652 653 654 655 656 657 658 */ 659 #endif 660 static nnResult UnmapTexture2DResource(Texture2DResource* texture2DResource); 661 /* */ // name 662 663 664 /* Please see man pages for details 665 666 */ 667 #if NN_GD_DOCUMENT_TYPE == ENGLISH 668 /* Please see man pages for details 669 670 671 672 673 674 675 676 677 678 679 680 681 */ 682 #else 683 /* Please see man pages for details 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 */ 706 #endif 707 static nnResult CreateVertexBufferResource(const VertexBufferResourceDescription* description, const void* initialData, VertexBufferResource** buffer, gdBool copyInitialData = GD_TRUE); 708 709 #if NN_GD_DOCUMENT_TYPE == ENGLISH 710 /* Please see man pages for details 711 712 713 */ 714 #else 715 /* Please see man pages for details 716 717 718 719 720 721 722 */ 723 #endif 724 static nnResult GetVertexBufferResourceProperties(const VertexBufferResource* buffer, VertexBufferResourceProperties* properties); 725 726 #if NN_GD_DOCUMENT_TYPE == ENGLISH 727 /* Please see man pages for details 728 729 730 731 732 733 */ 734 #else 735 /* Please see man pages for details 736 737 738 739 740 741 742 743 744 745 746 747 */ 748 #endif 749 static nnResult MapVertexBufferResource(VertexBufferResource* buffer, MapUsage usage, void** data); 750 751 #if NN_GD_DOCUMENT_TYPE == ENGLISH 752 /* Please see man pages for details 753 754 755 */ 756 #else 757 /* Please see man pages for details 758 759 760 761 762 763 764 */ 765 #endif 766 static nnResult UnmapVertexBufferResource(VertexBufferResource* buffer); 767 768 #if NN_GD_DOCUMENT_TYPE == ENGLISH 769 /* Please see man pages for details 770 771 */ 772 #else 773 /* Please see man pages for details 774 775 776 777 778 779 */ 780 #endif 781 static nnResult ReleaseVertexBufferResource(VertexBufferResource* buffer); 782 /* */ // name 783 784 }; // Resource 785 786 787 /*****************************************************************************************************************************/ 788 /********************************************* Descriptor/Properties class definition ****************************************/ 789 #if NN_GD_DOCUMENT_TYPE == ENGLISH 790 /* Please see man pages for details 791 792 793 */ 794 #else 795 /* Please see man pages for details 796 797 798 */ 799 #endif 800 class Texture2DResourceDescription 801 { 802 public: 803 #if NN_GD_DOCUMENT_TYPE == ENGLISH 804 /* Please see man pages for details */ 805 #else 806 /* Please see man pages for details */ 807 #endif 808 u32 m_Width; 809 810 #if NN_GD_DOCUMENT_TYPE == ENGLISH 811 /* Please see man pages for details */ 812 #else 813 /* Please see man pages for details */ 814 #endif 815 u32 m_Height; 816 817 #if NN_GD_DOCUMENT_TYPE == ENGLISH 818 /* Please see man pages for details */ 819 #else 820 /* Please see man pages for details */ 821 #endif 822 u32 m_CountMipLevels; 823 824 #if NN_GD_DOCUMENT_TYPE == ENGLISH 825 /* Please see man pages for details */ 826 #else 827 /* Please see man pages for details */ 828 #endif 829 Resource::NativeFormat m_Format; 830 831 #if NN_GD_DOCUMENT_TYPE == ENGLISH 832 /* Please see man pages for details */ 833 #else 834 /* Please see man pages for details */ 835 #endif 836 Memory::MemoryLayout m_MemLayout; 837 #if NN_GD_DOCUMENT_TYPE == ENGLISH 838 /* Please see man pages for details */ 839 #else 840 /* Please see man pages for details */ 841 #endif 842 Memory::MemoryLocation m_MemLocation; 843 }; // Texture2DResourceDescription 844 845 846 #if NN_GD_DOCUMENT_TYPE == ENGLISH 847 /* Please see man pages for details 848 849 850 */ 851 #else 852 /* Please see man pages for details 853 854 855 */ 856 #endif 857 class MipmapResourceInfo 858 { 859 public: 860 #if NN_GD_DOCUMENT_TYPE == ENGLISH 861 /* Please see man pages for details */ 862 #else 863 /* Please see man pages for details */ 864 #endif 865 u32 m_Width; 866 867 #if NN_GD_DOCUMENT_TYPE == ENGLISH 868 /* Please see man pages for details */ 869 #else 870 /* Please see man pages for details */ 871 #endif 872 u32 m_Height; 873 874 #if NN_GD_DOCUMENT_TYPE == ENGLISH 875 /* Please see man pages for details */ 876 #else 877 /* Please see man pages for details */ 878 #endif 879 u8* m_MemAddr; 880 }; 881 882 883 #if NN_GD_DOCUMENT_TYPE == ENGLISH 884 /* Please see man pages for details 885 886 887 */ 888 #else 889 /* Please see man pages for details 890 891 892 */ 893 #endif 894 class Texture2DResourceProperties 895 { 896 public: 897 #if NN_GD_DOCUMENT_TYPE == ENGLISH 898 /* Please see man pages for details */ 899 #else 900 /* Please see man pages for details */ 901 #endif 902 u32 m_Width; 903 904 #if NN_GD_DOCUMENT_TYPE == ENGLISH 905 /* Please see man pages for details */ 906 #else 907 /* Please see man pages for details */ 908 #endif 909 u32 m_Height; 910 911 #if NN_GD_DOCUMENT_TYPE == ENGLISH 912 /* Please see man pages for details */ 913 #else 914 /* Please see man pages for details */ 915 #endif 916 u32 m_CountMipLevels; 917 918 #if NN_GD_DOCUMENT_TYPE == ENGLISH 919 /* Please see man pages for details */ 920 #else 921 /* Please see man pages for details */ 922 #endif 923 u32 m_PixelSize; 924 925 #if NN_GD_DOCUMENT_TYPE == ENGLISH 926 /* Please see man pages for details */ 927 #else 928 /* Please see man pages for details */ 929 #endif 930 Resource::NativeFormat m_Format; 931 932 #if NN_GD_DOCUMENT_TYPE == ENGLISH 933 /* Please see man pages for details */ 934 #else 935 /* Please see man pages for details */ 936 #endif 937 Memory::MemoryLayout m_MemLayout; 938 939 #if NN_GD_DOCUMENT_TYPE == ENGLISH 940 /* Please see man pages for details */ 941 #else 942 /* Please see man pages for details */ 943 #endif 944 Memory::MemoryLocation m_MemLocation; 945 946 #if NN_GD_DOCUMENT_TYPE == ENGLISH 947 /* Please see man pages for details */ 948 #else 949 /* Please see man pages for details */ 950 #endif 951 u8* m_MemAddr; 952 953 #if NN_GD_DOCUMENT_TYPE == ENGLISH 954 /* Please see man pages for details 955 956 */ 957 #else 958 /* Please see man pages for details 959 960 */ 961 #endif GetMipmapAddress(u32 mipmapLevel)962 MipmapResourceInfo GetMipmapAddress(u32 mipmapLevel) 963 { 964 MipmapResourceInfo mipmapInfo; 965 mipmapInfo.m_Width = m_Width; 966 mipmapInfo.m_Height = m_Height; 967 mipmapInfo.m_MemAddr = m_MemAddr; 968 for (u32 i=0; i<mipmapLevel; ++i) 969 { 970 mipmapInfo.m_MemAddr += (mipmapInfo.m_Width * mipmapInfo.m_Height * m_PixelSize) >> 3; 971 mipmapInfo.m_Width >>= 1; 972 mipmapInfo.m_Height >>= 1; 973 } 974 return mipmapInfo; 975 } 976 }; 977 978 979 #if NN_GD_DOCUMENT_TYPE == ENGLISH 980 /* Please see man pages for details 981 982 983 */ 984 #else 985 /* Please see man pages for details 986 987 988 */ 989 #endif 990 class VertexBufferResourceDescription 991 { 992 public: 993 #if NN_GD_DOCUMENT_TYPE == ENGLISH 994 /* Please see man pages for details */ 995 #else 996 /* Please see man pages for details */ 997 #endif 998 u32 m_ByteSize; 999 1000 #if NN_GD_DOCUMENT_TYPE == ENGLISH 1001 /* Please see man pages for details */ 1002 #else 1003 /* Please see man pages for details */ 1004 #endif 1005 Memory::MemoryLocation m_MemLocation; 1006 }; 1007 1008 1009 #if NN_GD_DOCUMENT_TYPE == ENGLISH 1010 /* Please see man pages for details 1011 1012 1013 */ 1014 #else 1015 /* Please see man pages for details 1016 1017 1018 */ 1019 #endif 1020 class VertexBufferResourceProperties 1021 { 1022 public: 1023 #if NN_GD_DOCUMENT_TYPE == ENGLISH 1024 /* Please see man pages for details */ 1025 #else 1026 /* Please see man pages for details */ 1027 #endif 1028 u32 m_ByteSize; 1029 1030 #if NN_GD_DOCUMENT_TYPE == ENGLISH 1031 /* Please see man pages for details */ 1032 #else 1033 /* Please see man pages for details */ 1034 #endif 1035 Memory::MemoryLocation m_MemLocation; 1036 1037 #if NN_GD_DOCUMENT_TYPE == ENGLISH 1038 /* Please see man pages for details */ 1039 #else 1040 /* Please see man pages for details */ 1041 #endif 1042 u8* m_MemAddr; 1043 }; 1044 1045 1046 } // namespace CTR 1047 } // namespace gd 1048 } // namespace nn 1049 1050 #endif // NN_GD_CTR_GD_RESOURCE_H_ 1051