Rename buffers module to buffer

... and move `StaticBuffer` to nested `static` module
This commit is contained in:
Héctor Ramón Jiménez 2022-11-03 05:00:35 +01:00
parent 7e22e2d452
commit 99cf98971d
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
7 changed files with 66 additions and 66 deletions

3
wgpu/src/buffer.rs Normal file
View file

@ -0,0 +1,3 @@
//! Utilities for buffer operations.
pub mod dynamic;
pub mod r#static;

View file

@ -3,57 +3,10 @@ use encase::private::WriteInto;
use encase::ShaderType; use encase::ShaderType;
use std::marker::PhantomData; use std::marker::PhantomData;
// Currently supported dynamic buffers.
enum BufferType {
Uniform(encase::DynamicUniformBuffer<Vec<u8>>),
Storage(encase::DynamicStorageBuffer<Vec<u8>>),
}
impl BufferType {
/// Writes the current value to its CPU buffer with proper alignment.
pub(super) fn write<T: ShaderType + WriteInto>(
&mut self,
value: &T,
) -> wgpu::DynamicOffset {
match self {
BufferType::Uniform(buf) => buf
.write(value)
.expect("Error when writing to dynamic uniform buffer.")
as u32,
BufferType::Storage(buf) => buf
.write(value)
.expect("Error when writing to dynamic storage buffer.")
as u32,
}
}
/// Returns bytearray of aligned CPU buffer.
pub(super) fn get_ref(&self) -> &Vec<u8> {
match self {
BufferType::Uniform(buf) => buf.as_ref(),
BufferType::Storage(buf) => buf.as_ref(),
}
}
/// Resets the CPU buffer.
pub(super) fn clear(&mut self) {
match self {
BufferType::Uniform(buf) => {
buf.as_mut().clear();
buf.set_offset(0);
}
BufferType::Storage(buf) => {
buf.as_mut().clear();
buf.set_offset(0);
}
}
}
}
/// A dynamic buffer is any type of buffer which does not have a static offset. /// A dynamic buffer is any type of buffer which does not have a static offset.
pub(crate) struct Buffer<T: ShaderType> { pub(crate) struct Buffer<T: ShaderType> {
offsets: Vec<wgpu::DynamicOffset>, offsets: Vec<wgpu::DynamicOffset>,
cpu: BufferType, cpu: Internal,
gpu: wgpu::Buffer, gpu: wgpu::Buffer,
label: &'static str, label: &'static str,
size: u64, size: u64,
@ -65,7 +18,7 @@ impl<T: ShaderType + WriteInto> Buffer<T> {
pub fn uniform(device: &wgpu::Device, label: &'static str) -> Self { pub fn uniform(device: &wgpu::Device, label: &'static str) -> Self {
Buffer::new( Buffer::new(
device, device,
BufferType::Uniform(encase::DynamicUniformBuffer::new(Vec::new())), Internal::Uniform(encase::DynamicUniformBuffer::new(Vec::new())),
label, label,
wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,
) )
@ -75,7 +28,7 @@ impl<T: ShaderType + WriteInto> Buffer<T> {
pub fn storage(device: &wgpu::Device, label: &'static str) -> Self { pub fn storage(device: &wgpu::Device, label: &'static str) -> Self {
Buffer::new( Buffer::new(
device, device,
BufferType::Storage(encase::DynamicStorageBuffer::new(Vec::new())), Internal::Storage(encase::DynamicStorageBuffer::new(Vec::new())),
label, label,
wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST, wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
) )
@ -83,7 +36,7 @@ impl<T: ShaderType + WriteInto> Buffer<T> {
fn new( fn new(
device: &wgpu::Device, device: &wgpu::Device,
dynamic_buffer_type: BufferType, dynamic_buffer_type: Internal,
label: &'static str, label: &'static str,
usage: wgpu::BufferUsages, usage: wgpu::BufferUsages,
) -> Self { ) -> Self {
@ -135,10 +88,10 @@ impl<T: ShaderType + WriteInto> Buffer<T> {
if self.size < new_size { if self.size < new_size {
let usages = match self.cpu { let usages = match self.cpu {
BufferType::Uniform(_) => { Internal::Uniform(_) => {
wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST
} }
BufferType::Storage(_) => { Internal::Storage(_) => {
wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST
} }
}; };
@ -197,3 +150,50 @@ impl<T: ShaderType + WriteInto> Buffer<T> {
self.cpu.clear(); self.cpu.clear();
} }
} }
// Currently supported dynamic buffers.
enum Internal {
Uniform(encase::DynamicUniformBuffer<Vec<u8>>),
Storage(encase::DynamicStorageBuffer<Vec<u8>>),
}
impl Internal {
/// Writes the current value to its CPU buffer with proper alignment.
pub(super) fn write<T: ShaderType + WriteInto>(
&mut self,
value: &T,
) -> wgpu::DynamicOffset {
match self {
Internal::Uniform(buf) => buf
.write(value)
.expect("Error when writing to dynamic uniform buffer.")
as u32,
Internal::Storage(buf) => buf
.write(value)
.expect("Error when writing to dynamic storage buffer.")
as u32,
}
}
/// Returns bytearray of aligned CPU buffer.
pub(super) fn get_ref(&self) -> &Vec<u8> {
match self {
Internal::Uniform(buf) => buf.as_ref(),
Internal::Storage(buf) => buf.as_ref(),
}
}
/// Resets the CPU buffer.
pub(super) fn clear(&mut self) {
match self {
Internal::Uniform(buf) => {
buf.as_mut().clear();
buf.set_offset(0);
}
Internal::Storage(buf) => {
buf.as_mut().clear();
buf.set_offset(0);
}
}
}
}

View file

@ -1,6 +1,3 @@
//! Utilities for buffer operations.
pub mod dynamic;
use bytemuck::{Pod, Zeroable}; use bytemuck::{Pod, Zeroable};
use std::marker::PhantomData; use std::marker::PhantomData;
use std::mem; use std::mem;
@ -11,7 +8,7 @@ const DEFAULT_STATIC_BUFFER_COUNT: wgpu::BufferAddress = 128;
/// A generic buffer struct useful for items which have no alignment requirements /// A generic buffer struct useful for items which have no alignment requirements
/// (e.g. Vertex, Index buffers) & no dynamic offsets. /// (e.g. Vertex, Index buffers) & no dynamic offsets.
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct StaticBuffer<T> { pub(crate) struct Buffer<T> {
//stored sequentially per mesh iteration; refers to the offset index in the GPU buffer //stored sequentially per mesh iteration; refers to the offset index in the GPU buffer
offsets: Vec<wgpu::BufferAddress>, offsets: Vec<wgpu::BufferAddress>,
label: &'static str, label: &'static str,
@ -21,7 +18,7 @@ pub(crate) struct StaticBuffer<T> {
_data: PhantomData<T>, _data: PhantomData<T>,
} }
impl<T: Pod + Zeroable> StaticBuffer<T> { impl<T: Pod + Zeroable> Buffer<T> {
/// Initialize a new static buffer. /// Initialize a new static buffer.
pub fn new( pub fn new(
device: &wgpu::Device, device: &wgpu::Device,

View file

@ -43,7 +43,7 @@ pub mod triangle;
pub mod window; pub mod window;
mod backend; mod backend;
mod buffers; mod buffer;
mod quad; mod quad;
mod text; mod text;

View file

@ -6,7 +6,7 @@ use std::fmt::Formatter;
use iced_graphics::layer::{mesh, Mesh}; use iced_graphics::layer::{mesh, Mesh};
use iced_graphics::Size; use iced_graphics::Size;
use crate::buffers::StaticBuffer; use crate::buffer::r#static::Buffer;
pub use iced_graphics::triangle::{Mesh2D, Vertex2D}; pub use iced_graphics::triangle::{Mesh2D, Vertex2D};
mod gradient; mod gradient;
@ -17,8 +17,8 @@ mod solid;
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct Pipeline { pub(crate) struct Pipeline {
blit: Option<msaa::Blit>, blit: Option<msaa::Blit>,
vertex_buffer: StaticBuffer<Vertex2D>, vertex_buffer: Buffer<Vertex2D>,
index_buffer: StaticBuffer<u32>, index_buffer: Buffer<u32>,
index_strides: Vec<u32>, index_strides: Vec<u32>,
pipelines: PipelineList, pipelines: PipelineList,
} }
@ -65,12 +65,12 @@ impl Pipeline {
) -> Pipeline { ) -> Pipeline {
Pipeline { Pipeline {
blit: antialiasing.map(|a| msaa::Blit::new(device, format, a)), blit: antialiasing.map(|a| msaa::Blit::new(device, format, a)),
vertex_buffer: StaticBuffer::new( vertex_buffer: Buffer::new(
device, device,
"iced_wgpu::triangle vertex buffer", "iced_wgpu::triangle vertex buffer",
wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST, wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
), ),
index_buffer: StaticBuffer::new( index_buffer: Buffer::new(
device, device,
"iced_wgpu::triangle vertex buffer", "iced_wgpu::triangle vertex buffer",
wgpu::BufferUsages::INDEX | wgpu::BufferUsages::COPY_DST, wgpu::BufferUsages::INDEX | wgpu::BufferUsages::COPY_DST,

View file

@ -1,4 +1,4 @@
use crate::buffers::dynamic; use crate::buffer::dynamic;
use crate::settings; use crate::settings;
use crate::triangle; use crate::triangle;
use encase::ShaderType; use encase::ShaderType;

View file

@ -1,4 +1,4 @@
use crate::buffers::dynamic; use crate::buffer::dynamic;
use crate::triangle; use crate::triangle;
use crate::{settings, Color}; use crate::{settings, Color};
use encase::ShaderType; use encase::ShaderType;