mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Dependencies on `std` that still exist: * Locks * `std::error::Error` (waiting for Rust 1.81) * `std::os::raw::c_char` for FFI * `thread_local` and `Backtrace` in `snatch`
53 lines
1.7 KiB
Rust
53 lines
1.7 KiB
Rust
use alloc::{boxed::Box, vec::Vec};
|
|
|
|
use crate::lock::{rank, Mutex};
|
|
|
|
/// A pool of free [`wgpu_hal::CommandEncoder`]s, owned by a `Device`.
|
|
///
|
|
/// Each encoder in this list is in the "closed" state.
|
|
///
|
|
/// Since a raw [`CommandEncoder`][ce] is itself a pool for allocating
|
|
/// raw [`CommandBuffer`][cb]s, this is a pool of pools.
|
|
///
|
|
/// [`wgpu_hal::CommandEncoder`]: hal::CommandEncoder
|
|
/// [ce]: hal::CommandEncoder
|
|
/// [cb]: hal::Api::CommandBuffer
|
|
pub(crate) struct CommandAllocator {
|
|
free_encoders: Mutex<Vec<Box<dyn hal::DynCommandEncoder>>>,
|
|
}
|
|
|
|
impl CommandAllocator {
|
|
pub(crate) fn new() -> Self {
|
|
Self {
|
|
free_encoders: Mutex::new(rank::COMMAND_ALLOCATOR_FREE_ENCODERS, Vec::new()),
|
|
}
|
|
}
|
|
|
|
/// Return a fresh [`wgpu_hal::CommandEncoder`] in the "closed" state.
|
|
///
|
|
/// If we have free encoders in the pool, take one of those. Otherwise,
|
|
/// create a new one on `device`.
|
|
///
|
|
/// [`wgpu_hal::CommandEncoder`]: hal::CommandEncoder
|
|
pub(crate) fn acquire_encoder(
|
|
&self,
|
|
device: &dyn hal::DynDevice,
|
|
queue: &dyn hal::DynQueue,
|
|
) -> Result<Box<dyn hal::DynCommandEncoder>, 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)
|
|
},
|
|
}
|
|
}
|
|
|
|
/// Add `encoder` back to the free pool.
|
|
pub(crate) fn release_encoder(&self, encoder: Box<dyn hal::DynCommandEncoder>) {
|
|
let mut free_encoders = self.free_encoders.lock();
|
|
free_encoders.push(encoder);
|
|
}
|
|
}
|