pub struct PipelineCache { /* private fields */ }unstable-wgpu-27 only.Expand description
Handle to a pipeline cache, which is used to accelerate
creating RenderPipelines and ComputePipelines
in subsequent executions
This reuse is only applicable for the same or similar devices.
See util::pipeline_cache_key for some details and a suggested workflow.
Created using Device::create_pipeline_cache.
§Background
In most GPU drivers, shader code must be converted into a machine code which can be executed on the GPU. Generating this machine code can require a lot of computation. Pipeline caches allow this computation to be reused between executions of the program. This can be very useful for reducing program startup time.
Note that most desktop GPU drivers will manage their own caches, meaning that little advantage can be gained from this on those platforms. However, on some platforms, especially Android, drivers leave this to the application to implement.
Unfortunately, drivers do not expose whether they manage their own caches. Some reasonable policies for applications to use are:
- Manage their own pipeline cache on all platforms
- Only manage pipeline caches on Android
§Usage
This is used as RenderPipelineDescriptor::cache or ComputePipelineDescriptor::cache.
It is valid to use this resource when creating multiple pipelines, in
which case it will likely cache each of those pipelines.
It is also valid to create a new cache for each pipeline.
This resource is most useful when the data produced from it (using
PipelineCache::get_data) is persisted.
Care should be taken that pipeline caches are only used for the same device,
as pipeline caches from compatible devices are unlikely to provide any advantage.
util::pipeline_cache_key can be used as a file/directory name to help ensure that.
It is recommended to store pipeline caches atomically. If persisting to disk, this can usually be achieved by creating a temporary file, then moving/renaming the temporary file over the existing cache
§Storage Usage
There is not currently an API available to reduce the size of a cache. This is due to limitations in the underlying graphics APIs used. This is especially impactful if your application is being updated, so previous caches are no longer being used.
One option to work around this is to regenerate the cache. That is, creating the pipelines which your program runs using with the stored cached data, then recreating the same pipelines using a new cache, which your application then store.
§Implementations
This resource currently only works on the following backends:
- Vulkan
This type is unique to the Rust API of wgpu.
Implementations§
Source§impl PipelineCache
impl PipelineCache
Sourcepub fn get_data(&self) -> Option<Vec<u8>>
pub fn get_data(&self) -> Option<Vec<u8>>
Get the data associated with this pipeline cache.
The data format is an implementation detail of wgpu.
The only defined operation on this data setting it as the data field
on PipelineCacheDescriptor, then to Device::create_pipeline_cache.
This function is unique to the Rust API of wgpu.
Trait Implementations§
Source§impl Clone for PipelineCache
impl Clone for PipelineCache
Source§fn clone(&self) -> PipelineCache
fn clone(&self) -> PipelineCache
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PipelineCache
impl Debug for PipelineCache
Source§impl Hash for PipelineCache
impl Hash for PipelineCache
Source§impl Ord for PipelineCache
impl Ord for PipelineCache
Source§fn cmp(&self, other: &PipelineCache) -> Ordering
fn cmp(&self, other: &PipelineCache) -> Ordering
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialEq for PipelineCache
impl PartialEq for PipelineCache
Source§impl PartialOrd for PipelineCache
impl PartialOrd for PipelineCache
impl Eq for PipelineCache
Auto Trait Implementations§
impl Freeze for PipelineCache
impl !RefUnwindSafe for PipelineCache
impl Send for PipelineCache
impl Sync for PipelineCache
impl Unpin for PipelineCache
impl !UnwindSafe for PipelineCache
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.