wgpu_core/command/
allocator.rs1use alloc::{boxed::Box, vec::Vec};
2
3use crate::lock::{rank, Mutex};
4
5pub(crate) struct CommandAllocator {
16 free_encoders: Mutex<Vec<Box<dyn hal::DynCommandEncoder>>>,
17}
18
19impl CommandAllocator {
20 pub(crate) fn new() -> Self {
21 Self {
22 free_encoders: Mutex::new(rank::COMMAND_ALLOCATOR_FREE_ENCODERS, Vec::new()),
23 }
24 }
25
26 pub(crate) fn acquire_encoder(
33 &self,
34 device: &dyn hal::DynDevice,
35 queue: &dyn hal::DynQueue,
36 ) -> Result<Box<dyn hal::DynCommandEncoder>, hal::DeviceError> {
37 let mut free_encoders = self.free_encoders.lock();
38 match free_encoders.pop() {
39 Some(encoder) => Ok(encoder),
40 None => unsafe {
41 let hal_desc = hal::CommandEncoderDescriptor { label: None, queue };
42 device.create_command_encoder(&hal_desc)
43 },
44 }
45 }
46
47 pub(crate) fn release_encoder(&self, encoder: Box<dyn hal::DynCommandEncoder>) {
49 let mut free_encoders = self.free_encoders.lock();
50 free_encoders.push(encoder);
51 }
52}