|
|
|
@ -5,7 +5,7 @@ use vk::descriptor::descriptor::*;
|
|
|
|
|
use vk::descriptor::pipeline_layout::*;
|
|
|
|
|
use crate::reflection::LayoutData;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
|
|
pub struct Entry {
|
|
|
|
|
pub frag_input: FragInput,
|
|
|
|
|
pub frag_output: FragOutput,
|
|
|
|
@ -13,9 +13,10 @@ pub struct Entry {
|
|
|
|
|
pub vert_input: VertInput,
|
|
|
|
|
pub vert_output: VertOutput,
|
|
|
|
|
pub vert_layout: VertLayout,
|
|
|
|
|
pub compute_layout: ComputeLayout,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
|
|
pub struct FragInput {
|
|
|
|
|
pub inputs: Vec<ShaderInterfaceDefEntry>,
|
|
|
|
|
}
|
|
|
|
@ -30,7 +31,7 @@ unsafe impl ShaderInterfaceDef for FragInput {
|
|
|
|
|
|
|
|
|
|
pub type FragInputIter = std::vec::IntoIter<ShaderInterfaceDefEntry>;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
|
|
pub struct FragOutput {
|
|
|
|
|
pub outputs: Vec<ShaderInterfaceDefEntry>,
|
|
|
|
|
}
|
|
|
|
@ -46,11 +47,20 @@ unsafe impl ShaderInterfaceDef for FragOutput {
|
|
|
|
|
pub type FragOutputIter = std::vec::IntoIter<ShaderInterfaceDefEntry>;
|
|
|
|
|
|
|
|
|
|
// Layout same as with vertex shader.
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
|
|
pub struct FragLayout {
|
|
|
|
|
pub stages: ShaderStages,
|
|
|
|
|
pub layout_data: LayoutData,
|
|
|
|
|
}
|
|
|
|
|
impl FragLayout {
|
|
|
|
|
const STAGES: ShaderStages = ShaderStages {
|
|
|
|
|
vertex: false,
|
|
|
|
|
tessellation_control: false,
|
|
|
|
|
tessellation_evaluation: false,
|
|
|
|
|
geometry: false,
|
|
|
|
|
fragment: true,
|
|
|
|
|
compute: false,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
unsafe impl PipelineLayoutDesc for FragLayout {
|
|
|
|
|
fn num_sets(&self) -> usize {
|
|
|
|
|
self.layout_data.num_sets
|
|
|
|
@ -63,7 +73,7 @@ unsafe impl PipelineLayoutDesc for FragLayout {
|
|
|
|
|
.and_then(|s|s.get(&binding))
|
|
|
|
|
.map(|desc| {
|
|
|
|
|
let mut desc = desc.clone();
|
|
|
|
|
desc.stages = self.stages;
|
|
|
|
|
desc.stages = FragLayout::STAGES;
|
|
|
|
|
desc
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
@ -75,14 +85,14 @@ unsafe impl PipelineLayoutDesc for FragLayout {
|
|
|
|
|
self.layout_data.pc_ranges.get(num)
|
|
|
|
|
.map(|desc| {
|
|
|
|
|
let mut desc = *desc;
|
|
|
|
|
desc.stages = self.stages;
|
|
|
|
|
desc.stages = FragLayout::STAGES;
|
|
|
|
|
desc
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
|
|
pub struct VertInput {
|
|
|
|
|
pub inputs: Vec<ShaderInterfaceDefEntry>,
|
|
|
|
|
}
|
|
|
|
@ -97,7 +107,7 @@ unsafe impl ShaderInterfaceDef for VertInput {
|
|
|
|
|
|
|
|
|
|
pub type VertInputIter = std::vec::IntoIter<ShaderInterfaceDefEntry>;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
|
|
pub struct VertOutput {
|
|
|
|
|
pub outputs: Vec<ShaderInterfaceDefEntry>,
|
|
|
|
|
}
|
|
|
|
@ -113,11 +123,20 @@ unsafe impl ShaderInterfaceDef for VertOutput {
|
|
|
|
|
pub type VertOutputIter = std::vec::IntoIter<ShaderInterfaceDefEntry>;
|
|
|
|
|
|
|
|
|
|
// This structure describes layout of this stage.
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
|
|
pub struct VertLayout {
|
|
|
|
|
pub stages: ShaderStages,
|
|
|
|
|
pub layout_data: LayoutData,
|
|
|
|
|
}
|
|
|
|
|
impl VertLayout {
|
|
|
|
|
const STAGES: ShaderStages = ShaderStages {
|
|
|
|
|
vertex: true,
|
|
|
|
|
tessellation_control: false,
|
|
|
|
|
tessellation_evaluation: false,
|
|
|
|
|
geometry: false,
|
|
|
|
|
fragment: false,
|
|
|
|
|
compute: false,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
unsafe impl PipelineLayoutDesc for VertLayout {
|
|
|
|
|
fn num_sets(&self) -> usize {
|
|
|
|
|
self.layout_data.num_sets
|
|
|
|
@ -130,7 +149,54 @@ unsafe impl PipelineLayoutDesc for VertLayout {
|
|
|
|
|
.and_then(|s|s.get(&binding))
|
|
|
|
|
.map(|desc| {
|
|
|
|
|
let mut desc = desc.clone();
|
|
|
|
|
desc.stages = self.stages;
|
|
|
|
|
desc.stages = VertLayout::STAGES;
|
|
|
|
|
desc
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
fn num_push_constants_ranges(&self) -> usize {
|
|
|
|
|
self.layout_data.num_constants
|
|
|
|
|
}
|
|
|
|
|
fn push_constants_range(&self, num: usize) -> Option<PipelineLayoutDescPcRange> {
|
|
|
|
|
self.layout_data.pc_ranges.get(num)
|
|
|
|
|
.map(|desc| {
|
|
|
|
|
let mut desc = *desc;
|
|
|
|
|
desc.stages = VertLayout::STAGES;
|
|
|
|
|
desc
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
|
|
|
pub struct ComputeLayout {
|
|
|
|
|
pub layout_data: LayoutData,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl ComputeLayout {
|
|
|
|
|
const STAGES: ShaderStages = ShaderStages {
|
|
|
|
|
vertex: false,
|
|
|
|
|
tessellation_control: false,
|
|
|
|
|
tessellation_evaluation: false,
|
|
|
|
|
geometry: false,
|
|
|
|
|
fragment: false,
|
|
|
|
|
compute: true,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsafe impl PipelineLayoutDesc for ComputeLayout {
|
|
|
|
|
fn num_sets(&self) -> usize {
|
|
|
|
|
self.layout_data.num_sets
|
|
|
|
|
}
|
|
|
|
|
fn num_bindings_in_set(&self, set: usize) -> Option<usize> {
|
|
|
|
|
self.layout_data.num_bindings.get(&set).map(|&b|b)
|
|
|
|
|
}
|
|
|
|
|
fn descriptor(&self, set: usize, binding: usize) -> Option<DescriptorDesc> {
|
|
|
|
|
self.layout_data.descriptions.get(&set)
|
|
|
|
|
.and_then(|s|s.get(&binding))
|
|
|
|
|
.map(|desc| {
|
|
|
|
|
let mut desc = desc.clone();
|
|
|
|
|
desc.stages = Self::STAGES;
|
|
|
|
|
desc
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
@ -142,7 +208,7 @@ unsafe impl PipelineLayoutDesc for VertLayout {
|
|
|
|
|
self.layout_data.pc_ranges.get(num)
|
|
|
|
|
.map(|desc| {
|
|
|
|
|
let mut desc = *desc;
|
|
|
|
|
desc.stages = self.stages;
|
|
|
|
|
desc.stages = Self::STAGES;
|
|
|
|
|
desc
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|