pub struct RenderBundleEncoder<'a> {
pub(crate) context: Arc<dyn DynContext>,
pub(crate) id: ObjectId,
pub(crate) data: Box<dyn Any + Sync + Send>,
pub(crate) parent: &'a Device,
pub(crate) _p: PhantomData<*const u8>,
}
Expand description
Encodes a series of GPU operations into a reusable “render bundle”.
It only supports a handful of render commands, but it makes them reusable.
It can be created with Device::create_render_bundle_encoder
.
It can be executed onto a CommandEncoder
using RenderPass::execute_bundles
.
Executing a RenderBundle
is often more efficient than issuing the underlying commands
manually.
Corresponds to WebGPU GPURenderBundleEncoder
.
Fields§
§context: Arc<dyn DynContext>
§id: ObjectId
§data: Box<dyn Any + Sync + Send>
§parent: &'a Device
§_p: PhantomData<*const u8>
Implementations§
§impl<'a> RenderBundleEncoder<'a>
impl<'a> RenderBundleEncoder<'a>
pub fn finish(self, desc: &RenderBundleDescriptor<Option<&str>>) -> RenderBundle
pub fn finish(self, desc: &RenderBundleDescriptor<Option<&str>>) -> RenderBundle
Finishes recording and returns a RenderBundle
that can be executed in other render passes.
pub fn set_bind_group(
&mut self,
index: u32,
bind_group: &'a BindGroup,
offsets: &[u32]
)
pub fn set_bind_group( &mut self, index: u32, bind_group: &'a BindGroup, offsets: &[u32] )
Sets the active bind group for a given bind group index. The bind group layout
in the active pipeline when any draw()
function is called must match the layout of this bind group.
If the bind group have dynamic offsets, provide them in the binding order.
pub fn set_pipeline(&mut self, pipeline: &'a RenderPipeline)
pub fn set_pipeline(&mut self, pipeline: &'a RenderPipeline)
Sets the active render pipeline.
Subsequent draw calls will exhibit the behavior defined by pipeline
.
pub fn set_index_buffer(
&mut self,
buffer_slice: BufferSlice<'a>,
index_format: IndexFormat
)
pub fn set_index_buffer( &mut self, buffer_slice: BufferSlice<'a>, index_format: IndexFormat )
Sets the active index buffer.
Subsequent calls to draw_indexed
on this RenderBundleEncoder
will
use buffer
as the source index buffer.
pub fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>)
pub fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>)
Assign a vertex buffer to a slot.
Subsequent calls to draw
and draw_indexed
on this
RenderBundleEncoder
will use buffer
as one of the source vertex buffers.
The slot
refers to the index of the matching descriptor in
VertexState::buffers
.
pub fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>)
pub fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>)
Draws primitives from the active vertex buffer(s).
The active vertex buffers can be set with RenderBundleEncoder::set_vertex_buffer
.
Does not use an Index Buffer. If you need this see RenderBundleEncoder::draw_indexed
Panics if vertices Range is outside of the range of the vertices range of any set vertex buffer.
vertices: The range of vertices to draw. instances: Range of Instances to draw. Use 0..1 if instance buffers are not used. E.g.of how its used internally
for instance_id in instance_range {
for vertex_id in vertex_range {
let vertex = vertex[vertex_id];
vertex_shader(vertex, vertex_id, instance_id);
}
}
pub fn draw_indexed(
&mut self,
indices: Range<u32>,
base_vertex: i32,
instances: Range<u32>
)
pub fn draw_indexed( &mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32> )
Draws indexed primitives using the active index buffer and the active vertex buffer(s).
The active index buffer can be set with RenderBundleEncoder::set_index_buffer
.
The active vertex buffer(s) can be set with RenderBundleEncoder::set_vertex_buffer
.
Panics if indices Range is outside of the range of the indices range of any set index buffer.
indices: The range of indices to draw. base_vertex: value added to each index value before indexing into the vertex buffers. instances: Range of Instances to draw. Use 0..1 if instance buffers are not used. E.g.of how its used internally
for instance_id in instance_range {
for index_index in index_range {
let vertex_id = index_buffer[index_index];
let adjusted_vertex_id = vertex_id + base_vertex;
let vertex = vertex[adjusted_vertex_id];
vertex_shader(vertex, adjusted_vertex_id, instance_id);
}
}
pub fn draw_indirect(
&mut self,
indirect_buffer: &'a Buffer,
indirect_offset: u64
)
pub fn draw_indirect( &mut self, indirect_buffer: &'a Buffer, indirect_offset: u64 )
Draws primitives from the active vertex buffer(s) based on the contents of the indirect_buffer
.
The active vertex buffers can be set with RenderBundleEncoder::set_vertex_buffer
.
The structure expected in indirect_buffer
must conform to DrawIndirectArgs
.
pub fn draw_indexed_indirect(
&mut self,
indirect_buffer: &'a Buffer,
indirect_offset: u64
)
pub fn draw_indexed_indirect( &mut self, indirect_buffer: &'a Buffer, indirect_offset: u64 )
Draws indexed primitives using the active index buffer and the active vertex buffers,
based on the contents of the indirect_buffer
.
The active index buffer can be set with RenderBundleEncoder::set_index_buffer
, while the active
vertex buffers can be set with RenderBundleEncoder::set_vertex_buffer
.
The structure expected in indirect_buffer
must conform to DrawIndexedIndirectArgs
.
§impl<'a> RenderBundleEncoder<'a>
impl<'a> RenderBundleEncoder<'a>
Features::PUSH_CONSTANTS
must be enabled on the device in order to call these functions.
pub fn set_push_constants(
&mut self,
stages: ShaderStages,
offset: u32,
data: &[u8]
)
pub fn set_push_constants( &mut self, stages: ShaderStages, offset: u32, data: &[u8] )
Set push constant data.
Offset is measured in bytes, but must be a multiple of PUSH_CONSTANT_ALIGNMENT
.
Data size must be a multiple of 4 and must have an alignment of 4.
For example, with an offset of 4 and an array of [u8; 8]
, that will write to the range
of 4..12.
For each byte in the range of push constant data written, the union of the stages of all push constant
ranges that covers that byte must be exactly stages
. There’s no good way of explaining this simply,
so here are some examples:
For the given ranges:
- 0..4 Vertex
- 4..8 Fragment
You would need to upload this in two set_push_constants calls. First for the Vertex
range, second for the Fragment
range.
For the given ranges:
- 0..8 Vertex
- 4..12 Fragment
You would need to upload this in three set_push_constants calls. First for the Vertex
only range 0..4, second
for the Vertex | Fragment
range 4..8, third for the Fragment
range 8..12.
Trait Implementations§
§impl<'a> Debug for RenderBundleEncoder<'a>
impl<'a> Debug for RenderBundleEncoder<'a>
§impl<'a> RenderEncoder<'a> for RenderBundleEncoder<'a>
impl<'a> RenderEncoder<'a> for RenderBundleEncoder<'a>
§fn set_bind_group(
&mut self,
index: u32,
bind_group: &'a BindGroup,
offsets: &[u32]
)
fn set_bind_group( &mut self, index: u32, bind_group: &'a BindGroup, offsets: &[u32] )
draw()
function is called must match the layout of this bind group. Read more§fn set_pipeline(&mut self, pipeline: &'a RenderPipeline)
fn set_pipeline(&mut self, pipeline: &'a RenderPipeline)
§fn set_index_buffer(
&mut self,
buffer_slice: BufferSlice<'a>,
index_format: IndexFormat
)
fn set_index_buffer( &mut self, buffer_slice: BufferSlice<'a>, index_format: IndexFormat )
§fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>)
fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'a>)
§fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>)
fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>)
§fn draw_indexed(
&mut self,
indices: Range<u32>,
base_vertex: i32,
instances: Range<u32>
)
fn draw_indexed( &mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32> )
§fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: u64)
fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: u64)
indirect_buffer
. Read more§fn draw_indexed_indirect(
&mut self,
indirect_buffer: &'a Buffer,
indirect_offset: u64
)
fn draw_indexed_indirect( &mut self, indirect_buffer: &'a Buffer, indirect_offset: u64 )
indirect_buffer
. Read more§fn set_push_constants(&mut self, stages: ShaderStages, offset: u32, data: &[u8])
fn set_push_constants(&mut self, stages: ShaderStages, offset: u32, data: &[u8])
wgt::Features::PUSH_CONSTANTS
must be enabled on the device in order to call this function. Read moreAuto Trait Implementations§
impl<'a> Freeze for RenderBundleEncoder<'a>
impl<'a> !RefUnwindSafe for RenderBundleEncoder<'a>
impl<'a> !Send for RenderBundleEncoder<'a>
impl<'a> !Sync for RenderBundleEncoder<'a>
impl<'a> Unpin for RenderBundleEncoder<'a>
impl<'a> !UnwindSafe for RenderBundleEncoder<'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
source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
§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> 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 moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request