pub struct RenderSession { /* private fields */ }Expand description
Persistent batch render session. See the module docs in render::RenderSession
for lifetime, thread-affinity, and config-invariance guarantees.
Persistent batch render session. Keeps a Bevy App (and its RenderDevice
plus PSO cache) alive across multiple render() calls, amortizing per-episode
cold-init cost.
§Thread affinity
RenderSession must be created, used, and dropped on the same thread. It
holds a bevy::App which owns GPU resources that are not safe to move
across threads. The !Send + !Sync marker is enforced via
PhantomData<*const ()>.
§Config invariant
The RenderConfig (resolution, lighting, near/far, fov) is fixed at
new(). All render() calls must use requests whose render_config
matches; heterogeneous configs are rejected.
§Phase 1 limitation
Each render() call must contain homogeneous requests (same object_dir
and object_rotation). Heterogeneous calls return
BatchRenderError::InvalidConfig. Hold a single RenderSession and call
render() once per episode to amortize setup across episodes.
Implementations§
Source§impl RenderSession
impl RenderSession
Sourcepub fn new(render_config: &RenderConfig) -> Result<Self, RenderError>
pub fn new(render_config: &RenderConfig) -> Result<Self, RenderError>
Build the App, run plugin finish()/cleanup(), and perform one warmup
update() so Startup systems run and the wgpu device + adapter are
initialized. The first render() call still pays PSO compilation for
the specific mesh/material combination; subsequent calls reuse the cache.
Sourcepub fn render(
&mut self,
requests: &[BatchRenderRequest],
) -> Result<Vec<BatchRenderOutput>, BatchRenderError>
pub fn render( &mut self, requests: &[BatchRenderRequest], ) -> Result<Vec<BatchRenderOutput>, BatchRenderError>
Render a homogeneous batch of viewpoints (same object + rotation + config). Returns outputs in request order.
On BatchRenderError::DeviceLost, the returned error signals that the
wgpu device was lost mid-render. This call produced no output; any
outputs from earlier render() calls on this session are still valid.
Recovery: drop this RenderSession and construct a new one.
Auto Trait Implementations§
impl !Freeze for RenderSession
impl !RefUnwindSafe for RenderSession
impl !Send for RenderSession
impl !Sync for RenderSession
impl Unpin for RenderSession
impl UnsafeUnpin for RenderSession
impl !UnwindSafe for RenderSession
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.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> 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, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
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