pub struct ExecutionContext<'a> {
pub device: &'a Device,
pub queue: &'a Queue,
pub encoder: &'a mut CommandEncoder,
pub registry: &'a ResourceRegistry,
pub renderer: &'a GpuRenderer,
pub target_view: &'a TextureView,
pub depth_view: &'a TextureView,
pub blur_env_bind_group_a: &'a BindGroup,
pub blur_env_bind_group_b: &'a BindGroup,
pub bloom_env_bind_group_a: &'a BindGroup,
pub bloom_env_bind_group_b: &'a BindGroup,
pub scale_factor: f32,
}Expand description
Context passed to each node during execution.
P1-2 fix: documented the aliasing contract. The struct holds:
- Several
&'ashared references to fields ofGpuRenderer(device, queue, registry, renderer, target_view, depth_view, bind groups) - A single
&'a mut wgpu::CommandEncoder(the only mutable field)
The renderer field is &'a GpuRenderer (immutable), so nodes
cannot call &mut self methods on the renderer during execution.
This is intentional: the renderer is being driven by the outer
frame loop, and allowing a node to mutate the renderer mid-frame
would cause aliasing. The audit flagged the previous implicit
split-borrow pattern as a potential safety risk; the fix is to
document the contract clearly and ensure no path can construct
an ExecutionContext that violates it.
If a future node needs to mutate the renderer (e.g. to record
custom draw calls), it should use the encoder field directly
(which is &mut) and avoid going through the renderer API.
Fields§
§device: &'a Device§queue: &'a Queue§encoder: &'a mut CommandEncoder§registry: &'a ResourceRegistry§renderer: &'a GpuRenderer§target_view: &'a TextureView§depth_view: &'a TextureView§blur_env_bind_group_a: &'a BindGroup§blur_env_bind_group_b: &'a BindGroup§bloom_env_bind_group_a: &'a BindGroup§bloom_env_bind_group_b: &'a BindGroup§scale_factor: f32Implementations§
Source§impl<'a> ExecutionContext<'a>
impl<'a> ExecutionContext<'a>
pub fn begin_render_pass( &mut self, desc: &RenderPassDescriptor<'_>, ) -> RenderPass<'_>
Sourcepub fn get_or_create_bind_group(
&self,
key: (ResourceId, u32, bool),
layout: &BindGroupLayout,
entries: &[BindGroupEntry<'_>],
label: Option<&str>,
) -> BindGroup
pub fn get_or_create_bind_group( &self, key: (ResourceId, u32, bool), layout: &BindGroupLayout, entries: &[BindGroupEntry<'_>], label: Option<&str>, ) -> BindGroup
Get or create a cached bind group for a given resource and mip level. Avoids per-frame GPU allocation when the same bind group is reused across frames.
Auto Trait Implementations§
impl<'a> !RefUnwindSafe for ExecutionContext<'a>
impl<'a> !Send for ExecutionContext<'a>
impl<'a> !Sync for ExecutionContext<'a>
impl<'a> !UnwindSafe for ExecutionContext<'a>
impl<'a> Freeze for ExecutionContext<'a>
impl<'a> Unpin for ExecutionContext<'a>
impl<'a> UnsafeUnpin for ExecutionContext<'a>
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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.Source§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.Source§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.Source§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.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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