Skip to main content

PipelineCache

Struct PipelineCache 

Source
pub struct PipelineCache { /* private fields */ }
Expand description

Single-owner cache of compiled wgpu::ComputePipelines.

Pipelines are stored behind Arcs so that callers can hold them independently of the cache lifetime.

PipelineCache is not Sync on its own. For concurrent access, use the SharedPipelineCache type alias together with new_shared_pipeline_cache.

§Device-lost recovery

After a GPU device-lost event, call PipelineCache::clear before compiling new pipelines; reusing stale pipelines from a previous device causes undefined behaviour in WGPU.

Implementations§

Source§

impl PipelineCache

Source

pub fn new() -> Self

Create an empty pipeline cache.

Source

pub fn get_or_insert_with<F, E>( &mut self, key: PipelineCacheKey, factory: F, ) -> Result<Arc<ComputePipeline>, E>
where F: FnOnce() -> Result<ComputePipeline, E>,

Return the cached pipeline for key, or compile it via factory and cache the result.

factory is invoked only on a cache miss. If factory returns Err(e), the error is propagated and nothing is stored in the cache.

§Errors

Propagates any error returned by factory.

§Examples
use oxigdal_gpu::pipeline_cache::{PipelineCache, PipelineCacheKey};
use oxigdal_gpu::error::GpuResult;

fn build_pipeline(
    cache: &mut PipelineCache,
    device: &wgpu::Device,
    shader_source: &str,
    entry: &str,
) -> GpuResult<std::sync::Arc<wgpu::ComputePipeline>> {
    let key = PipelineCacheKey::new(shader_source, entry, "r-w");
    cache.get_or_insert_with(key, || {
        // expensive compile — called only on miss
        todo!("compile shader and create pipeline")
    })
}
Source

pub fn len(&self) -> usize

Number of cached pipelines.

Source

pub fn is_empty(&self) -> bool

Returns true if no pipelines have been cached yet.

Source

pub fn clear(&mut self)

Evict all cached pipelines.

Must be called after a GPU device-lost event and before building new pipelines on the replacement device.

Source

pub fn evict(&mut self, key: &PipelineCacheKey) -> bool

Evict a single pipeline by key.

Returns true if the key was present (and thus removed), false if it was already absent.

Source

pub fn keys(&self) -> impl Iterator<Item = &PipelineCacheKey>

Returns an iterator over all cached keys in arbitrary order.

Useful for diagnostics or implementing external LRU eviction policies.

Source

pub fn retain<F>(&mut self, predicate: F)
where F: FnMut(&PipelineCacheKey) -> bool,

Retain only the entries for which predicate returns true.

This allows bulk conditional eviction, for example to remove all pipelines belonging to a specific shader entry point.

use oxigdal_gpu::pipeline_cache::{PipelineCache, PipelineCacheKey};

let mut cache = PipelineCache::new();
// … populate cache …
// Evict every "hillshade" pipeline regardless of layout tag.
cache.retain(|key| key.entry_point != "hillshade");

Trait Implementations§

Source§

impl Debug for PipelineCache

Source§

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

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

impl Default for PipelineCache

Source§

fn default() -> PipelineCache

Returns the “default value” for a type. 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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

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

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

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

Source§

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>,

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

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

Source§

impl<T> WasmNotSendSync for T

Source§

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

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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