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
impl RenderContext
sourceconst CPU_WRITE_GPU_READ_BELT_DEFAULT_CHUNK_SIZE: Option<BufferSize> = _
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)
sourceconst GPU_READBACK_BELT_DEFAULT_CHUNK_SIZE: Option<BufferSize> = _
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.
sourceconst MAX_NUM_INFLIGHT_QUEUE_SUBMISSIONS: usize = 4usize
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.
pub fn new( adapter: &Adapter, device: Arc<Device>, queue: Arc<Queue>, config: RenderContextConfig ) -> Result<Self, RenderContextError>
fn poll_device(&mut self)
sourcepub fn begin_frame(&mut self)
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.
sourcepub fn before_submit(&mut self)
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
)
sourcepub fn renderer<R: 'static + Renderer + Send + Sync>(
&self
) -> MappedRwLockReadGuard<'_, R>
pub fn renderer<R: 'static + Renderer + Send + Sync>( &self ) -> MappedRwLockReadGuard<'_, R>
Gets a renderer with the specified type, initializing it if necessary.
sourcepub(crate) fn read_lock_renderers(&self) -> RwLockReadGuard<'_, Renderers>
pub(crate) fn read_lock_renderers(&self) -> RwLockReadGuard<'_, Renderers>
Read access to renderers.
sourcepub fn active_frame_idx(&self) -> u64
pub fn active_frame_idx(&self) -> u64
Returns the global frame index of the active frame.
sourcepub fn device_caps(&self) -> &DeviceCaps
pub fn device_caps(&self) -> &DeviceCaps
Returns the device’s capabilities.
Auto Trait Implementations§
impl !Freeze for RenderContext
impl !RefUnwindSafe for RenderContext
impl Send for RenderContext
impl Sync for RenderContext
impl Unpin for RenderContext
impl !UnwindSafe for RenderContext
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
§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<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