use std::sync::Arc;
use steamengine_renderer::Renderer;
use tracing::*;
use wgpu::Buffer;
use wgpu::BufferUsages;
use wgpu::util::DrawIndexedIndirectArgs;
pub trait SimpleBuffer<'a, T: bytemuck::NoUninit> {
fn new(renderer: Arc<Renderer<'a>>, limit: u64) -> Self;
fn set(&self, index: u64, data: T) {
if index > self.limit() {
error!(
"attempt to nest an entity outside the limits of the buffer, SimpleBuffer Overflow"
);
return;
}
self.renderer()
.update_buffer_entry(self.buffer(), index, data);
}
fn set_all(&self, data: &[T]) {
if data.len() as u64 > self.limit() {
error!(
"attempt to nest an entity outside the limits of the buffer, SimpleBuffer Overflow"
);
return;
}
self.renderer().update_buffer(self.buffer(), data);
}
fn free_entry(&self, index: u64) {
if index > self.limit() {
error!(
"attempt to nest an entity outside the limits of the buffer, SimpleBuffer Overflow"
);
return;
}
let size = std::mem::size_of::<T>() as u64;
let offset = size * index;
let zeros = vec![0u8; size as usize];
self.renderer().queue().write_buffer(self.buffer(), offset, &zeros);
}
fn free(&self) {
let size = std::mem::size_of::<T>();
let zeros = vec![0u8; size * self.limit() as usize];
self.renderer().queue().write_buffer(self.buffer(), 0, &zeros);
}
fn as_entrie(&self) -> wgpu::BindingResource {
self.buffer().as_entire_binding()
}
fn buffer(&self) -> &wgpu::Buffer;
fn renderer(&self) -> Arc<Renderer<'a>>;
fn limit(&self) -> u64;
}
pub struct DrawQueueBuffer<'a> {
buffer: Buffer,
renderer: Arc<Renderer<'a>>,
limit: u64,
}
impl<'a> SimpleBuffer<'a, DrawIndexedIndirectArgs> for DrawQueueBuffer<'a> {
fn new(renderer: Arc<Renderer<'a>>, limit: u64) -> Self {
let lock = renderer.clone();
let buffer = lock.create_buffer(
"Indexed Indirect Buffer",
BufferUsages::INDIRECT | BufferUsages::COPY_DST,
limit * std::mem::size_of::<DrawIndexedIndirectArgs>() as u64,
);
Self {
buffer,
renderer,
limit,
}
}
fn buffer(&self) -> &wgpu::Buffer {
&self.buffer
}
fn renderer(&self) -> Arc<Renderer<'a>> {
self.renderer.clone()
}
fn limit(&self) -> u64 {
self.limit
}
}