What driver am I on?
vulkaninfo --summary
glxinfo -B
drm_info | head -40
1024 text colours
1024 of them — 128 families × 8 weights: 1 is the strongest, 8 the softest. Each one is solved for the background it is used on, so it stays legible on white and on black. The list is in four sections: Neutral, Spectrum, Named and Flat.
1024 colour schemes
1024 of them — 128 families × 8 depths: depths 1–4 are light pages, 5–8 dark ones, and the family called Plain is white, greys and black. The Spectrum families are thirty-three evenly spaced stops around the hue circle, the Named ones are the everyday colours between them, and the Flat ones — tinta unita — are those same colours kept at full strength, mixed with nothing but white or black. A scheme’s colour is the same hue at every depth, only lighter or darker.
1024 typefaces
1024 typefaces — as many as the colour schemes, and chosen the same way: a long list rather than a short one, ranked by how much the web actually uses them. Every one is self-hosted, latin only, one file each, and open source. They are sorted into five sections — Sans Serif, Serif, Display, Handwriting and Monospace — and each row draws itself in its own face only once it is on screen, so opening this panel costs nothing and a typeface can never slow a page down.
Track 03 · Graphics
The open graphics stack is not a compromise any more. Mesa implements Vulkan and OpenGL for AMD, Intel and — since NVK — NVIDIA hardware; Wayland gives you a predictable presentation path; and colour management is a solved problem if you configure it once and verify it with a measurement.
Architecture
Knowing which layer owns a bug is most of the work. A flickering window, a wrong colour and a missing extension live in three different places.
| Layer | Open implementation | Responsibility | Symptom when it breaks |
|---|---|---|---|
| Kernel | DRM / KMS in the Linux kernel | Memory management, modesetting, fences | No output, GPU resets, wrong resolution at boot |
| Userspace driver | Mesa — RADV, ANV, NVK | Command submission, shader compilation | Application crashes, missing extensions |
| API | Vulkan, OpenGL, OpenCL | The contract your code targets | Validation errors, undefined behaviour |
| Presentation | Wayland compositor — Sway, KWin, Mutter | Buffer sharing, vsync, frame pacing | Tearing, stutter, wrong scaling |
| Toolkit | GTK, Qt, SDL, GLFW | Window, input and context creation | Input quirks, HiDPI artefacts |
| Colour | Little CMS, OpenColorIO, ArgyllCMS | Transforms between colour spaces | Everything looks slightly wrong |
vulkaninfo --summary
glxinfo -B
drm_info | head -40
VK_LOADER_DEBUG=warn \
VK_INSTANCE_LAYERS=\
VK_LAYER_KHRONOS_validation \
./your-app
wayland-info | grep -i colour
colormgr get-devices
Colour management
Averaging, blurring, blending and lighting are physically meaningful only in linear light. If you do them on sRGB-encoded values you get the classic dark, muddy edges. Convert to linear on the way in, stay linear while you work, and transform to the display only at the very end.
Linear sRGB (Rec.709 primaries) for web and video work; ACEScg for compositing and VFX where wider gamut and scene-linear behaviour matter.
Textures, plates and renders must declare what they are. An untagged asset is a bug waiting to be discovered after delivery.
An OpenColorIO config centralises every conversion so the whole team and every render node agrees. Never bake a manual gamma tweak into an asset.
Measure with a colourimeter, generate an ICC profile, load it, and verify against a test chart. Repeat every few months, and after any driver change.
Render a known reference — a colour chart or a set of patches — compare the measured result with the expected value, and record the delta.
# Which configs are installed?
ls /usr/share/color/ocio/
# Force a config for a whole session
export OCIO=/usr/share/color/ocio/\
ocio://studio-config-latest
python3 -c "import PyOpenColorIO as ocio;\
print(ocio.GetCurrentConfig().getName())"
Shading
Modern practice is explicit: you manage memory, synchronisation and pipeline state yourself, and in exchange you get predictable performance. SPIR-V is the portable intermediate representation, so your shader source compiles once and runs on RADV, ANV and NVK without per-vendor rewrites.
Example
#version 450
// Inputs arrive in linear light. Stay linear; do not
// apply gamma here — the display transform owns that.
layout(location = 0) in vec3 vLinear;
layout(location = 1) in vec2 vUv;
layout(location = 0) out vec4 outColour;
layout(set = 0, binding = 0) uniform sampler2D albedo;
// sRGB-encoded texture to linear light.
vec3 srgbToLinear(vec3 c) {
return mix(c / 12.92,
pow((c + 0.055) / 1.055, vec3(2.4)),
step(vec3(0.04045), c));
}
void main() {
vec3 base = srgbToLinear(texture(albedo, vUv).rgb);
vec3 lit = base * max(vLinear, vec3(0.0));
outColour = vec4(lit, 1.0); // still linear
}
Compile with glslangValidator -V shader.frag -o shader.spv and load the
resulting SPIR-V module. The display transform — sRGB, PQ or an ICC profile — happens
after tone mapping, never inside a material shader.
Compute
If your compute kernel matters beyond one vendor's hardware, target a standard rather than a vendor runtime. The toolchains below are usable today on open drivers.
The same driver you already ship. Best portability across AMD, Intel and NVIDIA on Mesa, at the cost of more boilerplate.
Mature, widely implemented and well suited to data-parallel work outside a render loop. Clover and Rusticl provide open implementations.
Single-source C++ that can target CPUs and GPUs. A pragmatic choice when you want one codebase across devices.
AMD's open compute platform, with HIP for porting CUDA-style code. Excellent on supported cards; check the support matrix first.
CUDA remains the most mature compute ecosystem, but it is proprietary and ties your project to one vendor. Choose it deliberately for a specific deployment, not by default — and keep the kernel logic separable so a portable path stays possible.
Toolchain
Full 3D pipeline: modelling, sculpting, animation, simulation, Cycles and EEVEE rendering, plus a Python API that makes batch work scriptable.
Built for painters: brush engines, wrap-around mode, animation and proper colour management. The strongest open alternative for digital painting.
Photo retouching and compositing, with GEGL providing high bit-depth processing and a scriptable interface for repetitive tasks.
Vector work with a real SVG core. Round-trips cleanly to other tools because it stores standard SVG rather than a private format.
An MIT-licensed engine with Vulkan rendering, a readable scene format and no royalties. Good for tools and visualisation, not only games.
Parametric modelling for enclosures and brackets. OpenSCAD's text-based models diff and review like source code, which suits engineering work.
Interchange
| Use | Format | Why | Avoid |
|---|---|---|---|
| Intermediate render | OpenEXR | Float or half-float, linear, arbitrary channels and metadata | 8-bit PNG as a working format |
| Final still image | PNG / WebP | Lossless or efficient, universally readable | Untagged 8-bit exports |
| GPU texture | KTX2 with Basis Universal | GPU-ready container, transcodable, stays compressed in memory | Shipping huge uncompressed PNGs |
| 3D interchange | glTF 2.0 | Open, compact, PBR by convention, well supported | Vendor-specific scene formats |
| Vector | SVG | Standard, text-based, diffable | Flattened raster exports of logos |
| Colour transform | OCIO config | Versionable, shared by every tool in the pipeline | Per-artist manual curves |
| Display profile | ICC v4 | Measured from your actual panel | Assuming the factory profile is right |
Honesty notes
Pretending there are no gaps helps nobody. These are the friction points we hit regularly, and what we do about them.
| Priority | What to look for |
|---|---|
| Driver maturity | Upstream support in your Mesa version, not a vendor PPA |
| Colour depth | 10-bit output over DisplayPort or HDMI, verified in the compositor |
| Compute needs | Check the ROCm or oneAPI support matrix for your exact model |
| Calibration | A panel with usable OSD controls for gain and bias per channel |
| Repairability | Standard fans, standard power connectors, published tear-downs |
After every driver or kernel change, re-check the display profile and re-run your reference render. Silent colour regressions are the most expensive bugs in this discipline because nobody notices until delivery.
Next
A networked studio with a calibrated monitoring chain and a colour-managed render machine is the same project viewed three ways. Read how we work, then pick the weakest link in your own setup.