Release-Notes

This content was automatically converted from the project's wiki Markdown to HTML. See the Basis Universal GitHub wiki for the latest content.

Release Notes

3/8/2026: KTX-Software-Binomial-Fork created

We are fixing key KTX-Software codec parameter integration bugs in this fork, back porting security fixes from v2.1 to v1.6, and then integrating basisu v2.1 with our ASTC LDR 4x4-12x12, ASTC HDR 6x6 and XUASTC LDR codecs into this fork.

3/3/2026: WebGL .KTX2 GPU Texture Encoding/Transcoding Testbed updated to v2.14

KTX2 viewer/compression testbed sample updated:

3/2/2026: WebGL .KTX2 GPU Texture Encoding/Transcoding Testbed updated to v2.11

KTX2 viewer/compression testbed sample updated:

LDR and HDR texture video files can now be examined using the viewer, now. We've tested it up to ~1900 frames of 1920 XUASTC LDR video at 8x8 and 12x12. Note scrubbing ETC1S texture video files may show block artifacts because of directly seeking to individual P-frames, which we'll fix in the next update.

At this point the KTX2 WebGL testbed is now a full viewer for our KTX2 files. (Just drag and drop or select a .KTX2 file to view it.) The major remaining constraint are WASM/WASM64 memory limits (which limit the maximum texture or image we can compress using XUASTC LDR), which we'll be working on reducing in our next major release.

2/28/2026: KTX2 header parser potential overflow fix

2/24/2026: v2.1 release: KTX-Software (KTX2 file format) compatibility changes for UASTC HDR 4x4, UASTC HDR 6x6i, and XUASTC LDR formats

This update impacts the UASTC HDR 4x4, UASTC HDR 6x6i, and XUASTC LDR formats. New UASTC HDR 6x6i and XUASTC LDR KTX2 files written using basisu v2.1 can't be loaded using v2.0, however we've kept full backwards compatibility with all of our previously written KTX2 files in v2.1. The v2.1 transcoder/introspection API's transparently supports the KTX2 headers and supercompressed data written by v1.6 and v2.0. This is part of our effort to be compatible with Khronos's KTX2 specification.

KTX2_SS_UASTC_HDR_6x6I = 4, // UASTC HDR 6x6i (picked by Khronos, in KTX-Software as of 2/19/2026)
KTX2_SS_XUASTC_LDR = 5 // XUASTC LDR 4x4-12x12 (not in KTX-Software yet as of 2/19/2026)

2/19/2026: KTX2 compatibility work

2/19/2026: Bug fix to v1.6 transcoder initialization (already fixed in repo/v2.0)

2/10/2026: Added Shader deblocking OpenGL sample

2/4/2026: Minor additions

1/19/2026 - v2.0 released: full ASTC LDR support, XUASTC LDR, new fully analytical real-time BC7 and ETC1 block encoders, WASM WASI executables/modules, WASM64 support, early Python support

10/17/2025 - upcoming release note

9/5/2025 release note

2/19/25 v1.60.0 release notes

1/21/25 v1.60.0 release notes

9/10/24 v1.50.0 release notes

2/24/22 v1.16.3 release notes

1/28/22 v1.16 release notes:

This is a major release, focusing on smaller code size, less 3rd party dependencies (just Zstd), OpenCL support, faster ETC1S encoding, and fully multithreading/parallel processing. This work was sponsored by Esri (thanks!).

Note that OpenCL may not be any faster when encoding individual files - it highly depends on your hardware. OpenCL encoding is intended (but not required) to be used with parallel processing (see the -parallel option, next).

The BASISU_SUPPORT_OPENCL macro must be set to 1 to enable OpenCL usage in the encoder. Otherwise it's completely disabled.

OpenCL support has been tested under Windows using AMD/NVidia/Intel drivers, under Ubuntu Linux using NVidia drivers, and on an Intel OSX MacBook.

On very old NVidia GPU's the driver may crash during OpenCL encoding. The encoder should transparently fall back to CPU-only processing when this occurs. Also, too much GPU memory may be required when processing very large/long ETC1S videos, in which case it will also fall back to CPU-only encoding.

