pub enum Fence {
TimelineSemaphore(Semaphore),
FencePool {
last_completed: FenceValue,
active: Vec<(FenceValue, Fence)>,
free: Vec<Fence>,
},
}
Expand description
The Api::Fence
type for vulkan::Api
.
This is an enum
because there are two possible implementations of
wgpu-hal
fences on Vulkan: Vulkan fences, which work on any version of
Vulkan, and Vulkan timeline semaphores, which are easier and cheaper but
require non-1.0 features.
Device::create_fence
returns a TimelineSemaphore
if
VK_KHR_timeline_semaphore
is available and enabled, and a FencePool
otherwise.
Variants§
TimelineSemaphore(Semaphore)
A Vulkan timeline semaphore.
These are simpler to use than Vulkan fences, since timeline semaphores
work exactly the way wpgu_hal::Api::Fence
is specified to work.
FencePool
A collection of Vulkan fences, each associated with a FenceValue
.
The effective FenceValue
of this variant is the greater of
last_completed
and the maximum value associated with a signalled fence
in active
.
Fences are available in all versions of Vulkan, but since they only have
two states, “signaled” and “unsignaled”, we need to use a separate fence
for each queue submission we might want to wait for, and remember which
FenceValue
each one represents.
Fields
last_completed: FenceValue
active: Vec<(FenceValue, Fence)>
The pending fence values have to be ascending.
Implementations§
source§impl Fence
impl Fence
sourcefn check_active(
device: &Device,
last_completed: FenceValue,
active: &[(FenceValue, Fence)],
) -> Result<FenceValue, DeviceError>
fn check_active( device: &Device, last_completed: FenceValue, active: &[(FenceValue, Fence)], ) -> Result<FenceValue, DeviceError>
Return the highest FenceValue
among the signalled fences in active
.
As an optimization, assume that we already know that the fence has
reached last_completed
, and don’t bother checking fences whose values
are less than that: those fences remain in the active
array only
because we haven’t called maintain
yet to clean them up.
sourcefn get_latest(
&self,
device: &Device,
extension: Option<&ExtensionFn<Device>>,
) -> Result<FenceValue, DeviceError>
fn get_latest( &self, device: &Device, extension: Option<&ExtensionFn<Device>>, ) -> Result<FenceValue, DeviceError>
Return the highest signalled FenceValue
for self
.
sourcefn maintain(&mut self, device: &Device) -> Result<(), DeviceError>
fn maintain(&mut self, device: &Device) -> Result<(), DeviceError>
Trim the internal state of this Fence
.
This function has no externally visible effect, but you should call it periodically to keep this fence’s resource consumption under control.
For fences using the FencePool
implementation, this function
recycles fences that have been signaled. If you don’t call this,
Queue::submit
will just keep allocating a new Vulkan fence every
time it’s called.