use crate::descriptors::{ComputePassDesc, RenderPassDesc};
use crate::device::{Device, RayQueryDevice};
use crate::{BlasBuildDesc, GpuError};
use std::ops::Range;
pub trait CommandEncoder<D: Device>: Sized {
type RenderPass<'e>: RenderPassEncoder<D>
where
Self: 'e;
type ComputePass<'e>: ComputePassEncoder<D>
where
Self: 'e;
fn begin_render_pass<'e>(&'e mut self, desc: &RenderPassDesc<'_, D>) -> Self::RenderPass<'e>;
fn begin_compute_pass<'e>(&'e mut self, desc: &ComputePassDesc<'_, D>)
-> Self::ComputePass<'e>;
fn copy_buffer_to_buffer(
&mut self,
src: &D::Buffer,
src_offset: u64,
dst: &D::Buffer,
dst_offset: u64,
size: u64,
);
fn copy_texture_to_buffer(
&mut self,
src: &D::Texture,
origin: (u32, u32),
size: (u32, u32),
bytes_per_row: u32,
destination_offset: u64,
dst: &D::Buffer,
);
fn resolve_query_set(
&mut self,
queries: &D::QuerySet,
range: Range<u32>,
dst: &D::Buffer,
offset: u64,
);
fn build_blas(&mut self, _desc: &BlasBuildDesc<'_, D>) -> Result<(), GpuError> {
Err(GpuError::Capability { name: "ray query" })
}
fn build_tlas(&mut self, _tlas: &D::Tlas) -> Result<(), GpuError> {
Err(GpuError::Capability { name: "ray query" })
}
}
pub trait RayQueryCommandEncoder<D: RayQueryDevice>: CommandEncoder<D> {
fn build_blas(&mut self, desc: &BlasBuildDesc<'_, D>) -> Result<(), GpuError> {
CommandEncoder::build_blas(self, desc)
}
fn build_tlas(&mut self, tlas: &D::Tlas) -> Result<(), GpuError> {
CommandEncoder::build_tlas(self, tlas)
}
}
impl<D, E> RayQueryCommandEncoder<D> for E
where
D: RayQueryDevice,
E: CommandEncoder<D>,
{
}
pub trait RenderPassEncoder<D: Device> {
fn set_pipeline(&mut self, pipeline: &D::Pipeline);
fn set_bind_group(&mut self, index: u32, group: &D::BindGroup, dynamic_offsets: &[u32]);
fn draw(&mut self, vertices: Range<u32>, instances: Range<u32>);
fn draw_indirect(&mut self, args: &D::Buffer, offset: u64);
}
pub trait ComputePassEncoder<D: Device> {
fn set_pipeline(&mut self, pipeline: &D::Pipeline);
fn set_bind_group(&mut self, index: u32, group: &D::BindGroup, dynamic_offsets: &[u32]);
fn dispatch(&mut self, x: u32, y: u32, z: u32);
}