1use crate::backend::MkGpuBackend;
4use crate::buffer::{MkDeviceBuffer, MkBufferUsage};
5use crate::memory::MkMemoryType;
6use std::collections::VecDeque;
7
8pub struct MkGpuPool<B: MkGpuBackend> {
10 memory_type: MkMemoryType,
11 buffer_size: usize,
12 usage: MkBufferUsage,
13 free_buffers: VecDeque<B::BufferHandle>,
14 max_buffers: usize,
15}
16
17impl<B: MkGpuBackend> MkGpuPool<B> {
18 pub fn new(
20 memory_type: MkMemoryType,
21 buffer_size: usize,
22 usage: MkBufferUsage,
23 max_buffers: usize,
24 ) -> Self {
25 Self {
26 memory_type,
27 buffer_size,
28 usage,
29 free_buffers: VecDeque::new(),
30 max_buffers,
31 }
32 }
33
34 pub fn acquire(&mut self, backend: &B) -> Result<MkDeviceBuffer<B>, B::Error> {
36 if let Some(handle) = self.free_buffers.pop_front() {
37 Ok(MkDeviceBuffer::new(handle, self.buffer_size, self.usage))
38 } else {
39 let handle = backend.create_buffer(self.buffer_size, self.usage, self.memory_type)?;
40 Ok(MkDeviceBuffer::new(handle, self.buffer_size, self.usage))
41 }
42 }
43
44 pub fn release(&mut self, buffer: MkDeviceBuffer<B>, backend: &B) {
46 if self.free_buffers.len() < self.max_buffers {
47 self.free_buffers.push_back(buffer.handle().clone());
48 } else {
49 backend.destroy_buffer(buffer.handle());
50 }
51 }
52
53 pub fn free_count(&self) -> usize {
55 self.free_buffers.len()
56 }
57
58 pub fn clear(&mut self, backend: &B) {
60 for handle in self.free_buffers.drain(..) {
61 backend.destroy_buffer(&handle);
62 }
63 }
64}