Skip to content

Commit e2d37d3

Browse files
authored
Make output buffer copying optional (#423)
This allows us to more tightly integrate with complex GPU pipelines.
1 parent 6eb0fca commit e2d37d3

4 files changed

Lines changed: 200 additions & 86 deletions

File tree

demos/cli/src/main.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,12 +312,13 @@ fn run3d_wgpu(
312312
let cfg = fidget::wgpu::voxel::RenderConfig { world_to_model };
313313
let mut image = Default::default();
314314
let start = std::time::Instant::now();
315-
let mut buffers = ctx.buffers(image_size)?;
315+
let buffers = ctx.buffers(image_size)?;
316+
let mut out = ctx.image_buffer(&buffers);
316317
let shape = ctx.shape(&shape)?;
317318
let mut compute_pass_time = std::time::Duration::ZERO;
318319
for _ in 0..settings.n {
319-
ctx.submit(&shape, &buffers, &cfg)?;
320-
let img = ctx.map_image(&mut buffers);
320+
ctx.submit(&shape, &buffers, Some(&mut out), &cfg)?;
321+
let img = ctx.map_image(&mut out);
321322
compute_pass_time += img.time().unwrap();
322323
image = img.image();
323324
}

fidget-wgpu/src/lib.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,16 @@ impl BufferItemCount for ImageSize {
114114
}
115115
}
116116

117-
impl<T, B: BufferItemCount, const U: u32> GenericFlexBuffer<T, B, U> {
117+
impl<T, B: BufferItemCount + Copy, const U: u32> GenericFlexBuffer<T, B, U> {
118118
fn new(
119119
device: &wgpu::Device,
120120
name: String,
121121
item_count: B,
122122
) -> Result<Self, BufferSizeError> {
123+
Self::check_size(item_count)?;
123124
let item_count = item_count.item_count();
124125
let size = Self::calculate_buffer_size(item_count);
125126
let usage = wgpu::BufferUsages::from_bits(U).unwrap();
126-
Self::check_size(usage, size)?;
127127
let data = device.create_buffer(&wgpu::BufferDescriptor {
128128
label: Some(name.as_str()),
129129
size,
@@ -155,10 +155,11 @@ impl<T, B: BufferItemCount, const U: u32> GenericFlexBuffer<T, B, U> {
155155
Self::calculate_buffer_size(self.item_count)
156156
}
157157

158-
fn check_size(
159-
usage: wgpu::BufferUsages,
160-
size: u64,
161-
) -> Result<(), BufferSizeError> {
158+
fn check_size(item_count: B) -> Result<(), BufferSizeError> {
159+
let item_count = item_count.item_count();
160+
let size = Self::calculate_buffer_size(item_count);
161+
let usage = wgpu::BufferUsages::from_bits(U).unwrap();
162+
162163
let buf_ty = if usage.contains(wgpu::BufferUsages::STORAGE) {
163164
BufferType::Storage
164165
} else if usage.contains(wgpu::BufferUsages::UNIFORM) {
@@ -180,11 +181,11 @@ impl<T, B: BufferItemCount, const U: u32> GenericFlexBuffer<T, B, U> {
180181
device: &wgpu::Device,
181182
item_count: B,
182183
) -> Result<(), BufferSizeError> {
184+
Self::check_size(item_count)?;
183185
let item_count = item_count.item_count();
184186
if item_count > self.item_capacity() {
185187
let size = Self::calculate_buffer_size(item_count);
186188
let usage = self.data.usage();
187-
Self::check_size(usage, size)?;
188189
self.data = device.create_buffer(&wgpu::BufferDescriptor {
189190
label: Some(self.name.as_str()),
190191
size,

0 commit comments

Comments
 (0)