Remove capacity fields from all Buffer wrapper types (#8301)

# Objective
While working on #8299, I noticed that we're using a `capacity` field,
even though `wgpu::Buffer` exposes a `size` accessor that does the same
thing.

## Solution
Remove it from all buffer wrappers. Use `wgpu::Buffer::size` instead.
Default to 0 if no buffer has been allocated yet.
This commit is contained in:
James Liu 2023-04-04 13:12:31 -07:00 committed by GitHub
parent 63d89d31ba
commit 21e1893c4f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 16 deletions

View File

@ -33,7 +33,6 @@ pub struct StorageBuffer<T: ShaderType> {
value: T, value: T,
scratch: StorageBufferWrapper<Vec<u8>>, scratch: StorageBufferWrapper<Vec<u8>>,
buffer: Option<Buffer>, buffer: Option<Buffer>,
capacity: usize,
label: Option<String>, label: Option<String>,
changed: bool, changed: bool,
buffer_usage: BufferUsages, buffer_usage: BufferUsages,
@ -45,7 +44,6 @@ impl<T: ShaderType> From<T> for StorageBuffer<T> {
value, value,
scratch: StorageBufferWrapper::new(Vec::new()), scratch: StorageBufferWrapper::new(Vec::new()),
buffer: None, buffer: None,
capacity: 0,
label: None, label: None,
changed: false, changed: false,
buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE, buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE,
@ -59,7 +57,6 @@ impl<T: ShaderType + Default> Default for StorageBuffer<T> {
value: T::default(), value: T::default(),
scratch: StorageBufferWrapper::new(Vec::new()), scratch: StorageBufferWrapper::new(Vec::new()),
buffer: None, buffer: None,
capacity: 0,
label: None, label: None,
changed: false, changed: false,
buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE, buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE,
@ -124,15 +121,15 @@ impl<T: ShaderType + WriteInto> StorageBuffer<T> {
pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) { pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) {
self.scratch.write(&self.value).unwrap(); self.scratch.write(&self.value).unwrap();
let size = self.scratch.as_ref().len(); let capacity = self.buffer.as_deref().map(wgpu::Buffer::size).unwrap_or(0);
let size = self.scratch.as_ref().len() as u64;
if self.capacity < size || self.changed { if capacity < size || self.changed {
self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor {
label: self.label.as_deref(), label: self.label.as_deref(),
usage: self.buffer_usage, usage: self.buffer_usage,
contents: self.scratch.as_ref(), contents: self.scratch.as_ref(),
})); }));
self.capacity = size;
self.changed = false; self.changed = false;
} else if let Some(buffer) = &self.buffer { } else if let Some(buffer) = &self.buffer {
queue.write_buffer(buffer, 0, self.scratch.as_ref()); queue.write_buffer(buffer, 0, self.scratch.as_ref());
@ -164,7 +161,6 @@ impl<T: ShaderType + WriteInto> StorageBuffer<T> {
pub struct DynamicStorageBuffer<T: ShaderType> { pub struct DynamicStorageBuffer<T: ShaderType> {
scratch: DynamicStorageBufferWrapper<Vec<u8>>, scratch: DynamicStorageBufferWrapper<Vec<u8>>,
buffer: Option<Buffer>, buffer: Option<Buffer>,
capacity: usize,
label: Option<String>, label: Option<String>,
changed: bool, changed: bool,
buffer_usage: BufferUsages, buffer_usage: BufferUsages,
@ -176,7 +172,6 @@ impl<T: ShaderType> Default for DynamicStorageBuffer<T> {
Self { Self {
scratch: DynamicStorageBufferWrapper::new(Vec::new()), scratch: DynamicStorageBufferWrapper::new(Vec::new()),
buffer: None, buffer: None,
capacity: 0,
label: None, label: None,
changed: false, changed: false,
buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE, buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE,
@ -236,15 +231,15 @@ impl<T: ShaderType + WriteInto> DynamicStorageBuffer<T> {
#[inline] #[inline]
pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) { pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) {
let size = self.scratch.as_ref().len(); let capacity = self.buffer.as_deref().map(wgpu::Buffer::size).unwrap_or(0);
let size = self.scratch.as_ref().len() as u64;
if self.capacity < size || self.changed { if capacity < size || self.changed {
self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor {
label: self.label.as_deref(), label: self.label.as_deref(),
usage: self.buffer_usage, usage: self.buffer_usage,
contents: self.scratch.as_ref(), contents: self.scratch.as_ref(),
})); }));
self.capacity = size;
self.changed = false; self.changed = false;
} else if let Some(buffer) = &self.buffer { } else if let Some(buffer) = &self.buffer {
queue.write_buffer(buffer, 0, self.scratch.as_ref()); queue.write_buffer(buffer, 0, self.scratch.as_ref());

View File

@ -157,7 +157,6 @@ impl<T: ShaderType + WriteInto> UniformBuffer<T> {
pub struct DynamicUniformBuffer<T: ShaderType> { pub struct DynamicUniformBuffer<T: ShaderType> {
scratch: DynamicUniformBufferWrapper<Vec<u8>>, scratch: DynamicUniformBufferWrapper<Vec<u8>>,
buffer: Option<Buffer>, buffer: Option<Buffer>,
capacity: usize,
label: Option<String>, label: Option<String>,
changed: bool, changed: bool,
buffer_usage: BufferUsages, buffer_usage: BufferUsages,
@ -169,7 +168,6 @@ impl<T: ShaderType> Default for DynamicUniformBuffer<T> {
Self { Self {
scratch: DynamicUniformBufferWrapper::new(Vec::new()), scratch: DynamicUniformBufferWrapper::new(Vec::new()),
buffer: None, buffer: None,
capacity: 0,
label: None, label: None,
changed: false, changed: false,
buffer_usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM, buffer_usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM,
@ -235,15 +233,15 @@ impl<T: ShaderType + WriteInto> DynamicUniformBuffer<T> {
/// allocated does not have enough capacity, a new GPU-side buffer is created. /// allocated does not have enough capacity, a new GPU-side buffer is created.
#[inline] #[inline]
pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) { pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) {
let size = self.scratch.as_ref().len(); let capacity = self.buffer.as_deref().map(wgpu::Buffer::size).unwrap_or(0);
let size = self.scratch.as_ref().len() as u64;
if self.capacity < size || self.changed { if capacity < size || self.changed {
self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor {
label: self.label.as_deref(), label: self.label.as_deref(),
usage: self.buffer_usage, usage: self.buffer_usage,
contents: self.scratch.as_ref(), contents: self.scratch.as_ref(),
})); }));
self.capacity = size;
self.changed = false; self.changed = false;
} else if let Some(buffer) = &self.buffer { } else if let Some(buffer) = &self.buffer {
queue.write_buffer(buffer, 0, self.scratch.as_ref()); queue.write_buffer(buffer, 0, self.scratch.as_ref());