MCPcopy Create free account
hub / github.com/KhronosGroup/KTX-Software / ktxTexture2_transcodeUastc

Function ktxTexture2_transcodeUastc

lib/basis_transcode.cpp:648–744  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

646
647
648KTX_error_code
649ktxTexture2_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(

Callers 1

Calls 6

assertFunction · 0.85
ktxTexture_calcImageSizeFunction · 0.85
resizeMethod · 0.45
sizeMethod · 0.45
transcode_imageMethod · 0.45

Tested by

no test coverage detected