1
0
mirror of synced 2025-11-09 21:07:12 +00:00

support for compute shaders

This commit is contained in:
freesig
2019-06-05 13:28:24 +10:00
parent 5f7162510f
commit 370bf8350a
6 changed files with 212 additions and 78 deletions

View File

@@ -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,10 +73,10 @@ 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
})
}
fn num_push_constants_ranges(&self) -> usize {
self.layout_data.num_constants
@@ -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,10 +149,10 @@ 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
@@ -142,7 +161,54 @@ unsafe impl PipelineLayoutDesc for VertLayout {
self.layout_data.pc_ranges.get(num)
.map(|desc| {
let mut desc = *desc;
desc.stages = self.stages;
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
})
}
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 = Self::STAGES;
desc
})