| 786 | } |
| 787 | |
| 788 | bool NtcMaterialLoader::TranscodeMaterial(ntc::IContext* context, ntc::IStream* ntcFile, |
| 789 | ntc::ITextureSetMetadata* textureSetMetadata, |
| 790 | NtcMaterial& material, nvrhi::ICommandList* commandList, bool enableBlockCompression) |
| 791 | { |
| 792 | if (material.transcodeMapping.empty()) |
| 793 | return true; |
| 794 | |
| 795 | int const textureCount = int(material.transcodeMapping.size()); |
| 796 | |
| 797 | // Phase 1 - Create textures (color, block, BCn) and write descriptors for NTC decompression |
| 798 | |
| 799 | ntc::TextureSetDesc const& textureSetDesc = textureSetMetadata->GetDesc(); |
| 800 | for (int textureIndex = 0; textureIndex < textureCount; ++textureIndex) |
| 801 | { |
| 802 | TextureTranscodeTask& transcodeTask = material.transcodeMapping[textureIndex]; |
| 803 | std::string const materialTextureName = material.name + ":" + std::string(transcodeTask.name); |
| 804 | |
| 805 | // Create the color texture |
| 806 | |
| 807 | nvrhi::TextureDesc colorTextureDesc = nvrhi::TextureDesc() |
| 808 | .setDimension(nvrhi::TextureDimension::Texture2D) |
| 809 | .setWidth(textureSetDesc.width) |
| 810 | .setHeight(textureSetDesc.height) |
| 811 | .setMipLevels(textureSetDesc.mips) |
| 812 | .setFormat((transcodeTask.numChannels == 1) |
| 813 | ? nvrhi::Format::R8_UNORM |
| 814 | : transcodeTask.sRGB |
| 815 | ? nvrhi::Format::SRGBA8_UNORM |
| 816 | : nvrhi::Format::RGBA8_UNORM) |
| 817 | .setDebugName(materialTextureName) |
| 818 | .setIsUAV(true) |
| 819 | .setIsTypeless(true) |
| 820 | .setInitialState(nvrhi::ResourceStates::ShaderResource) |
| 821 | .setKeepInitialState(true); |
| 822 | |
| 823 | transcodeTask.color = m_device->createTexture(colorTextureDesc); |
| 824 | if (!transcodeTask.color) |
| 825 | return false; |
| 826 | |
| 827 | bool compressThisTexture = enableBlockCompression && transcodeTask.bcFormat != ntc::BlockCompressedFormat::None; |
| 828 | |
| 829 | if (compressThisTexture) |
| 830 | { |
| 831 | // Create the BCn texture |
| 832 | |
| 833 | nvrhi::TextureDesc compressedTextureDesc = nvrhi::TextureDesc() |
| 834 | .setDimension(nvrhi::TextureDimension::Texture2D) |
| 835 | .setFormat(transcodeTask.nvrhiBcFormat) |
| 836 | .setWidth(textureSetDesc.width) |
| 837 | .setHeight(textureSetDesc.height) |
| 838 | .setMipLevels(textureSetDesc.mips) |
| 839 | .setDebugName(materialTextureName) |
| 840 | .setInitialState(nvrhi::ResourceStates::ShaderResource) |
| 841 | .setKeepInitialState(true); |
| 842 | |
| 843 | transcodeTask.compressed = m_device->createTexture(compressedTextureDesc); |
| 844 | if (!transcodeTask.compressed) |
| 845 | return false; |
nothing calls this directly
no test coverage detected