| 85 | |
| 86 | template <bool TRANSCODE_CMD> |
| 87 | KTXTexture2 transcode(KTXTexture2&& texture, OptionsTranscodeTarget<TRANSCODE_CMD>& options, Reporter& report) { |
| 88 | options.validateTextureTranscode(texture, report); |
| 89 | |
| 90 | auto ret = ktxTexture2_TranscodeBasis(texture, options.transcodeTarget.value(), 0); |
| 91 | if (ret != KTX_SUCCESS) |
| 92 | report.fatal(rc::INVALID_FILE, "Failed to transcode KTX2 texture: {}", ktxErrorString(ret)); |
| 93 | |
| 94 | // Need to perform format conversion and swizzling if needed |
| 95 | bool needFormatConversion = false; |
| 96 | bool needSwizzle = false; |
| 97 | if (options.transcodeSwizzleComponents != 0) { |
| 98 | if (options.transcodeSwizzleComponents == 4) { |
| 99 | if (options.transcodeSwizzle != "rgba") { |
| 100 | needSwizzle = true; |
| 101 | } |
| 102 | } else { |
| 103 | needFormatConversion = true; |
| 104 | needSwizzle = true; |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | KTXTexture2 convertedTexture{nullptr}; |
| 109 | if (needFormatConversion) { |
| 110 | ktxTextureCreateInfo createInfo; |
| 111 | std::memset(&createInfo, 0, sizeof(createInfo)); |
| 112 | |
| 113 | const bool srgb = (texture->vkFormat == VK_FORMAT_R8G8B8A8_SRGB); |
| 114 | switch (options.transcodeSwizzleComponents) { |
| 115 | case 1: |
| 116 | createInfo.vkFormat = srgb ? VK_FORMAT_R8_SRGB : VK_FORMAT_R8_UNORM; |
| 117 | break; |
| 118 | case 2: |
| 119 | createInfo.vkFormat = srgb ? VK_FORMAT_R8G8_SRGB : VK_FORMAT_R8G8_UNORM; |
| 120 | break; |
| 121 | case 3: |
| 122 | createInfo.vkFormat = srgb ? VK_FORMAT_R8G8B8_SRGB : VK_FORMAT_R8G8B8_UNORM; |
| 123 | break; |
| 124 | default: |
| 125 | assert(false); |
| 126 | } |
| 127 | |
| 128 | createInfo.baseWidth = texture->baseWidth; |
| 129 | createInfo.baseHeight = texture->baseHeight; |
| 130 | createInfo.baseDepth = texture->baseDepth; |
| 131 | createInfo.generateMipmaps = texture->generateMipmaps; |
| 132 | createInfo.isArray = texture->isArray; |
| 133 | createInfo.numDimensions = texture->numDimensions; |
| 134 | createInfo.numFaces = texture->numFaces; |
| 135 | createInfo.numLayers = texture->numLayers; |
| 136 | createInfo.numLevels = texture->numLevels; |
| 137 | createInfo.pDfd = nullptr; |
| 138 | |
| 139 | ret = ktxTexture2_Create(&createInfo, KTX_TEXTURE_CREATE_ALLOC_STORAGE, convertedTexture.pHandle()); |
| 140 | if (KTX_SUCCESS != ret) |
| 141 | report.fatal(rc::IO_FAILURE, "Failed to create output texture: {}", ktxErrorString(ret)); |
| 142 | } |
| 143 | |
| 144 | KTXTexture2& outputTexture = (convertedTexture.handle() != nullptr) ? convertedTexture : texture; |
no test coverage detected