Skip to main content

DeviceTier

Enum DeviceTier 

Source
pub enum DeviceTier {
    WebGpu,
    Native,
    WebGl2,
}
Expand description

How much of the WebGPU baseline to ask a device for.

A device is requested with a set of limits, so the tier is what decides how large a device the frame has to work within. Self::WebGpu is the baseline every WebGPU implementation guarantees, and is the default, so a frame asks for no more than it has to and runs wherever the API does. Self::WebGl2 reproduces a WebGL2 device’s shape on hardware that is capable of much more, which is the only way to exercise the paths a browser takes from a machine that has storage buffers and base_vertex; it is Self::WebGpu with downlevel_webgl2_defaults as its floor.

Self::from_env reads the tier from UNLIT3D_DEVICE_TIER, so a test run can pick the tier without recompiling.

Variants§

§

WebGpu

The limits the WebGPU baseline guarantees, lowered where the adapter offers even less. The default.

§

Native

The adapter’s own limits, which on a desktop backend are its full capabilities rather than the baseline’s floor.

§

WebGl2

WebGL2’s limits and capabilities.

Implementations§

Source§

impl DeviceTier

Source

pub const ALL: &'static [DeviceTier]

Every tier, for a caller that has to enumerate them.

Display and FromStr are inverses over exactly these, and a test asserts it, so the set cannot grow without the environment variable learning the new name.

Source

pub fn from_env() -> DeviceTier

The tier named by UNLIT3D_DEVICE_TIER, or Self::WebGpu when it is unset.

The value is parsed by FromStr, so an unrecognized one — a typo like webgl — panics rather than silently selecting the default. Running the wrong tier is the failure this variable exists to prevent: it would pass while exercising none of the paths under test, which is worse than not running.

§Panics

If the variable is set to a value that names no tier.

Source

pub fn limits(self, adapter_limits: &Limits) -> Limits

The limits to request from an adapter whose own limits are adapter_limits.

Self::Native asks for the adapter’s own limits, and so can. Self::WebGpu asks for the baseline’s guaranteed values, which is what keeps the device the frame is recorded against within reach of every implementation — but an adapter may offer less than the baseline, an adapter narrowed to a browser’s WebGL2 most of all, and a request above what the adapter supports is refused outright. Every other limit is therefore lowered to the adapter’s, which leaves a compliant adapter’s request exactly the baseline and lets a weaker one through on its own terms.

Both narrowed tiers keep the adapter’s texture resolution: a tier is a floor, and lowering the texture sizes below what the adapter has would test a device smaller than any browser ships.

Source

pub fn capabilities(self) -> DeviceCapabilities

The capabilities a device of this tier has.

Independent of the adapter: the tier is the set of flags, and a forced tier has to report what the real device of that tier would.

Source

pub fn capabilities_of(self, adapter: &Adapter) -> DeviceCapabilities

The capabilities a device of this tier ends up with.

A narrowed tier is a request, so what it can rely on is the tier’s own capabilities intersected with what the adapter really reports: a forced WebGL2 tier is only as capable as WebGL2, and an adapter that is even more limited is only as capable as itself.

The WebGPU baseline is a floor every implementation claims to meet, so for Self::WebGpu the intersection is whatever the adapter reports — which is also what Self::Native yields, since a tier narrowed by limits does not change the adapter’s flags.

Trait Implementations§

Source§

impl Clone for DeviceTier

Source§

fn clone(&self) -> DeviceTier

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Copy for DeviceTier

Source§

impl Debug for DeviceTier

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Default for DeviceTier

Source§

fn default() -> DeviceTier

Returns the “default value” for a type. Read more
Source§

impl Display for DeviceTier

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Eq for DeviceTier

Source§

impl FromStr for DeviceTier

Source§

fn from_str(name: &str) -> Result<DeviceTier, ()>

Parse a tier name, case-insensitively.

This is the inverse of Display, and the two are written against the same names so a value printed by one is accepted by the other.

Source§

type Err = ()

The associated error which can be returned from parsing.
Source§

impl PartialEq for DeviceTier

Source§

fn eq(&self, other: &DeviceTier) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for DeviceTier

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

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

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

§

impl<T> SerializableAny for T
where T: 'static + Any + Clone + for<'a> Send + Sync,

§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

§

fn simd_from(_simd: S, value: T) -> T

§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

§

fn simd_into(self, simd: S) -> T

Source§

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

Source§

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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

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

Source§

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.
§

impl<T> Upcast<T> for T

§

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

§

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

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

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

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more