- Shared GPU-driven types (GpuDrivenTypes.h) in the backend-independent
graphics namespace; IndirectBuilder (pure CPU) sorts instances by
(pipeline, material, mesh) and merges buckets into GpuIndirectCommand.
- Base Graphics gains a capability-gated seam (supportsGpuDriven3D,
gpuDrivenMeshRecord/MaterialRecord, gpuDrivenSubmitOpaque); WebGPU keeps
the default false.
- Vulkan backend: mesh3d_gpudriven vert/frag (instance + bindless textures +
material table, mirroring mesh3d PBR/CSM/IBL shading), a dedicated pipeline
with a firstInstance push constant, per-frame arena upload of the sorted
instance buffer + commands, and per-bucket vkCmdDrawIndexedIndirect.
- Bindless set1 uses fixed-size descriptor arrays + dynamic indexing instead
of nonuniform() because this toolchain's glslc lacks
GL_EXT_nonuniform_qualifier; indices are uniform per bucket (one material
per indirect draw), which is spec-legal. Caps requirements updated to
match (drops runtime descriptor arrays / non-uniform indexing).
- RenderControl feature 'gpuDriven' (default OFF; opt-in until runtime
verified). RenderSystem3D collects opaque instances when enabled and
eligible (default camera, Material-driven, no custom shader, no clustered);
any ineligible item falls back to the legacy per-draw path.
- Tests: IndirectBuilder merging/stable-order/pipeline-separation (CPU).
GPU-driven runtime tests (GpuDriven.*) remain pending driver recovery.
Rendering is unchanged by default (feature off).