This commit adds support for multidraw, which is a feature that allows multiple meshes to be drawn in a single drawcall. wgpu currently implements multidraw on Vulkan, so this feature is only enabled there. Multiple meshes can be drawn at once if they're in the same vertex and index buffers and are otherwise placed in the same bin. (Thus, for example, at present the materials and textures must be identical, but see #16368.) Multidraw is a significant performance improvement during the draw phase because it reduces the number of rebindings, as well as the number of drawcalls.
This feature is currently only enabled when GPU culling is used: i.e. when GpuCulling is present on a camera. Therefore, if you run for example scene_viewer, you will not see any performance improvements, because scene_viewer doesn't add the GpuCulling component to its camera.
Additionally, the multidraw feature is only implemented for opaque 3D meshes and not for shadows or 2D meshes. I plan to make GPU culling the default and to extend the feature to shadows in the future. Also, in the future I suspect that polyfilling multidraw on APIs that don't support it will be fruitful, as even without driver-level support use of multidraw allows us to avoid expensive wgpu rebindings.
I'm marking this PR as a draft until 0.15 is out, to indicate that we shouldn't merge it before then. It should generally be ready to go, though; feel free to review.
This commit adds support for multidraw, which is a feature that allows multiple meshes to be drawn in a single drawcall.
wgpu
currently implements multidraw on Vulkan, so this feature is only enabled there. Multiple meshes can be drawn at once if they're in the same vertex and index buffers and are otherwise placed in the same bin. (Thus, for example, at present the materials and textures must be identical, but see #16368.) Multidraw is a significant performance improvement during the draw phase because it reduces the number of rebindings, as well as the number of drawcalls.This feature is currently only enabled when GPU culling is used: i.e. when
GpuCulling
is present on a camera. Therefore, if you run for examplescene_viewer
, you will not see any performance improvements, becausescene_viewer
doesn't add theGpuCulling
component to its camera.Additionally, the multidraw feature is only implemented for opaque 3D meshes and not for shadows or 2D meshes. I plan to make GPU culling the default and to extend the feature to shadows in the future. Also, in the future I suspect that polyfilling multidraw on APIs that don't support it will be fruitful, as even without driver-level support use of multidraw allows us to avoid expensive
wgpu
rebindings.