Phase 5 updates

Phase 5 · Slice 32 ·

Bindless materials

  • crates/render/src/bindless.rs: on devices with texture binding arrays and non-uniform indexing (requested when the adapter has them; TASSIX_BINDLESS=0 opts out), the surface pipelines read every material texture from one array of 1024 slots and their samplers from an array of 32 (each slot's sampler index in a storage buffer). Uploads take slots (slot 0 is white); the bind group rebuilds when textures come or go.
  • Instances carry their five texture slots (main and normal, metallic and occlusion, emission) in the normal matrix rows' unused w, as whole numbers floats hold exactly; the bindless variant of the surface shader is derived from the classic one (group 2's maps become the arrays, vs_main passes the slots flat, fs_main's samples index by them). Opaque and transparent runs no longer split by texture or maps; shadow casters, particles, UI and the sky keep their classic bindings.
  • All render tests pass in both modes, and a new one draws two differently textured quads in one call when bindless (two otherwise). The benchmark scenes (few textures) measure the same either way.
  • Not yet: multi-draw indirect (one call per run remains), bindless shadow casters and particles, more than 1024 textures in view.
  • Phase 5's list is done: Input System, Animator, uGUI, ParticleSystem and NavMesh; PBR, shadows, HDR, bloom and 2D lights; GPU culling, indirect draws, bindless materials and mesh LODs; Unity.Collections, Unity.Mathematics and the Job System; the cooked rkyv asset format with streaming; benchmark budgets in CI and Unity comparison runs. The gaps each slice lists remain open.