Platform Support

Spark is specifically aimed at low- and mid-range mobile devices. It runs on most iOS devices with Metal 1.2 support and most Android devices with support for OpenGL ES 3.0 or Vulkan.

It also runs in most web browsers via WebGL and WebGPU. For web-only projects, we offer spark.js, a simple API that makes it easy to use the Spark codecs on the web.

Platform / Vendor Support Version
iOS / Apple iPhone 6 and above using Metal 1.2 or OpenGL ES
Android / Arm Bifrost and above
Android / Qualcomm Adreno 500 and above with driver version ≥ 512.490
Android / ImgTec All PowerVR devices starting with Series 6
Android / Samsung All Xclipse devices
MacOS All Metal 1.2 devices from Apple, Intel, AMD, and NVIDIA
Windows All D3D11, D3D12, OpenGL, and Vulkan 1.1
Linux Valve's SteamDeck only
Web Most browsers and devices using WebGL and WebGPU. See spark.js

Performance

Spark is designed to take advantage of the GPU's capabilities to optimize its performance. It runs on most graphics APIs including Metal, Vulkan, OpenGL and Direct3D.

While block compression is intrinsically parallel, targeting it requires carefully crafted algorithms that minimize divergence and fit within the constrained resource limits. Spark is the result of the refinement of these techniques over years of compression experience.

Spark aims to maximize the quality that can be attained while saturating memory bandwidth. To achieve this we optimize the use of the arithmetic units by meticulously implementing numerically sensitive algorithms and table lookups in half floating point, ensuring correctness and consistency across GPUs.

Quality vs. hardware encoders

Spark's output is often competitive with the native hardware compressors built into GPUs — see this comparison. Unlike those encoders, Spark produces consistent results across devices and targets higher compression ratios that hardware encoders typically don't support.

Performance on Mobile Devices

The following charts show the expected performance on some of our devices:

Higher throughput than uncompressed uploads

On bandwidth-limited devices, Spark's throughput is often higher than an uncompressed texture upload. A plain blit must read the full input and write the same amount of data back out, whereas Spark only writes one quarter of the input. The memory bandwidth saved on writes is often enough to offset the computational cost of encoding, resulting in higher net throughput.

Memory bandwidth comparison: an uncompressed blit reads the input and writes the same amount back, while Spark reads the input, encodes, and writes only one quarter of the data

Formats

Spark has been optimized using a comprehensive collection of freely accessible PBR textures, complemented by assets generously shared by our clients.

Our codecs target the formats best suited for this content: ASTC 4x4 for color and albedo maps, both with and without alpha, and EAC for normal maps, roughness, metalness, occlusion, and height. Additionally, we support ETC2 and ASTC 6x6 for lower quality color maps.

On MacOS, Desktop PCs, and some Android devices Spark supports BC1, BC3, BC4, BC5, and BC7 formats. There are several real-time GPU encoders that also target some of these formats, but Spark provides higher quality and performance than the alternatives:

AMD BC1
AMD BC1
Microsoft BC1
Microsoft BC1
Spark BC1
Spark BC1
Quality and throughput of Spark BC codecs

Error and throughput of Spark BC1 and BC7 codecs against competing BC1 encoders on the Adreno 740