With both OpenCL and parallel processing enabled the OpenCL driver is called from multiple threads. AMD OpenCL drivers are not thread safe (which is incorrect behavior), so we automatically detect AMD drivers and serialize all calls to the OpenCL API on these parts.

"-max_threads X" - Sets the # of maximum total threads to X if threading is enabled (also see -no_multithreading)

"-ktx_only" - Write only KTX files during unpacking (no PNG's)

"-split X.png" - Splits a PNG file to a 24bpp file and four grayscale PNG files (one each for each component)

"-combine rgb.png a.png" - Combines two PNG files into a single 32bpp PNG file

The removal of BMP reading is unfortunate - let us know if this is an issue for anyone.

5/28/21 notes:

4/13/21 release notes:

4/12/21 v1.15 release notes:

Note that KTX2 1D textures are not supported yet - we're working on it. Importantly, if you use the official toktx tool from the KTX-Software repo, it defaults to writing 1D images if the input height is 1. You'll need to always specify the '-2d' option when using toktx if you intend on reading its files with Basis Universal's current transcoder.

IMPORTANT: By default KTX2 support is enabled when compiling basisu_transcoder.cpp. Because KTX2 utilizes Zstandard (for UASTC supercompression), by default this means the transcoder now depends on the Zstandard single file decoder in the "zstd" subdirectory (zstd/zstddeclib.c). (This is new for v1.15. Before we had no other dependencies to any other .C/CPP files.) The transcoder supports entirely disabling KTX2/Zstandard support at compile time: Set BASISD_SUPPORT_KTX2 to 0 to disable KTX2 and Zstandard entirely, and set BASISD_SUPPORT_KTX2_ZSTD to 0 to just disable Zstandard support. If you leave KTX2 support enabled, but disable Zstandard, the transcoder (and encoder) will not be able to transcode (or encode) supercompressed UASTC files, so this isn't recommended unless you're positive you won't be using or ever transcoding Zstandard compressed UASTC files.

When compiling the WASM transcoder and encoder, you can disable KTX2 and KTX2 Zstandard support by setting the "KTX2" and "KTX2_ZSTANDARD" CMake options to 0: "emcmake cmake ../ -DKTX2=0" etc. By default KTX2 and Zstandard support are enabled. (The transcoder supports disabling either KTX2 or Zstandard. The encoder always supports KTX2 but allows for Zstandard to be disabled.)

The encoder always supports generating KTX2 files. However, you can disable Zstandard compression support by setting BASISD_SUPPORT_KTX2_ZSTD to 0. By default the encoder now depends on the Zstandard compressor and decompressor.

We have included the single source file versions of the Zstandard compressor/decompressor in the "zstd" subdirectory. If your project already links in Zstandard, you can modify your CMake files to not use the single file variants. We only depend on 2 Zstandard API's (the ones for simple memory buffer compression/decompression). Notably, Zstandard uses the BSD license, while most of the files in the repo use the Apache 2.0 or zlib licenses.

The -unpack/-info/-validate options now support KTX2 files. Or you can just specify a KTX2 file on the command line and it'll be automatically unpacked. The unpack mode writes .PNG and .KTX1 format files (KTX1 because most tools don't support KTX2 yet).

The WASM JavaScript wrappers (in webgl/transcoder/basisu_wrappers.cpp) now fully support KTX2. See the "webgl/ktx2_encode_test" sample for example code on how to encode and transcode KTX2 files in JavaScript.

The KTX2 transcoder does not support 1D files yet. Importantly, the "toktx2" tool, by default, outputs 1D textures if the height of the input is 1. We will be fixing this very soon (should be simple).

The official KTX2 validation tool (ktx2check) has a bug that doesn't account for mipPadding alignment on non-supercompressed UASTC files. To workaround this bug, the encoder will sometimes add a small variable length key-value field into the output, consisting of all 0x7F bytes, in order to force the mip levels array to be aligned on a 16 byte boundary without having to use any mip padding bytes. We'll remove this workaround once the validator tool is fixed. (This is not an issue with the KTX2 specification itself. It's just a bug in the validation tool.)

3/9/21 v1.13 release notes:

12/17/20 release notes:

3/25/20 release notes:

3/14/20 release notes:

9/26/19 release notes:

Milestone 2 (9/19/19) release notes: