use crate::backend::{ComputeCommandEncoder, RenderCommandEncoder};
use super::ShaderStages;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum ArgumentKind {
UniformBuffer,
StorageBuffer,
SampledImage,
StorageImage,
Sampler,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct ArgumentLayout {
pub kind: ArgumentKind,
pub size: usize,
pub stages: ShaderStages,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct ArgumentGroupLayout<'a> {
pub arguments: &'a [ArgumentLayout],
}
#[doc(hidden)]
pub trait ArgumentsSealed {}
pub trait Arguments: ArgumentsSealed + 'static {
const LAYOUT: ArgumentGroupLayout<'static>;
fn bind_render(&self, group: u32, encoder: &mut RenderCommandEncoder);
fn bind_compute(&self, group: u32, encoder: &mut ComputeCommandEncoder);
}
pub enum Uniform {}
impl ArgumentsSealed for Uniform {}
pub enum Sampled {}
impl ArgumentsSealed for Sampled {}
pub enum Storage {}
impl ArgumentsSealed for Storage {}
pub enum Automatic {}
impl ArgumentsSealed for Automatic {}
pub trait ArgumentsField<T: ArgumentsSealed>: ArgumentsSealed {
const KIND: ArgumentKind;
const SIZE: usize;
}