Use buffer builder in brickmap

This commit is contained in:
Jarrod Doyle 2023-09-08 15:37:46 +01:00
parent 017883e205
commit d2de478096
Signed by: Jayrude
GPG Key ID: 38B57B16E7C0ADF7
1 changed files with 34 additions and 52 deletions

View File

@ -2,7 +2,10 @@ use std::collections::HashSet;
use wgpu::util::DeviceExt; use wgpu::util::DeviceExt;
use crate::{gfx, math}; use crate::{
gfx::{self},
math,
};
#[repr(C)] #[repr(C)]
#[derive(Debug, Default, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] #[derive(Debug, Default, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
@ -78,89 +81,68 @@ impl BrickmapManager {
brickgrid_dims: [brickgrid_dims.x, brickgrid_dims.y, brickgrid_dims.z], brickgrid_dims: [brickgrid_dims.x, brickgrid_dims.y, brickgrid_dims.z],
..Default::default() ..Default::default()
}; };
let state_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Brick World State"),
contents: bytemuck::cast_slice(&[state_uniform]),
usage: wgpu::BufferUsages::UNIFORM,
});
let brickgrid = let brickgrid =
vec![1u32; (brickgrid_dims.x * brickgrid_dims.y * brickgrid_dims.z) as usize]; vec![1u32; (brickgrid_dims.x * brickgrid_dims.y * brickgrid_dims.z) as usize];
let brickgrid_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Brickgrid"),
contents: bytemuck::cast_slice(&brickgrid),
usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
});
let brickmap_cache = vec![Brickmap::default(); brickmap_cache_size]; let brickmap_cache = vec![Brickmap::default(); brickmap_cache_size];
let brickmap_cache_map = vec![None; brickmap_cache.capacity()]; let brickmap_cache_map = vec![None; brickmap_cache.capacity()];
let brickmap_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Brickmap Cache"),
contents: bytemuck::cast_slice(&brickmap_cache),
usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
});
let shading_table_allocator = ShadingTableAllocator::new(4, shading_table_bucket_size); let shading_table_allocator = ShadingTableAllocator::new(4, shading_table_bucket_size);
let shading_table = vec![0u32; shading_table_allocator.total_elements as usize]; let shading_table = vec![0u32; shading_table_allocator.total_elements as usize];
let shading_table_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Shading Table"),
contents: bytemuck::cast_slice(&shading_table),
usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
});
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 contents = bytemuck::cast_slice(&feedback_data); let feedback_data_u8 = bytemuck::cast_slice(&feedback_data);
let feedback_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Feedback"),
contents,
usage: wgpu::BufferUsages::STORAGE
| wgpu::BufferUsages::COPY_DST
| wgpu::BufferUsages::COPY_SRC,
});
let feedback_result_buffer = device.create_buffer(&wgpu::BufferDescriptor { let feedback_result_buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("Feedback Read"), label: Some("Feedback Read"),
size: contents.len() as u64, size: feedback_data_u8.len() as u64,
usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ, usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
mapped_at_creation: false, mapped_at_creation: false,
}); });
let mut feedback_data = vec![0u32; 4 + 4 * max_uploaded_brickmaps as usize]; let mut brickgrid_upload_data = vec![0u32; 4 + 4 * max_uploaded_brickmaps as usize];
feedback_data[0] = max_uploaded_brickmaps; brickgrid_upload_data[0] = max_uploaded_brickmaps;
let brickgrid_staged = HashSet::new(); let brickgrid_staged = HashSet::new();
let brickgrid_unpack_buffer =
device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Brickgrid Unpack"),
contents: bytemuck::cast_slice(&feedback_data),
usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
});
let mut arr = vec![0u32; 4 + 532 * max_uploaded_brickmaps as usize]; let mut brickmap_upload_data = vec![0u32; 4 + 532 * max_uploaded_brickmaps as usize];
arr[0] = max_uploaded_brickmaps; brickmap_upload_data[0] = max_uploaded_brickmaps;
let brickmap_staged = Vec::new(); let brickmap_staged = Vec::new();
let brickmap_unpack_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Brickmap Unpack"), let mut buffers = gfx::BulkBufferBuilder::new()
contents: bytemuck::cast_slice(&arr), .with_bytemuck_buffer("Brick World State", &[state_uniform])
usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST, .with_usage(wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST)
}); .with_bytemuck_buffer("Brickgrid", &brickgrid)
.with_bytemuck_buffer("Brickmap Cache", &brickmap_cache)
.with_bytemuck_buffer("Shading Table", &shading_table)
.with_bytemuck_buffer("Brickgrid Unpack", &brickgrid_upload_data)
.with_bytemuck_buffer("Brickmap Unpack", &brickmap_upload_data)
.with_usage(
wgpu::BufferUsages::STORAGE
| wgpu::BufferUsages::COPY_DST
| wgpu::BufferUsages::COPY_SRC,
)
.with_buffer("Feedback", feedback_data_u8)
.build(context);
Self { Self {
state_uniform, state_uniform,
state_buffer,
brickgrid, brickgrid,
brickgrid_buffer,
brickmap_cache_map, brickmap_cache_map,
brickmap_cache_idx: 0, brickmap_cache_idx: 0,
brickmap_buffer,
shading_table_buffer,
shading_table_allocator, shading_table_allocator,
feedback_buffer,
feedback_result_buffer, feedback_result_buffer,
unpack_max_count: max_uploaded_brickmaps as usize, unpack_max_count: max_uploaded_brickmaps as usize,
brickgrid_staged, brickgrid_staged,
brickgrid_unpack_buffer,
brickmap_staged, brickmap_staged,
brickmap_unpack_buffer,
state_buffer: buffers.remove(0),
brickgrid_buffer: buffers.remove(0),
brickmap_buffer: buffers.remove(0),
shading_table_buffer: buffers.remove(0),
brickgrid_unpack_buffer: buffers.remove(0),
brickmap_unpack_buffer: buffers.remove(0),
feedback_buffer: buffers.remove(0),
} }
} }