Skip to content

Commit 87399c3

Browse files
committed
Fix staging buffer required size calculation (fixes #1056) (#1509)
Fix staging buffer required size calculation (fixes #1056) The `required_staging_buffer_size` is currently calculated differently in two places, each will be correct in different situations: * `prepare_staging_buffers()` based on actual `buffer_byte_len()` * `set_required_staging_buffer_size_to_max()` based on item_size In the case of render assets, `prepare_staging_buffers()` would only operate over changed assets. If some of the assets didn't change, their size wouldn't be taken into account for the `required_staging_buffer_size`. In some cases, this meant the buffers wouldn't be resized when they should. Now `prepare_staging_buffers()` is called over all assets, which may hit performance but at least gets the size right. Shortly after `prepare_staging_buffers()`, `set_required_staging_buffer_size_to_max()` would unconditionally overwrite the previously computed value, even if using `item_size` made no sense. Now it only overwrites the value if bigger. This can be considered a short term hack, but should prevent a few hard to debug panics.
1 parent b2d654c commit 87399c3

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

crates/bevy_render/src/render_graph/nodes/render_resources_node.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,9 @@ where
218218
}
219219
}
220220

221-
self.required_staging_buffer_size = new_size;
221+
if new_size > self.required_staging_buffer_size {
222+
self.required_staging_buffer_size = new_size;
223+
}
222224
}
223225

224226
/// Update the staging buffer to provide enough space to copy data to target buffers.
@@ -697,6 +699,12 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
697699

698700
let resized = uniform_buffer_arrays.resize_buffer_arrays(render_resource_context);
699701
if resized {
702+
// full asset copy needed, make sure there is also space for unchanged assets
703+
for (asset_handle, asset) in assets.iter() {
704+
if !changed_assets.contains_key(&asset_handle) {
705+
uniform_buffer_arrays.prepare_uniform_buffers(asset_handle, asset);
706+
}
707+
}
700708
uniform_buffer_arrays.set_required_staging_buffer_size_to_max()
701709
}
702710
uniform_buffer_arrays.resize_staging_buffer(render_resource_context);

0 commit comments

Comments
 (0)