Add uninitialised buffer support to builder
Also uses this support in brickmap
This commit is contained in:
parent
6706d58016
commit
a5ec013001
|
@ -5,13 +5,17 @@ use super::Context;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct BulkBufferBuilder<'a> {
|
pub struct BulkBufferBuilder<'a> {
|
||||||
descriptors: Vec<wgpu::util::BufferInitDescriptor<'a>>,
|
order: Vec<(bool, usize)>,
|
||||||
|
init_descriptors: Vec<wgpu::util::BufferInitDescriptor<'a>>,
|
||||||
|
descriptors: Vec<wgpu::BufferDescriptor<'a>>,
|
||||||
current_usage: wgpu::BufferUsages,
|
current_usage: wgpu::BufferUsages,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> BulkBufferBuilder<'a> {
|
impl<'a> BulkBufferBuilder<'a> {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
order: vec![],
|
||||||
|
init_descriptors: vec![],
|
||||||
descriptors: vec![],
|
descriptors: vec![],
|
||||||
current_usage: wgpu::BufferUsages::UNIFORM,
|
current_usage: wgpu::BufferUsages::UNIFORM,
|
||||||
}
|
}
|
||||||
|
@ -22,26 +26,48 @@ impl<'a> BulkBufferBuilder<'a> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_buffer(mut self, label: &'a str, contents: &'a [u8]) -> Self {
|
pub fn with_buffer(mut self, label: &'a str, size: u64, mapped: bool) -> Self {
|
||||||
|
let descriptor = wgpu::BufferDescriptor {
|
||||||
|
label: Some(label),
|
||||||
|
size,
|
||||||
|
usage: self.current_usage,
|
||||||
|
mapped_at_creation: mapped,
|
||||||
|
};
|
||||||
|
|
||||||
|
self.order.push((false, self.descriptors.len()));
|
||||||
|
self.descriptors.push(descriptor);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_init_buffer(mut self, label: &'a str, contents: &'a [u8]) -> Self {
|
||||||
let descriptor = wgpu::util::BufferInitDescriptor {
|
let descriptor = wgpu::util::BufferInitDescriptor {
|
||||||
label: Some(label),
|
label: Some(label),
|
||||||
contents,
|
contents,
|
||||||
usage: self.current_usage,
|
usage: self.current_usage,
|
||||||
};
|
};
|
||||||
|
|
||||||
self.descriptors.push(descriptor);
|
self.order.push((true, self.init_descriptors.len()));
|
||||||
|
self.init_descriptors.push(descriptor);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_bytemuck_buffer<A: NoUninit>(self, label: &'a str, contents: &'a [A]) -> Self {
|
pub fn with_init_buffer_bm<A: NoUninit>(self, label: &'a str, contents: &'a [A]) -> Self {
|
||||||
self.with_buffer(label, bytemuck::cast_slice(contents))
|
self.with_init_buffer(label, bytemuck::cast_slice(contents))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build(self, context: &Context) -> Vec<wgpu::Buffer> {
|
pub fn build(self, context: &Context) -> Vec<wgpu::Buffer> {
|
||||||
|
let device = &context.device;
|
||||||
let mut buffers = vec![];
|
let mut buffers = vec![];
|
||||||
for descriptor in self.descriptors {
|
for (init, index) in self.order {
|
||||||
buffers.push(context.device.create_buffer_init(&descriptor));
|
let buffer = if init {
|
||||||
|
device.create_buffer_init(&(self.init_descriptors[index]))
|
||||||
|
} else {
|
||||||
|
device.create_buffer(&(self.descriptors[index]))
|
||||||
|
};
|
||||||
|
|
||||||
|
buffers.push(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
buffers
|
buffers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,12 +92,6 @@ impl BrickmapManager {
|
||||||
let mut feedback_data = vec![0u32; 4 + 4 * max_requested_brickmaps as usize];
|
let mut feedback_data = vec![0u32; 4 + 4 * max_requested_brickmaps as usize];
|
||||||
feedback_data[0] = max_requested_brickmaps;
|
feedback_data[0] = max_requested_brickmaps;
|
||||||
let feedback_data_u8 = bytemuck::cast_slice(&feedback_data);
|
let feedback_data_u8 = bytemuck::cast_slice(&feedback_data);
|
||||||
let feedback_result_buffer = device.create_buffer(&wgpu::BufferDescriptor {
|
|
||||||
label: Some("Feedback Read"),
|
|
||||||
size: feedback_data_u8.len() as u64,
|
|
||||||
usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
|
|
||||||
mapped_at_creation: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut brickgrid_upload_data = vec![0u32; 4 + 4 * max_uploaded_brickmaps as usize];
|
let mut brickgrid_upload_data = vec![0u32; 4 + 4 * max_uploaded_brickmaps as usize];
|
||||||
brickgrid_upload_data[0] = max_uploaded_brickmaps;
|
brickgrid_upload_data[0] = max_uploaded_brickmaps;
|
||||||
|
@ -108,19 +102,21 @@ impl BrickmapManager {
|
||||||
let brickmap_staged = Vec::new();
|
let brickmap_staged = Vec::new();
|
||||||
|
|
||||||
let mut buffers = gfx::BulkBufferBuilder::new()
|
let mut buffers = gfx::BulkBufferBuilder::new()
|
||||||
.with_bytemuck_buffer("Brick World State", &[state_uniform])
|
.with_init_buffer_bm("Brick World State", &[state_uniform])
|
||||||
.set_usage(wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST)
|
.set_usage(wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST)
|
||||||
.with_bytemuck_buffer("Brickgrid", &brickgrid)
|
.with_init_buffer_bm("Brickgrid", &brickgrid)
|
||||||
.with_bytemuck_buffer("Brickmap Cache", &brickmap_cache)
|
.with_init_buffer_bm("Brickmap Cache", &brickmap_cache)
|
||||||
.with_bytemuck_buffer("Shading Table", &shading_table)
|
.with_init_buffer_bm("Shading Table", &shading_table)
|
||||||
.with_bytemuck_buffer("Brickgrid Unpack", &brickgrid_upload_data)
|
.with_init_buffer_bm("Brickgrid Unpack", &brickgrid_upload_data)
|
||||||
.with_bytemuck_buffer("Brickmap Unpack", &brickmap_upload_data)
|
.with_init_buffer_bm("Brickmap Unpack", &brickmap_upload_data)
|
||||||
.set_usage(
|
.set_usage(
|
||||||
wgpu::BufferUsages::STORAGE
|
wgpu::BufferUsages::STORAGE
|
||||||
| wgpu::BufferUsages::COPY_DST
|
| wgpu::BufferUsages::COPY_DST
|
||||||
| wgpu::BufferUsages::COPY_SRC,
|
| wgpu::BufferUsages::COPY_SRC,
|
||||||
)
|
)
|
||||||
.with_buffer("Feedback", feedback_data_u8)
|
.with_init_buffer("Feedback", feedback_data_u8)
|
||||||
|
.set_usage(wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ)
|
||||||
|
.with_buffer("Feedback Read", feedback_data_u8.len() as u64, false)
|
||||||
.build(context);
|
.build(context);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
|
@ -129,7 +125,6 @@ impl BrickmapManager {
|
||||||
brickmap_cache_map,
|
brickmap_cache_map,
|
||||||
brickmap_cache_idx: 0,
|
brickmap_cache_idx: 0,
|
||||||
shading_table_allocator,
|
shading_table_allocator,
|
||||||
feedback_result_buffer,
|
|
||||||
unpack_max_count: max_uploaded_brickmaps as usize,
|
unpack_max_count: max_uploaded_brickmaps as usize,
|
||||||
brickgrid_staged,
|
brickgrid_staged,
|
||||||
brickmap_staged,
|
brickmap_staged,
|
||||||
|
@ -141,6 +136,7 @@ impl BrickmapManager {
|
||||||
brickgrid_unpack_buffer: buffers.remove(0),
|
brickgrid_unpack_buffer: buffers.remove(0),
|
||||||
brickmap_unpack_buffer: buffers.remove(0),
|
brickmap_unpack_buffer: buffers.remove(0),
|
||||||
feedback_buffer: buffers.remove(0),
|
feedback_buffer: buffers.remove(0),
|
||||||
|
feedback_result_buffer: buffers.remove(0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue