Directly copy data into uniform buffers #9865
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Objective
This is a minimally disruptive version of #8340. I attempted to update it, but failed due to the scope of the changes added in #8204.
Fixes #8307. Partially addresses #4642. As seen in #8284, we're actually copying data twice in Prepare stage systems. Once into a CPU-side intermediate scratch buffer, and once again into a mapped buffer. This is inefficient and effectively doubles the time spent and memory allocated to run these systems.
Solution
Skip the scratch buffer entirely and use
wgpu::Queue::write_buffer_with
to directly write data into mapped buffers.Separately, this also directly uses
wgpu::Limits::min_uniform_buffer_offset_alignment
to set up the alignment when writing to the buffers. Partially addressing the issue raised in #4642.Storage buffers and the abstractions built on top of
DynamicUniformBuffer
will need to come in followup PRs.This may not have a noticeable performance difference in this PR, as the only first-party systems affected by this are view related, and likely are not going to be particularly heavy.
Changelog
Added:
DynamicUniformBuffer::get_writer
.Added:
DynamicUniformBufferWriter
.