mod compute;
mod graphics;
mod ray_tracing;
pub use {
self::{compute::*, graphics::*, ray_tracing::*},
crate::{
backend::PipelineLayout,
descriptor::{UpdatedDescriptors, UpdatedPipelineDescriptors},
encode::{Encoder, EncoderCommon},
},
};
use bytemuck::Pod;
use crate::{descriptor::DescriptorSetLayout, shader::ShaderStageFlags, Device, OutOfMemory};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct PushConstant {
pub stages: ShaderStageFlags,
pub offset: u32,
pub size: u32,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct PipelineLayoutInfo {
pub sets: Vec<DescriptorSetLayout>,
pub push_constants: Vec<PushConstant>,
}
pub trait PipelineInputLayout {
fn new(device: &Device) -> Result<Self, OutOfMemory>
where
Self: Sized;
fn raw(&self) -> &PipelineLayout;
fn bind_graphics<D, const N: u32>(
&self,
updated_descriptors: &D,
encoder: &mut EncoderCommon<'_>,
) where
D: UpdatedPipelineDescriptors<Self, N>;
fn bind_compute<D, const N: u32>(
&self,
updated_descriptors: &D,
encoder: &mut EncoderCommon<'_>,
) where
D: UpdatedPipelineDescriptors<Self, N>;
fn bind_ray_tracing<D, const N: u32>(
&self,
updated_descriptors: &D,
encoder: &mut EncoderCommon<'_>,
) where
D: UpdatedPipelineDescriptors<Self, N>;
fn push_constants<P>(&self, push_constants: &P, encoder: &mut EncoderCommon<'_>)
where
P: PipelinePushConstants<Self>;
}
pub trait PipelineInput {
type Layout: PipelineInputLayout;
fn layout(device: &Device) -> Result<Self::Layout, OutOfMemory>;
}
pub trait PipelinePushConstants<P: ?Sized> {
const STAGES: ShaderStageFlags;
const OFFSET: u32;
type Repr: Pod;
fn to_repr(&self) -> Self::Repr;
}