mod clear;
mod structs;
use std::any::Any;
use std::borrow::Borrow;
use std::fmt;
use std::ops::Range;
use crate::image::{Filter, Layout, SubresourceRange};
use crate::memory::{Barrier, Dependencies};
use crate::{buffer, pass, pso, query};
use crate::{
Backend,
DrawCount,
IndexCount,
InstanceCount,
VertexCount,
VertexOffset,
WorkGroupCount,
};
pub use self::clear::*;
pub use self::structs::*;
pub type DescriptorSetOffset = u32;
bitflags! {
#[derive(Default)]
pub struct CommandBufferFlags: u32 {
const EMPTY = 0x0;
const ONE_TIME_SUBMIT = 0x1;
const RENDER_PASS_CONTINUE = 0x2;
const SIMULTANEOUS_USE = 0x4;
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Level {
Primary,
Secondary,
}
#[derive(Debug)]
pub enum SubpassContents {
Inline,
SecondaryBuffers,
}
#[allow(missing_docs)]
#[derive(Debug)]
pub struct CommandBufferInheritanceInfo<'a, B: Backend> {
pub subpass: Option<pass::Subpass<'a, B>>,
pub framebuffer: Option<&'a B::Framebuffer>,
pub occlusion_query_enable: bool,
pub occlusion_query_flags: query::ControlFlags,
pub pipeline_statistics: query::PipelineStatistic,
}
impl<'a, B: Backend> Default for CommandBufferInheritanceInfo<'a, B> {
fn default() -> Self {
CommandBufferInheritanceInfo {
subpass: None,
framebuffer: None,
occlusion_query_enable: false,
occlusion_query_flags: query::ControlFlags::empty(),
pipeline_statistics: query::PipelineStatistic::empty(),
}
}
}
pub trait CommandBuffer<B: Backend>: fmt::Debug + Any + Send + Sync {
unsafe fn begin(
&mut self,
flags: CommandBufferFlags,
inheritance_info: CommandBufferInheritanceInfo<B>,
);
unsafe fn begin_primary(&mut self, flags: CommandBufferFlags) {
self.begin(flags, CommandBufferInheritanceInfo::default());
}
unsafe fn finish(&mut self);
unsafe fn reset(&mut self, release_resources: bool);
unsafe fn pipeline_barrier<'a, T>(
&mut self,
stages: Range<pso::PipelineStage>,
dependencies: Dependencies,
barriers: T,
) where
T: IntoIterator,
T::Item: Borrow<Barrier<'a, B>>;
unsafe fn fill_buffer(&mut self, buffer: &B::Buffer, range: buffer::SubRange, data: u32);
unsafe fn update_buffer(&mut self, buffer: &B::Buffer, offset: buffer::Offset, data: &[u8]);
unsafe fn clear_image<T>(
&mut self,
image: &B::Image,
layout: Layout,
value: ClearValue,
subresource_ranges: T,
) where
T: IntoIterator,
T::Item: Borrow<SubresourceRange>;
unsafe fn clear_attachments<T, U>(&mut self, clears: T, rects: U)
where
T: IntoIterator,
T::Item: Borrow<AttachmentClear>,
U: IntoIterator,
U::Item: Borrow<pso::ClearRect>;
unsafe fn resolve_image<T>(
&mut self,
src: &B::Image,
src_layout: Layout,
dst: &B::Image,
dst_layout: Layout,
regions: T,
) where
T: IntoIterator,
T::Item: Borrow<ImageResolve>;
unsafe fn blit_image<T>(
&mut self,
src: &B::Image,
src_layout: Layout,
dst: &B::Image,
dst_layout: Layout,
filter: Filter,
regions: T,
) where
T: IntoIterator,
T::Item: Borrow<ImageBlit>;
unsafe fn bind_index_buffer(&mut self, view: buffer::IndexBufferView<B>);
unsafe fn bind_vertex_buffers<I, T>(&mut self, first_binding: pso::BufferIndex, buffers: I)
where
I: IntoIterator<Item = (T, buffer::SubRange)>,
T: Borrow<B::Buffer>;
unsafe fn set_viewports<T>(&mut self, first_viewport: u32, viewports: T)
where
T: IntoIterator,
T::Item: Borrow<pso::Viewport>;
unsafe fn set_scissors<T>(&mut self, first_scissor: u32, rects: T)
where
T: IntoIterator,
T::Item: Borrow<pso::Rect>;
unsafe fn set_stencil_reference(&mut self, faces: pso::Face, value: pso::StencilValue);
unsafe fn set_stencil_read_mask(&mut self, faces: pso::Face, value: pso::StencilValue);
unsafe fn set_stencil_write_mask(&mut self, faces: pso::Face, value: pso::StencilValue);
unsafe fn set_blend_constants(&mut self, color: pso::ColorValue);
unsafe fn set_depth_bounds(&mut self, bounds: Range<f32>);
unsafe fn set_line_width(&mut self, width: f32);
unsafe fn set_depth_bias(&mut self, depth_bias: pso::DepthBias);
unsafe fn begin_render_pass<T>(
&mut self,
render_pass: &B::RenderPass,
framebuffer: &B::Framebuffer,
render_area: pso::Rect,
clear_values: T,
first_subpass: SubpassContents,
) where
T: IntoIterator,
T::Item: Borrow<ClearValue>;
unsafe fn next_subpass(&mut self, contents: SubpassContents);
unsafe fn end_render_pass(&mut self);
unsafe fn bind_graphics_pipeline(&mut self, pipeline: &B::GraphicsPipeline);
unsafe fn bind_graphics_descriptor_sets<I, J>(
&mut self,
layout: &B::PipelineLayout,
first_set: usize,
sets: I,
offsets: J,
) where
I: IntoIterator,
I::Item: Borrow<B::DescriptorSet>,
J: IntoIterator,
J::Item: Borrow<DescriptorSetOffset>;
unsafe fn bind_compute_pipeline(&mut self, pipeline: &B::ComputePipeline);
unsafe fn bind_compute_descriptor_sets<I, J>(
&mut self,
layout: &B::PipelineLayout,
first_set: usize,
sets: I,
offsets: J,
) where
I: IntoIterator,
I::Item: Borrow<B::DescriptorSet>,
J: IntoIterator,
J::Item: Borrow<DescriptorSetOffset>;
unsafe fn dispatch(&mut self, count: WorkGroupCount);
unsafe fn dispatch_indirect(&mut self, buffer: &B::Buffer, offset: buffer::Offset);
unsafe fn copy_buffer<T>(&mut self, src: &B::Buffer, dst: &B::Buffer, regions: T)
where
T: IntoIterator,
T::Item: Borrow<BufferCopy>;
unsafe fn copy_image<T>(
&mut self,
src: &B::Image,
src_layout: Layout,
dst: &B::Image,
dst_layout: Layout,
regions: T,
) where
T: IntoIterator,
T::Item: Borrow<ImageCopy>;
unsafe fn copy_buffer_to_image<T>(
&mut self,
src: &B::Buffer,
dst: &B::Image,
dst_layout: Layout,
regions: T,
) where
T: IntoIterator,
T::Item: Borrow<BufferImageCopy>;
unsafe fn copy_image_to_buffer<T>(
&mut self,
src: &B::Image,
src_layout: Layout,
dst: &B::Buffer,
regions: T,
) where
T: IntoIterator,
T::Item: Borrow<BufferImageCopy>;
unsafe fn draw(&mut self, vertices: Range<VertexCount>, instances: Range<InstanceCount>);
unsafe fn draw_indexed(
&mut self,
indices: Range<IndexCount>,
base_vertex: VertexOffset,
instances: Range<InstanceCount>,
);
unsafe fn draw_indirect(
&mut self,
buffer: &B::Buffer,
offset: buffer::Offset,
draw_count: DrawCount,
stride: u32,
);
unsafe fn draw_indexed_indirect(
&mut self,
buffer: &B::Buffer,
offset: buffer::Offset,
draw_count: DrawCount,
stride: u32,
);
unsafe fn draw_indirect_count(
&mut self,
_buffer: &B::Buffer,
_offset: buffer::Offset,
_count_buffer: &B::Buffer,
_count_buffer_offset: buffer::Offset,
_max_draw_count: u32,
_stride: u32
) {
unimplemented!("Backend doesn't support draw_indirect_count");
}
unsafe fn draw_indexed_indirect_count(
&mut self,
_buffer: &B::Buffer,
_offset: buffer::Offset,
_count_buffer: &B::Buffer,
_count_buffer_offset: buffer::Offset,
_max_draw_count: u32,
_stride: u32
) {
unimplemented!("Backend doesn't support draw_indexed_indirect_count");
}
unsafe fn set_event(&mut self, event: &B::Event, stages: pso::PipelineStage);
unsafe fn reset_event(&mut self, event: &B::Event, stages: pso::PipelineStage);
unsafe fn wait_events<'a, I, J>(
&mut self,
events: I,
stages: Range<pso::PipelineStage>,
barriers: J,
) where
I: IntoIterator,
I::Item: Borrow<B::Event>,
J: IntoIterator,
J::Item: Borrow<Barrier<'a, B>>;
unsafe fn begin_query(&mut self, query: query::Query<B>, flags: query::ControlFlags);
unsafe fn end_query(&mut self, query: query::Query<B>);
unsafe fn reset_query_pool(&mut self, pool: &B::QueryPool, queries: Range<query::Id>);
unsafe fn copy_query_pool_results(
&mut self,
pool: &B::QueryPool,
queries: Range<query::Id>,
buffer: &B::Buffer,
offset: buffer::Offset,
stride: buffer::Offset,
flags: query::ResultFlags,
);
unsafe fn write_timestamp(&mut self, stage: pso::PipelineStage, query: query::Query<B>);
unsafe fn push_graphics_constants(
&mut self,
layout: &B::PipelineLayout,
stages: pso::ShaderStageFlags,
offset: u32,
constants: &[u32],
);
unsafe fn push_compute_constants(
&mut self,
layout: &B::PipelineLayout,
offset: u32,
constants: &[u32],
);
unsafe fn execute_commands<'a, T, I>(&mut self, cmd_buffers: I)
where
T: 'a + Borrow<B::CommandBuffer>,
I: IntoIterator<Item = &'a T>;
unsafe fn insert_debug_marker(&mut self, name: &str, color: u32);
unsafe fn begin_debug_marker(&mut self, name: &str, color: u32);
unsafe fn end_debug_marker(&mut self);
}