use wgt::{BufferAddress, BufferSize, Color};
use super::{DrawCommandFamily, Rect};
#[cfg(feature = "serde")]
use crate::command::serde_object_reference_struct;
use crate::command::{ArcReferences, ReferenceType};
#[cfg(feature = "serde")]
use macro_rules_attribute::apply;
#[doc(hidden)]
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", apply(serde_object_reference_struct))]
pub enum RenderCommand<R: ReferenceType> {
SetBindGroup {
index: u32,
num_dynamic_offsets: usize,
bind_group: Option<R::BindGroup>,
},
SetPipeline(R::RenderPipeline),
SetIndexBuffer {
buffer: R::Buffer,
index_format: wgt::IndexFormat,
offset: BufferAddress,
size: Option<BufferSize>,
},
SetVertexBuffer {
slot: u32,
buffer: R::Buffer,
offset: BufferAddress,
size: Option<BufferSize>,
},
SetBlendConstant(Color),
SetStencilReference(u32),
SetViewport {
rect: Rect<f32>,
depth_min: f32,
depth_max: f32,
},
SetScissor(Rect<u32>),
SetImmediate {
offset: u32,
size_bytes: u32,
values_offset: Option<u32>,
},
Draw {
vertex_count: u32,
instance_count: u32,
first_vertex: u32,
first_instance: u32,
},
DrawIndexed {
index_count: u32,
instance_count: u32,
first_index: u32,
base_vertex: i32,
first_instance: u32,
},
DrawMeshTasks {
group_count_x: u32,
group_count_y: u32,
group_count_z: u32,
},
DrawIndirect {
buffer: R::Buffer,
offset: BufferAddress,
count: u32,
family: DrawCommandFamily,
vertex_or_index_limit: Option<u64>,
instance_limit: Option<u64>,
},
MultiDrawIndirectCount {
buffer: R::Buffer,
offset: BufferAddress,
count_buffer: R::Buffer,
count_buffer_offset: BufferAddress,
max_count: u32,
family: DrawCommandFamily,
},
PushDebugGroup {
color: u32,
len: usize,
},
PopDebugGroup,
InsertDebugMarker {
color: u32,
len: usize,
},
WriteTimestamp {
query_set: R::QuerySet,
query_index: u32,
},
BeginOcclusionQuery {
query_index: u32,
},
EndOcclusionQuery,
BeginPipelineStatisticsQuery {
query_set: R::QuerySet,
query_index: u32,
},
EndPipelineStatisticsQuery,
ExecuteBundle(R::RenderBundle),
}
pub type ArcRenderCommand = RenderCommand<ArcReferences>;