| 646 | |
| 647 | |
| 648 | KTX_error_code |
| 649 | ktxTexture2_transcodeUastc(ktxTexture2* This, |
| 650 | alpha_content_e alphaContent, |
| 651 | ktxTexture2* prototype, |
| 652 | ktx_transcode_fmt_e outputFormat, |
| 653 | ktx_transcode_flags transcodeFlags) |
| 654 | { |
| 655 | assert(This->supercompressionScheme != KTX_SS_BASIS_LZ); |
| 656 | |
| 657 | ktx_uint8_t* pXcodedData = prototype->pData; |
| 658 | ktx_uint32_t outputBlockByteLength |
| 659 | = prototype->_protected->_formatSize.blockSizeInBits / 8; |
| 660 | ktx_size_t xcodedDataLength |
| 661 | = prototype->dataSize / outputBlockByteLength; |
| 662 | DECLARE_PRIVATE(protoPriv, prototype); |
| 663 | ktxLevelIndexEntry* protoLevelIndex = protoPriv._levelIndex; |
| 664 | ktx_size_t levelOffsetWrite = 0; |
| 665 | |
| 666 | basisu_lowlevel_uastc_transcoder uit; |
| 667 | // See comment on same declaration in transcodeEtc1s. |
| 668 | std::vector<basisu_transcoder_state> xcoderStates; |
| 669 | xcoderStates.resize(This->isVideo ? This->numFaces : 1); |
| 670 | |
| 671 | for (ktx_int32_t level = This->numLevels - 1; level >= 0; level--) |
| 672 | { |
| 673 | ktx_uint32_t depth; |
| 674 | uint64_t writeOffset = levelOffsetWrite; |
| 675 | uint64_t writeOffsetBlocks = levelOffsetWrite / outputBlockByteLength; |
| 676 | ktx_size_t levelImageSizeIn, levelImageOffsetIn; |
| 677 | ktx_size_t levelImageSizeOut, levelSizeOut; |
| 678 | ktx_uint32_t levelImageCount; |
| 679 | uint32_t levelWidth = MAX(1, This->baseWidth >> level); |
| 680 | uint32_t levelHeight = MAX(1, This->baseHeight >> level); |
| 681 | // UASTC texel block dimensions |
| 682 | const uint32_t bw = 4, bh = 4; |
| 683 | uint32_t levelBlocksX = (levelWidth + (bw - 1)) / bw; |
| 684 | uint32_t levelBlocksY = (levelHeight + (bh - 1)) / bh; |
| 685 | uint32_t stateIndex = 0; |
| 686 | |
| 687 | depth = MAX(1, This->baseDepth >> level); |
| 688 | |
| 689 | levelImageCount = This->numLayers * This->numFaces * depth; |
| 690 | levelImageSizeIn = ktxTexture_calcImageSize(ktxTexture(This), level, |
| 691 | KTX_FORMAT_VERSION_TWO); |
| 692 | levelImageSizeOut = ktxTexture_calcImageSize(ktxTexture(prototype), |
| 693 | level, |
| 694 | KTX_FORMAT_VERSION_TWO); |
| 695 | |
| 696 | levelImageOffsetIn = ktxTexture2_levelDataOffset(This, level); |
| 697 | levelSizeOut = 0; |
| 698 | bool status; |
| 699 | for (uint32_t image = 0; image < levelImageCount; image++) { |
| 700 | basisu_transcoder_state& xcoderState = xcoderStates[stateIndex]; |
| 701 | // See comment before same lines in transcodeEtc1s. |
| 702 | if (++stateIndex == xcoderStates.size()) |
| 703 | stateIndex = 0; |
| 704 | |
| 705 | status = uit.transcode_image( |
no test coverage detected