-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix the example regressions from packed growable buffers. #14375
Conversation
The "uberbuffers" PR bevyengine#14257 caused some examples to fail intermittently for different reasons: 1. `morph_targets` could fail because vertex displacements for morph targets are keyed off the vertex index. With buffer packing, the vertex index can vary based on the position in the buffer, which caused the morph targets to be potentially incorrect. The solution is to include the first vertex index with the `MeshUniform` (and `MeshInputUniform` if GPU preprocessing is in use), so that the shader can calculate the true vertex index before performing the morph operation. This results in wasted space in `MeshUniform`, which is unfortunate, but we'll soon be filling in the padding with the ID of the material when bindless textures land, so this had to happen sooner or later anyhow. Including the vertex index in the `MeshInputUniform` caused an ordering problem. The `MeshInputUniform` was created during the extraction phase, before the allocations occurred, so the extraction logic didn't know where the mesh vertex data was going to end up. The solution is to move the `MeshInputUniform` creation (the `collect_meshes_for_gpu_building` system) to after the allocations phase. This should be better for parallelism anyhow, because it allows the extraction phase to finish quicker. It's also something we'll have to do for bindless in any event. 2. The `lines` and `fog_volumes` examples could fail because their custom drawing nodes weren't updated to supply the vertex and index offsets in their `draw_indexed` and `draw` calls. This commit fixes this oversight. Fixes bevyengine#14366.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM assuming CI is fixed
This is currently slated for 0.15 (in the issue), but should it be included in 0.14.1 as well? |
No version of 0.14 includes uberbuffers, right? This fix is specific to uberbuffers. |
Yup, 0.15 is right, uberbuffers will not be included in a point release of 0.14 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good. Nice that we got a potential performance improvement fixing this by moving uniform building out of extract.
The "uberbuffers" PR #14257 caused some examples to fail intermittently for different reasons:
morph_targets
could fail because vertex displacements for morph targets are keyed off the vertex index. With buffer packing, the vertex index can vary based on the position in the buffer, which caused the morph targets to be potentially incorrect. The solution is to include the first vertex index with theMeshUniform
(andMeshInputUniform
if GPU preprocessing is in use), so that the shader can calculate the true vertex index before performing the morph operation. This results in wasted space inMeshUniform
, which is unfortunate, but we'll soon be filling in the padding with the ID of the material when bindless textures land, so this had to happen sooner or later anyhow.Including the vertex index in the
MeshInputUniform
caused an ordering problem. TheMeshInputUniform
was created during the extraction phase, before the allocations occurred, so the extraction logic didn't know where the mesh vertex data was going to end up. The solution is to move theMeshInputUniform
creation (thecollect_meshes_for_gpu_building
system) to after the allocations phase. This should be better for parallelism anyhow, because it allows the extraction phase to finish quicker. It's also something we'll have to do for bindless in any event.The
lines
andfog_volumes
examples could fail because their custom drawing nodes weren't updated to supply the vertex and index offsets in theirdraw_indexed
anddraw
calls. This commit fixes this oversight.Fixes #14366.