memkit_gpu/
pool.rs

1//! GPU memory pools.
2
3use crate::backend::MkGpuBackend;
4use crate::buffer::{MkDeviceBuffer, MkBufferUsage};
5use crate::memory::MkMemoryType;
6use std::collections::VecDeque;
7
8/// A pool of GPU buffers for efficient reuse.
9pub 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    /// Create a new GPU buffer pool.
19    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    /// Acquire a buffer from the pool or create a new one.
35    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    /// Return a buffer to the pool.
45    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    /// Get the number of free buffers.
54    pub fn free_count(&self) -> usize {
55        self.free_buffers.len()
56    }
57
58    /// Clear all pooled buffers.
59    pub fn clear(&mut self, backend: &B) {
60        for handle in self.free_buffers.drain(..) {
61            backend.destroy_buffer(&handle);
62        }
63    }
64}