1 Commits
Author SHA1 Message Date
西风逍遥游 95b1491e86 feat(graphics): GPU-driven phase 1 - CPU-built indirect draws for opaque forward
- 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).
2026-08-20 21:30:54 +08:00