> Cinder 0.1.0 documentation: ADR-0002: No MAX / max.gpu for rendering; GPU compute is WGSL
> Canonical page: https://cinder.ash10.dev/docs/adr/0002-no-max-gpu/ · Source: `docs/adr/0002-no-max-gpu.md` in the engine repository (engine commit 47c9352, imported 2026-11-09)
> Index of every page for agents: https://cinder.ash10.dev/llms.txt

# ADR-0002: No MAX / `max.gpu` for rendering; GPU compute is WGSL

Status: Accepted, 2026-11-08

## Context

Mojo 1.x moved GPU programming out of the standard library into the `max` package (`max.gpu.*`), per the
1.0.0 and 1.1.0 release notes. MAX device buffers are allocated and owned by MAX's runtime and cannot be
imported into a wgpu `WGPUBuffer` or `WGPUTexture`; there is no documented interop for sharing memory
with a wgpu surface or swap chain.

## Decision

Cinder does not depend on `max` at all. All GPU compute work (clustered light culling, IBL prefiltering
and irradiance, BRDF LUT generation, GPU culling, particles) is written as WGSL compute shaders and
dispatched through wgpu-native, in the same device and queue as rendering.

## Consequences

- One GPU runtime, one validation layer, one set of synchronisation rules.
- Mojo's SIMD is used on the CPU side (culling, animation, math); GPU parallelism lives in WGSL.
- `pixi.toml` depends on `mojo` only, never on `max`. A CI grep fails on `import max` or `from max`.
