use core::ops::Range;
use crate::{
api::{impl_deferred_command_buffer_actions, SharedDeferredCommandBufferActions},
*,
};
pub use wgt::{LoadOp, Operations, StoreOp};
#[derive(Debug)]
pub struct RenderPass<'encoder> {
pub(crate) inner: dispatch::DispatchRenderPass,
pub(crate) actions: SharedDeferredCommandBufferActions,
pub(crate) _encoder_guard: PhantomDrop<&'encoder ()>,
}
#[cfg(send_sync)]
static_assertions::assert_impl_all!(RenderPass<'_>: Send, Sync);
crate::cmp::impl_eq_ord_hash_proxy!(RenderPass<'_> => .inner);
impl RenderPass<'_> {
pub fn forget_lifetime(self) -> RenderPass<'static> {
RenderPass {
inner: self.inner,
actions: self.actions,
_encoder_guard: crate::api::PhantomDrop::default(),
}
}
pub fn set_bind_group<'a, BG>(&mut self, index: u32, bind_group: BG, offsets: &[DynamicOffset])
where
Option<&'a BindGroup>: From<BG>,
{
let bg: Option<&'a BindGroup> = bind_group.into();
let bg = bg.map(|bg| &bg.inner);
self.inner.set_bind_group(index, bg, offsets);
}
pub fn set_pipeline(&mut self, pipeline: &RenderPipeline) {
self.inner.set_pipeline(&pipeline.inner);
}
pub fn set_blend_constant(&mut self, color: Color) {
self.inner.set_blend_constant(color);
}
pub fn set_index_buffer(&mut self, buffer_slice: BufferSlice<'_>, index_format: IndexFormat) {
self.inner.set_index_buffer(
&buffer_slice.buffer.inner,
index_format,
buffer_slice.offset,
Some(buffer_slice.size),
);
}
pub fn set_vertex_buffer(&mut self, slot: u32, buffer_slice: BufferSlice<'_>) {
self.inner.set_vertex_buffer(
slot,
&buffer_slice.buffer.inner,
buffer_slice.offset,
Some(buffer_slice.size),
);
}
pub fn set_scissor_rect(&mut self, x: u32, y: u32, width: u32, height: u32) {
self.inner.set_scissor_rect(x, y, width, height);
}
pub fn set_viewport(&mut self, x: f32, y: f32, w: f32, h: f32, min_depth: f32, max_depth: f32) {
self.inner.set_viewport(x, y, w, h, min_depth, max_depth);
}
pub fn set_stencil_reference(&mut self, reference: u32) {
self.inner.set_stencil_reference(reference);
}
pub fn insert_debug_marker(&mut self, label: &str) {
self.inner.insert_debug_marker(label);
}
pub fn push_debug_group(&mut self, label: &str) {
self.inner.push_debug_group(label);
}
pub fn pop_debug_group(&mut self) {
self.inner.pop_debug_group();
}
pub fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>) {
self.inner.draw(vertices, instances);
}
pub fn draw_indexed(&mut self, indices: Range<u32>, base_vertex: i32, instances: Range<u32>) {
self.inner.draw_indexed(indices, base_vertex, instances);
}
pub fn draw_mesh_tasks(&mut self, group_count_x: u32, group_count_y: u32, group_count_z: u32) {
self.inner
.draw_mesh_tasks(group_count_x, group_count_y, group_count_z);
}
pub fn draw_indirect(&mut self, indirect_buffer: &Buffer, indirect_offset: BufferAddress) {
self.inner
.draw_indirect(&indirect_buffer.inner, indirect_offset);
}
pub fn draw_indexed_indirect(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
) {
self.inner
.draw_indexed_indirect(&indirect_buffer.inner, indirect_offset);
}
pub fn draw_mesh_tasks_indirect(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
) {
self.inner
.draw_mesh_tasks_indirect(&indirect_buffer.inner, indirect_offset);
}
impl_deferred_command_buffer_actions!();
pub fn execute_bundles<'a, I: IntoIterator<Item = &'a RenderBundle>>(
&mut self,
render_bundles: I,
) {
let mut render_bundles = render_bundles.into_iter().map(|rb| &rb.inner);
self.inner.execute_bundles(&mut render_bundles);
}
pub fn multi_draw_indirect(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
count: u32,
) {
self.inner
.multi_draw_indirect(&indirect_buffer.inner, indirect_offset, count);
}
pub fn multi_draw_indexed_indirect(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
count: u32,
) {
self.inner
.multi_draw_indexed_indirect(&indirect_buffer.inner, indirect_offset, count);
}
pub fn multi_draw_mesh_tasks_indirect(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
count: u32,
) {
self.inner
.multi_draw_mesh_tasks_indirect(&indirect_buffer.inner, indirect_offset, count);
}
#[cfg(custom)]
pub fn as_custom<T: custom::RenderPassInterface>(&self) -> Option<&T> {
self.inner.as_custom()
}
}
impl RenderPass<'_> {
pub fn multi_draw_indirect_count(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
count_buffer: &Buffer,
count_offset: BufferAddress,
max_count: u32,
) {
self.inner.multi_draw_indirect_count(
&indirect_buffer.inner,
indirect_offset,
&count_buffer.inner,
count_offset,
max_count,
);
}
pub fn multi_draw_indexed_indirect_count(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
count_buffer: &Buffer,
count_offset: BufferAddress,
max_count: u32,
) {
self.inner.multi_draw_indexed_indirect_count(
&indirect_buffer.inner,
indirect_offset,
&count_buffer.inner,
count_offset,
max_count,
);
}
pub fn multi_draw_mesh_tasks_indirect_count(
&mut self,
indirect_buffer: &Buffer,
indirect_offset: BufferAddress,
count_buffer: &Buffer,
count_offset: BufferAddress,
max_count: u32,
) {
self.inner.multi_draw_mesh_tasks_indirect_count(
&indirect_buffer.inner,
indirect_offset,
&count_buffer.inner,
count_offset,
max_count,
);
}
}
impl RenderPass<'_> {
pub fn set_push_constants(&mut self, stages: ShaderStages, offset: u32, data: &[u8]) {
self.inner.set_push_constants(stages, offset, data);
}
}
impl RenderPass<'_> {
pub fn write_timestamp(&mut self, query_set: &QuerySet, query_index: u32) {
self.inner.write_timestamp(&query_set.inner, query_index);
}
}
impl RenderPass<'_> {
pub fn begin_occlusion_query(&mut self, query_index: u32) {
self.inner.begin_occlusion_query(query_index);
}
pub fn end_occlusion_query(&mut self) {
self.inner.end_occlusion_query();
}
}
impl RenderPass<'_> {
pub fn begin_pipeline_statistics_query(&mut self, query_set: &QuerySet, query_index: u32) {
self.inner
.begin_pipeline_statistics_query(&query_set.inner, query_index);
}
pub fn end_pipeline_statistics_query(&mut self) {
self.inner.end_pipeline_statistics_query();
}
}
#[derive(Clone, Debug)]
pub struct RenderPassTimestampWrites<'a> {
pub query_set: &'a QuerySet,
pub beginning_of_pass_write_index: Option<u32>,
pub end_of_pass_write_index: Option<u32>,
}
#[cfg(send_sync)]
static_assertions::assert_impl_all!(RenderPassTimestampWrites<'_>: Send, Sync);
#[derive(Clone, Debug)]
pub struct RenderPassColorAttachment<'tex> {
pub view: &'tex TextureView,
pub depth_slice: Option<u32>,
pub resolve_target: Option<&'tex TextureView>,
pub ops: Operations<Color>,
}
#[cfg(send_sync)]
static_assertions::assert_impl_all!(RenderPassColorAttachment<'_>: Send, Sync);
#[derive(Clone, Debug)]
pub struct RenderPassDepthStencilAttachment<'tex> {
pub view: &'tex TextureView,
pub depth_ops: Option<Operations<f32>>,
pub stencil_ops: Option<Operations<u32>>,
}
#[cfg(send_sync)]
static_assertions::assert_impl_all!(RenderPassDepthStencilAttachment<'_>: Send, Sync);
#[derive(Clone, Debug, Default)]
pub struct RenderPassDescriptor<'a> {
pub label: Label<'a>,
pub color_attachments: &'a [Option<RenderPassColorAttachment<'a>>],
pub depth_stencil_attachment: Option<RenderPassDepthStencilAttachment<'a>>,
pub timestamp_writes: Option<RenderPassTimestampWrites<'a>>,
pub occlusion_query_set: Option<&'a QuerySet>,
}
#[cfg(send_sync)]
static_assertions::assert_impl_all!(RenderPassDescriptor<'_>: Send, Sync);