Struct wgpu_hal::vulkan::RelaySemaphores

source ·
struct RelaySemaphores {
    wait: Option<Semaphore>,
    signal: Semaphore,
}
Expand description

Semaphores for forcing queue submissions to run in order.

The wgpu_hal::Queue trait promises that if two calls to submit are ordered, then the first submission will finish on the GPU before the second submission begins. To get this behavior on Vulkan we need to pass semaphores to vkQueueSubmit for the commands to wait on before beginning execution, and to signal when their execution is done.

Normally this can be done with a single semaphore, waited on and then signalled for each submission. At any given time there’s exactly one submission that would signal the semaphore, and exactly one waiting on it, as Vulkan requires.

However, as of Oct 2021, bug #5508 in the Mesa ANV drivers caused them to hang if we use a single semaphore. The workaround is to alternate between two semaphores. The bug has been fixed in Mesa, but we should probably keep the workaround until, say, Oct 2026.

Fields§

§wait: Option<Semaphore>

The semaphore the next submission should wait on before beginning execution on the GPU. This is None for the first submission, which should not wait on anything at all.

§signal: Semaphore

The semaphore the next submission should signal when it has finished execution on the GPU.

Implementations§

source§

impl RelaySemaphores

source

fn new(device: &DeviceShared) -> Result<Self, DeviceError>

source

fn advance(&mut self, device: &DeviceShared) -> Result<Self, DeviceError>

Advances the semaphores, returning the semaphores that should be used for a submission.

source

unsafe fn destroy(&self, device: &Device)

Destroys the semaphores.

Trait Implementations§

source§

impl Clone for RelaySemaphores

source§

fn clone(&self) -> RelaySemaphores

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> Downcast<T> for T

source§

fn downcast(&self) -> &T

source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> Upcast<T> for T

source§

fn upcast(&self) -> Option<&T>

source§

impl<T> WasmNotSend for T
where T: Send,

source§

impl<T> WasmNotSendSync for T

source§

impl<T> WasmNotSync for T
where T: Sync,