Treat dynamic offset UBOs better
This commit is contained in:
parent
26ddd7820b
commit
b291e7f82e
13
src/gpu.rs
13
src/gpu.rs
|
@ -18,6 +18,7 @@ impl<T: Clone + Pod> GpuVec<T> {
|
||||||
usage: wgpu::BufferUsages,
|
usage: wgpu::BufferUsages,
|
||||||
initial_capacity: usize,
|
initial_capacity: usize,
|
||||||
label: Option<String>,
|
label: Option<String>,
|
||||||
|
uses_dynamic_offsets: bool,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let capacity_bytes = initial_capacity * std::mem::size_of::<T>();
|
let capacity_bytes = initial_capacity * std::mem::size_of::<T>();
|
||||||
let usage = usage | wgpu::BufferUsages::COPY_DST;
|
let usage = usage | wgpu::BufferUsages::COPY_DST;
|
||||||
|
@ -30,10 +31,14 @@ impl<T: Clone + Pod> GpuVec<T> {
|
||||||
|
|
||||||
let data = Vec::with_capacity(initial_capacity);
|
let data = Vec::with_capacity(initial_capacity);
|
||||||
|
|
||||||
let realign = if usage.contains(wgpu::BufferUsages::STORAGE) {
|
let realign = if uses_dynamic_offsets {
|
||||||
Some(device.limits().min_storage_buffer_offset_alignment as usize)
|
if usage.contains(wgpu::BufferUsages::STORAGE) {
|
||||||
} else if usage.contains(wgpu::BufferUsages::UNIFORM) {
|
Some(device.limits().min_storage_buffer_offset_alignment as usize)
|
||||||
Some(device.limits().min_uniform_buffer_offset_alignment as usize)
|
} else if usage.contains(wgpu::BufferUsages::UNIFORM) {
|
||||||
|
Some(device.limits().min_uniform_buffer_offset_alignment as usize)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
|
@ -153,7 +153,7 @@ impl MeshPass {
|
||||||
let example_mesh = mesh_pool.load(example_mesh).unwrap();
|
let example_mesh = mesh_pool.load(example_mesh).unwrap();
|
||||||
|
|
||||||
let mut instances = Vec::new();
|
let mut instances = Vec::new();
|
||||||
let r = 10;
|
let r = 4;
|
||||||
for x in -r..r {
|
for x in -r..r {
|
||||||
for y in -r..r {
|
for y in -r..r {
|
||||||
for z in -r..r {
|
for z in -r..r {
|
||||||
|
@ -318,12 +318,14 @@ impl RenderPass for MeshPass {
|
||||||
Vertex::get_usages(),
|
Vertex::get_usages(),
|
||||||
1024 * 128,
|
1024 * 128,
|
||||||
Some("Skinned Vertices".to_string()),
|
Some("Skinned Vertices".to_string()),
|
||||||
|
false,
|
||||||
),
|
),
|
||||||
skinning_uniforms: GpuVec::new(
|
skinning_uniforms: GpuVec::new(
|
||||||
self.device.clone(),
|
self.device.clone(),
|
||||||
wgpu::BufferUsages::STORAGE,
|
wgpu::BufferUsages::STORAGE,
|
||||||
1024 * 128,
|
1024 * 128,
|
||||||
Some("Skinning Uniforms".to_string()),
|
Some("Skinning Uniforms".to_string()),
|
||||||
|
true,
|
||||||
),
|
),
|
||||||
groups: Default::default(),
|
groups: Default::default(),
|
||||||
}
|
}
|
||||||
|
@ -427,8 +429,6 @@ impl RenderPass for MeshPass {
|
||||||
data.groups.push(group);
|
data.groups.push(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("commands: {:#?}", data.groups);
|
|
||||||
|
|
||||||
data.skinned_vertices.reserve(skinned_cursor);
|
data.skinned_vertices.reserve(skinned_cursor);
|
||||||
data.skinned_vertices.write(&queue);
|
data.skinned_vertices.write(&queue);
|
||||||
data.skinning_uniforms.write(&queue);
|
data.skinning_uniforms.write(&queue);
|
||||||
|
|
Loading…
Reference in New Issue