wgpu: Clean up DynamicTransforms, after the merge

This commit is contained in:
Nathan Adams 2024-01-24 00:22:38 +01:00
parent c3423b86f8
commit 3be2efe7cf
3 changed files with 29 additions and 45 deletions

View File

@ -1,54 +1,38 @@
use crate::descriptors::Descriptors; use crate::descriptors::Descriptors;
use crate::Transforms; use crate::Transforms;
use std::marker::PhantomData;
use std::mem; use std::mem;
const ESTIMATED_OBJECTS_PER_CHUNK: u64 = 200; const ESTIMATED_OBJECTS_PER_CHUNK: u64 = 200;
pub struct DynamicTransforms { pub struct DynamicTransforms {
pub transform: Inner<Transforms>,
}
impl DynamicTransforms {
pub fn new(descriptors: &Descriptors) -> Self {
Self {
transform: Inner::new(&descriptors.device, &descriptors.bind_layouts.transforms),
}
}
}
pub struct Inner<T> {
_phantom: PhantomData<T>,
pub buffer: wgpu::Buffer, pub buffer: wgpu::Buffer,
pub bind_group: wgpu::BindGroup, pub bind_group: wgpu::BindGroup,
} }
impl<T> Inner<T> { impl DynamicTransforms {
pub fn new(device: &wgpu::Device, layout: &wgpu::BindGroupLayout) -> Self { pub fn new(descriptors: &Descriptors) -> Self {
let buffer = device.create_buffer(&wgpu::BufferDescriptor { let buffer = descriptors.device.create_buffer(&wgpu::BufferDescriptor {
label: None, label: None,
size: (mem::size_of::<T>() as u64 * ESTIMATED_OBJECTS_PER_CHUNK) size: (mem::size_of::<Transforms>() as u64 * ESTIMATED_OBJECTS_PER_CHUNK)
.min(device.limits().max_uniform_buffer_binding_size as u64) .min(descriptors.limits.max_uniform_buffer_binding_size as u64)
.min(device.limits().max_buffer_size), .min(descriptors.limits.max_buffer_size),
usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false, mapped_at_creation: false,
}); });
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { let bind_group = descriptors
label: None, .device
layout, .create_bind_group(&wgpu::BindGroupDescriptor {
entries: &[wgpu::BindGroupEntry { label: None,
binding: 0, layout: &descriptors.bind_layouts.transforms,
resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { entries: &[wgpu::BindGroupEntry {
buffer: &buffer, binding: 0,
offset: 0, resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding {
size: wgpu::BufferSize::new(mem::size_of::<T>() as u64), buffer: &buffer,
}), offset: 0,
}], size: wgpu::BufferSize::new(mem::size_of::<Transforms>() as u64),
}); }),
Self { }],
_phantom: PhantomData, });
buffer, Self { buffer, bind_group }
bind_group,
}
} }
} }

View File

@ -155,7 +155,7 @@ impl Surface {
staging_belt, staging_belt,
&descriptors.device, &descriptors.device,
draw_encoder, draw_encoder,
&dynamic_transforms.transform.buffer, &dynamic_transforms.buffer,
); );
let mut render_pass = let mut render_pass =
draw_encoder.begin_render_pass(&wgpu::RenderPassDescriptor { draw_encoder.begin_render_pass(&wgpu::RenderPassDescriptor {

View File

@ -187,7 +187,7 @@ impl<'pass, 'frame: 'pass, 'global: 'frame> CommandRenderer<'pass, 'frame, 'glob
self.prep_bitmap(&bind.bind_group, blend_mode, render_stage3d); self.prep_bitmap(&bind.bind_group, blend_mode, render_stage3d);
self.render_pass.set_bind_group( self.render_pass.set_bind_group(
1, 1,
&self.dynamic_transforms.transform.bind_group, &self.dynamic_transforms.bind_group,
&[transform_buffer], &[transform_buffer],
); );
@ -214,7 +214,7 @@ impl<'pass, 'frame: 'pass, 'global: 'frame> CommandRenderer<'pass, 'frame, 'glob
self.render_pass.set_bind_group( self.render_pass.set_bind_group(
1, 1,
&self.dynamic_transforms.transform.bind_group, &self.dynamic_transforms.bind_group,
&[transform_buffer], &[transform_buffer],
); );
@ -264,7 +264,7 @@ impl<'pass, 'frame: 'pass, 'global: 'frame> CommandRenderer<'pass, 'frame, 'glob
} }
self.render_pass.set_bind_group( self.render_pass.set_bind_group(
1, 1,
&self.dynamic_transforms.transform.bind_group, &self.dynamic_transforms.bind_group,
&[transform_buffer], &[transform_buffer],
); );
@ -287,7 +287,7 @@ impl<'pass, 'frame: 'pass, 'global: 'frame> CommandRenderer<'pass, 'frame, 'glob
self.render_pass.set_bind_group( self.render_pass.set_bind_group(
1, 1,
&self.dynamic_transforms.transform.bind_group, &self.dynamic_transforms.bind_group,
&[transform_buffer], &[transform_buffer],
); );
@ -410,7 +410,7 @@ pub fn chunk_blends<'a>(
let mut num_masks = 0; let mut num_masks = 0;
let mut transforms = BufferBuilder::new_for_uniform(&descriptors.limits); let mut transforms = BufferBuilder::new_for_uniform(&descriptors.limits);
transforms.set_buffer_limit(dynamic_transforms.transform.buffer.size()); transforms.set_buffer_limit(dynamic_transforms.buffer.size());
fn add_to_current( fn add_to_current(
result: &mut Vec<Chunk>, result: &mut Vec<Chunk>,
@ -451,7 +451,7 @@ pub fn chunk_blends<'a>(
BufferBuilder::new_for_uniform(&descriptors.limits), BufferBuilder::new_for_uniform(&descriptors.limits),
), ),
)); ));
transforms.set_buffer_limit(dynamic_transforms.transform.buffer.size()); transforms.set_buffer_limit(dynamic_transforms.buffer.size());
let transform_range = transforms let transform_range = transforms
.add(&[transform]) .add(&[transform])
.expect("Buffer must be able to fit a new thing, it was just emptied"); .expect("Buffer must be able to fit a new thing, it was just emptied");
@ -556,7 +556,7 @@ pub fn chunk_blends<'a>(
), ),
)); ));
} }
transforms.set_buffer_limit(dynamic_transforms.transform.buffer.size()); transforms.set_buffer_limit(dynamic_transforms.buffer.size());
let chunk_blend_mode = match blend_type { let chunk_blend_mode = match blend_type {
BlendType::Complex(complex) => ChunkBlendMode::Complex(complex), BlendType::Complex(complex) => ChunkBlendMode::Complex(complex),
BlendType::Shader(shader) => ChunkBlendMode::Shader(shader), BlendType::Shader(shader) => ChunkBlendMode::Shader(shader),