use crate::hal_api::HalApi;
use crate::resource_log;
use hal::Device as _;
use crate::lock::{rank, Mutex};
pub(crate) struct CommandAllocator<A: HalApi> {
free_encoders: Mutex<Vec<A::CommandEncoder>>,
}
impl<A: HalApi> CommandAllocator<A> {
pub(crate) fn new() -> Self {
Self {
free_encoders: Mutex::new(rank::COMMAND_ALLOCATOR_FREE_ENCODERS, Vec::new()),
}
}
pub(crate) fn acquire_encoder(
&self,
device: &A::Device,
queue: &A::Queue,
) -> Result<A::CommandEncoder, hal::DeviceError> {
let mut free_encoders = self.free_encoders.lock();
match free_encoders.pop() {
Some(encoder) => Ok(encoder),
None => unsafe {
let hal_desc = hal::CommandEncoderDescriptor { label: None, queue };
device.create_command_encoder(&hal_desc)
},
}
}
pub(crate) fn release_encoder(&self, encoder: A::CommandEncoder) {
let mut free_encoders = self.free_encoders.lock();
free_encoders.push(encoder);
}
pub(crate) fn dispose(&self, device: &A::Device) {
let mut free_encoders = self.free_encoders.lock();
resource_log!("CommandAllocator::dispose encoders {}", free_encoders.len());
for cmd_encoder in free_encoders.drain(..) {
unsafe {
device.destroy_command_encoder(cmd_encoder);
}
}
}
}