| // |
| // 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<uint32_t>(width); |
| auto imgHeight = static_cast<uint32_t>(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 |