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: FenceValueactive: 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.