// // Copyright 2022 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // loadimage_astc.cpp: Decodes ASTC encoded textures. #include "image_util/AstcDecompressor.h" #include "image_util/loadimage.h" namespace angle { void LoadASTCToRGBA8Inner(const ImageLoadContext &context, size_t width, size_t height, size_t depth, uint32_t blockWidth, uint32_t blockHeight, const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch, uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch) { auto imgWidth = static_cast(width); auto imgHeight = static_cast(height); AstcDecompressor &decompressor = AstcDecompressor::get(); if (!decompressor.available()) { ERR() << "Trying to decompress ASTC without having ASTC support built."; return; } // Compute the number of ASTC blocks in each dimension uint32_t blockCountX = (imgWidth + blockWidth - 1) / blockWidth; uint32_t blockCountY = (imgHeight + blockHeight - 1) / blockHeight; // Space needed for 16 bytes of output per compressed block size_t blockSize = blockCountX * blockCountY * 16; int32_t result = decompressor.decompress(context.singleThreadPool, context.multiThreadPool, imgWidth, imgHeight, blockWidth, blockHeight, input, blockSize, output); if (result != 0) { WARN() << "ASTC decompression failed: " << decompressor.getStatusString(result); } } } // namespace angle