use crate::GpuDevice;
use std::{marker::PhantomData, ops::Range};
use wgpu::{Queue, util::DeviceExt};
pub struct BufferPass<'a> {
pub vertex_buffer: &'a wgpu::Buffer,
pub index_buffer: &'a wgpu::Buffer,
}
pub trait AsBufferPass<'a> {
fn as_buffer_pass(&'a self) -> BufferPass<'a>;
}
#[derive(Default)]
pub struct BufferData {
pub vertexs: Vec<u8>,
pub indexs: Vec<u8>,
}
#[derive(Debug)]
pub struct GpuBuffer<K: BufferLayout> {
pub buffer: wgpu::Buffer,
pub count: usize,
pub len: usize,
pub max: usize,
phantom_data: PhantomData<K>,
}
impl<K: BufferLayout> GpuBuffer<K> {
pub fn new(
gpu_device: &GpuDevice,
contents: &[u8],
usage: wgpu::BufferUsages,
label: Option<&str>,
) -> Self {
Self {
buffer: gpu_device.device().create_buffer_init(
&wgpu::util::BufferInitDescriptor {
label,
contents,
usage,
},
),
count: 0,
len: 0,
max: contents.len(),
phantom_data: PhantomData,
}
}
pub fn write(&self, queue: &Queue, data: &[u8], pos: u64) {
if !data.is_empty() {
queue.write_buffer(&self.buffer, pos, data);
}
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
pub fn buffer_slice(&self, range: Range<u64>) -> wgpu::BufferSlice<'_> {
self.buffer.slice(range)
}
}
pub trait BufferLayout {
fn attributes() -> Vec<wgpu::VertexAttribute>;
fn default_buffer() -> BufferData;
fn stride() -> usize;
fn with_capacity(
vertex_capacity: usize,
index_capacity: usize,
) -> BufferData;
}