Struct re_renderer::context::RenderContext

source ·
pub struct RenderContext {
Show 14 fields pub device: Arc<Device>, pub queue: Arc<Queue>, pub config: RenderContextConfig, pub(crate) global_bindings: GlobalBindings, renderers: RwLock<Renderers>, pub(crate) resolver: RecommendedFileResolver, pub texture_manager_2d: TextureManager2D, pub(crate) cpu_write_gpu_read_belt: Mutex<CpuWriteGpuReadBelt>, pub gpu_readback_belt: Mutex<GpuReadbackBelt>, inflight_queue_submissions: Vec<SubmissionIndex>, pub active_frame: ActiveFrameContext, frame_index_for_uncaptured_errors: Arc<AtomicU64>, top_level_error_tracker: Arc<ErrorTracker>, pub gpu_resources: WgpuResourcePools,
}
Expand description

Any resource involving wgpu rendering which can be re-used across different scenes. I.e. render pipelines, resource pools, etc.

Fields§

§device: Arc<Device>§queue: Arc<Queue>§config: RenderContextConfig§global_bindings: GlobalBindings

Global bindings, always bound to 0 bind group slot zero. Renderer are not allowed to use bind group 0 themselves!

§renderers: RwLock<Renderers>§resolver: RecommendedFileResolver§texture_manager_2d: TextureManager2D§cpu_write_gpu_read_belt: Mutex<CpuWriteGpuReadBelt>§gpu_readback_belt: Mutex<GpuReadbackBelt>§inflight_queue_submissions: Vec<SubmissionIndex>

List of unfinished queue submission via this context.

This is currently only about submissions we do via the global encoder in ActiveFrameContext TODO(andreas): We rely on egui for the “primary” submissions in re_viewer. It would be nice to take full control over all submissions.

§active_frame: ActiveFrameContext§frame_index_for_uncaptured_errors: Arc<AtomicU64>

Frame index used for [wgpu::Device::on_uncaptured_error] callbacks.

Today, when using wgpu-core (== native & webgl) this is equal to the current ActiveFrameContext::frame_index since the content timeline is in sync with the device timeline, meaning everything done on [wgpu::Device] happens right away. On WebGPU however, the content timeline may be arbitrarily behind the device timeline! See https://www.w3.org/TR/webgpu/#programming-model-timelines.

§top_level_error_tracker: Arc<ErrorTracker>

Error tracker used for top_level_error_scope and [wgpu::Device::on_uncaptured_error].

§gpu_resources: WgpuResourcePools

Implementations§

source§

impl RenderContext

source

const CPU_WRITE_GPU_READ_BELT_DEFAULT_CHUNK_SIZE: Option<BufferSize> = _

Chunk size for our cpu->gpu buffer manager.

32MiB chunk size (as big as a for instance a 2048x1024 float4 texture) (it’s tempting to use something smaller on Web, but this may just cause more buffers to be allocated the moment we want to upload a bigger chunk)

source

const GPU_READBACK_BELT_DEFAULT_CHUNK_SIZE: Option<BufferSize> = _

Chunk size for our gpu->cpu buffer manager.

We expect large screenshots to be rare occurrences, so we go with fairly small chunks of just 64 kiB. (this is as much memory as a 128x128 rgba8 texture, or a little bit less than a 64x64 picking target with depth) I.e. screenshots will end up in dedicated chunks.

source

const MAX_NUM_INFLIGHT_QUEUE_SUBMISSIONS: usize = 4usize

Limit maximum number of in flight submissions to this number.

By limiting the number of submissions we have on the queue we ensure that GPU stalls do not cause us to request more and more memory to prepare more and more submissions.

Note that this is only indirectly related to number of buffered frames, since buffered frames/blit strategy are all about the display<->gpu interface, whereas this is about a particular aspect of the cpu<->gpu interface.

Should be somewhere between 1-4, too high and we use up more memory and introduce latency, too low and we may starve the GPU.

source

pub fn new( adapter: &Adapter, device: Arc<Device>, queue: Arc<Queue>, config: RenderContextConfig ) -> Result<Self, RenderContextError>

source

fn poll_device(&mut self)

source

pub fn begin_frame(&mut self)

Call this at the beginning of a new frame.

Updates internal book-keeping, frame allocators and executes delayed events like shader reloading.

source

pub fn before_submit(&mut self)

Call this at the end of a frame but before submitting command buffers (e.g. from crate::view_builder::ViewBuilder)

source

pub fn renderer<R: 'static + Renderer + Send + Sync>( &self ) -> MappedRwLockReadGuard<'_, R>

Gets a renderer with the specified type, initializing it if necessary.

source

pub(crate) fn read_lock_renderers(&self) -> RwLockReadGuard<'_, Renderers>

Read access to renderers.

source

pub fn active_frame_idx(&self) -> u64

Returns the global frame index of the active frame.

source

pub fn device_caps(&self) -> &DeviceCaps

Returns the device’s capabilities.

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<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

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

Convert 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)

Convert &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)

Convert &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
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

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

§

fn to<T>(self) -> T
where Self: Into<T>,

Converts to T by calling Into<T>::into.
§

fn try_to<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Tries to convert to T by calling TryInto<T>::try_into.
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.
§

impl<T> Upcast<T> for T

§

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

§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

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
§

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,