remove unimpl
This commit is contained in:
@@ -1,4 +1,10 @@
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
Compile(shaderc::Error),
|
Compile(shaderc::Error),
|
||||||
|
Layout(ConvertError),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum ConvertError {
|
||||||
|
Unimplemented,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ mod watch;
|
|||||||
pub use layouts::*;
|
pub use layouts::*;
|
||||||
pub use reflection::LayoutData;
|
pub use reflection::LayoutData;
|
||||||
pub use watch::{Message, Watch};
|
pub use watch::{Message, Watch};
|
||||||
pub use error::Error;
|
pub use error::{Error, ConvertError};
|
||||||
|
|
||||||
use spirv_reflect as sr;
|
use spirv_reflect as sr;
|
||||||
use vulkano as vk;
|
use vulkano as vk;
|
||||||
@@ -20,7 +20,6 @@ pub struct CompiledShaders {
|
|||||||
pub fragment: Vec<u32>,
|
pub fragment: Vec<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn load<T>(vertex: T, fragment: T) -> Result<CompiledShaders, Error>
|
pub fn load<T>(vertex: T, fragment: T) -> Result<CompiledShaders, Error>
|
||||||
where
|
where
|
||||||
T: AsRef<Path>,
|
T: AsRef<Path>,
|
||||||
@@ -30,6 +29,6 @@ where
|
|||||||
Ok(CompiledShaders{ vertex, fragment })
|
Ok(CompiledShaders{ vertex, fragment })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse(code: &CompiledShaders) -> Entry {
|
pub fn parse(code: &CompiledShaders) -> Result<Entry, Error> {
|
||||||
reflection::create_entry(code)
|
reflection::create_entry(code)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ use crate::vk::descriptor::descriptor::*;
|
|||||||
use crate::vk::descriptor::pipeline_layout::PipelineLayoutDescPcRange;
|
use crate::vk::descriptor::pipeline_layout::PipelineLayoutDescPcRange;
|
||||||
use crate::vk::pipeline::shader::ShaderInterfaceDefEntry;
|
use crate::vk::pipeline::shader::ShaderInterfaceDefEntry;
|
||||||
use crate::CompiledShaders;
|
use crate::CompiledShaders;
|
||||||
|
use crate::error::Error;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
pub struct ShaderInterfaces {
|
pub struct ShaderInterfaces {
|
||||||
pub inputs: Vec<ShaderInterfaceDefEntry>,
|
pub inputs: Vec<ShaderInterfaceDefEntry>,
|
||||||
@@ -22,11 +24,11 @@ pub struct LayoutData {
|
|||||||
pub pc_ranges: Vec<PipelineLayoutDescPcRange>,
|
pub pc_ranges: Vec<PipelineLayoutDescPcRange>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_entry(shaders: &CompiledShaders) -> Entry {
|
pub fn create_entry(shaders: &CompiledShaders) -> Result<Entry, Error> {
|
||||||
let vertex_interfaces = create_interfaces(&shaders.vertex);
|
let vertex_interfaces = create_interfaces(&shaders.vertex);
|
||||||
let vertex_layout = create_layouts(&shaders.vertex);
|
let vertex_layout = create_layouts(&shaders.vertex)?;
|
||||||
let fragment_interfaces = create_interfaces(&shaders.fragment);
|
let fragment_interfaces = create_interfaces(&shaders.fragment);
|
||||||
let fragment_layout = create_layouts(&shaders.fragment);
|
let fragment_layout = create_layouts(&shaders.fragment)?;
|
||||||
let frag_input = FragInput {
|
let frag_input = FragInput {
|
||||||
inputs: fragment_interfaces.inputs,
|
inputs: fragment_interfaces.inputs,
|
||||||
};
|
};
|
||||||
@@ -53,14 +55,14 @@ pub fn create_entry(shaders: &CompiledShaders) -> Entry {
|
|||||||
},
|
},
|
||||||
layout_data: vertex_layout,
|
layout_data: vertex_layout,
|
||||||
};
|
};
|
||||||
Entry {
|
Ok(Entry {
|
||||||
frag_input,
|
frag_input,
|
||||||
frag_output,
|
frag_output,
|
||||||
vert_input,
|
vert_input,
|
||||||
vert_output,
|
vert_output,
|
||||||
frag_layout,
|
frag_layout,
|
||||||
vert_layout,
|
vert_layout,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_interfaces(data: &[u32]) -> ShaderInterfaces {
|
fn create_interfaces(data: &[u32]) -> ShaderInterfaces {
|
||||||
@@ -105,11 +107,12 @@ fn create_interfaces(data: &[u32]) -> ShaderInterfaces {
|
|||||||
.expect("failed to load module")
|
.expect("failed to load module")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_layouts(data: &[u32]) -> LayoutData {
|
fn create_layouts(data: &[u32]) -> Result<LayoutData, Error> {
|
||||||
sr::ShaderModule::load_u32_data(data)
|
sr::ShaderModule::load_u32_data(data)
|
||||||
.map(|m| {
|
.map(|m| {
|
||||||
let (num_sets, num_bindings, descriptions) = m
|
//let (num_sets, num_bindings, descriptions) = m
|
||||||
.enumerate_descriptor_sets(None)
|
let descs =
|
||||||
|
m.enumerate_descriptor_sets(None)
|
||||||
.map(|sets| {
|
.map(|sets| {
|
||||||
let num_sets = sets.len();
|
let num_sets = sets.len();
|
||||||
let num_bindings = sets
|
let num_bindings = sets
|
||||||
@@ -130,7 +133,8 @@ fn create_layouts(data: &[u32]) -> LayoutData {
|
|||||||
descriptor_type: b.descriptor_type,
|
descriptor_type: b.descriptor_type,
|
||||||
image: b.image,
|
image: b.image,
|
||||||
};
|
};
|
||||||
let ty = SpirvTy::<DescriptorDescTy>::from(info).inner();
|
let ty = SpirvTy::<DescriptorDescTy>::try_from(info)?;
|
||||||
|
let ty = ty.inner();
|
||||||
let stages = ShaderStages::none();
|
let stages = ShaderStages::none();
|
||||||
let d = DescriptorDesc {
|
let d = DescriptorDesc {
|
||||||
ty,
|
ty,
|
||||||
@@ -140,17 +144,19 @@ fn create_layouts(data: &[u32]) -> LayoutData {
|
|||||||
// it's correct
|
// it's correct
|
||||||
readonly: true,
|
readonly: true,
|
||||||
};
|
};
|
||||||
(b.binding as usize, d)
|
Ok((b.binding as usize, d))
|
||||||
})
|
})
|
||||||
|
.flat_map(|d| d.ok())
|
||||||
.collect::<HashMap<usize, DescriptorDesc>>();
|
.collect::<HashMap<usize, DescriptorDesc>>();
|
||||||
(i.set as usize, desc)
|
(i.set as usize, desc)
|
||||||
})
|
})
|
||||||
.collect::<HashMap<usize, HashMap<usize, DescriptorDesc>>>();
|
.collect::<HashMap<usize, HashMap<usize, DescriptorDesc>>>();
|
||||||
(num_sets, num_bindings, descriptions)
|
(num_sets, num_bindings, descriptions)
|
||||||
})
|
})
|
||||||
.expect("Failed to pass descriptors");
|
.into_iter();
|
||||||
let (num_constants, pc_ranges) = m
|
//let (num_constants, pc_ranges) = m
|
||||||
.enumerate_push_constant_blocks(None)
|
let pcs =
|
||||||
|
m.enumerate_push_constant_blocks(None)
|
||||||
.map(|constants| {
|
.map(|constants| {
|
||||||
let num_constants = constants.len();
|
let num_constants = constants.len();
|
||||||
let pc_ranges = constants
|
let pc_ranges = constants
|
||||||
@@ -163,14 +169,14 @@ fn create_layouts(data: &[u32]) -> LayoutData {
|
|||||||
.collect::<Vec<PipelineLayoutDescPcRange>>();
|
.collect::<Vec<PipelineLayoutDescPcRange>>();
|
||||||
(num_constants, pc_ranges)
|
(num_constants, pc_ranges)
|
||||||
})
|
})
|
||||||
.expect("Failed to pass push constants");
|
.into_iter();
|
||||||
|
descs.flat_map(|(num_sets, num_bindings, descriptions)| pcs.map(|(num_constants, pc_ranges)|
|
||||||
LayoutData {
|
LayoutData {
|
||||||
num_sets,
|
num_sets,
|
||||||
num_bindings,
|
num_bindings,
|
||||||
descriptions,
|
descriptions,
|
||||||
num_constants,
|
num_constants,
|
||||||
pc_ranges,
|
pc_ranges,
|
||||||
}
|
})).next()
|
||||||
})
|
})
|
||||||
.expect("failed to load module")
|
|
||||||
}
|
}
|
||||||
|
|||||||
43
src/srvk.rs
43
src/srvk.rs
@@ -1,7 +1,9 @@
|
|||||||
use crate::sr;
|
use crate::sr;
|
||||||
use crate::vk;
|
use crate::vk;
|
||||||
|
use crate::error::{ConvertError, Error};
|
||||||
use vk::descriptor::descriptor::*;
|
use vk::descriptor::descriptor::*;
|
||||||
use vk::format::Format;
|
use vk::format::Format;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
pub struct SpirvTy<T> {
|
pub struct SpirvTy<T> {
|
||||||
inner: T,
|
inner: T,
|
||||||
@@ -12,34 +14,35 @@ pub struct DescriptorDescInfo {
|
|||||||
pub image: sr::types::ReflectImageTraits,
|
pub image: sr::types::ReflectImageTraits,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl<T> SpirvTy<T> {
|
impl<T> SpirvTy<T> {
|
||||||
pub fn inner(self) -> T {
|
pub fn inner(self) -> T {
|
||||||
self.inner
|
self.inner
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<DescriptorDescInfo> for SpirvTy<DescriptorDescTy> {
|
impl TryFrom<DescriptorDescInfo> for SpirvTy<DescriptorDescTy> {
|
||||||
fn from(d: DescriptorDescInfo) -> Self {
|
type Error = Error;
|
||||||
|
fn try_from(d: DescriptorDescInfo) -> Result<Self, Self::Error> {
|
||||||
use sr::types::ReflectDescriptorType as SR;
|
use sr::types::ReflectDescriptorType as SR;
|
||||||
use DescriptorDescTy as VK;
|
use DescriptorDescTy as VK;
|
||||||
let t = match d.descriptor_type {
|
match d.descriptor_type {
|
||||||
SR::Undefined => unreachable!(),
|
SR::Undefined => Err(ConvertError::Unimplemented),
|
||||||
SR::Sampler => VK::Sampler,
|
SR::Sampler => Ok(VK::Sampler),
|
||||||
SR::CombinedImageSampler => VK::CombinedImageSampler(SpirvTy::from(d.image).inner()),
|
SR::CombinedImageSampler => Ok(VK::CombinedImageSampler(SpirvTy::from(d.image).inner())),
|
||||||
SR::SampledImage => unreachable!(),
|
SR::SampledImage => Err(ConvertError::Unimplemented),
|
||||||
SR::StorageImage => unreachable!(),
|
SR::StorageImage => Err(ConvertError::Unimplemented),
|
||||||
SR::UniformTexelBuffer => unreachable!(),
|
SR::UniformTexelBuffer => Err(ConvertError::Unimplemented),
|
||||||
SR::StorageTexelBuffer => unreachable!(),
|
SR::StorageTexelBuffer => Err(ConvertError::Unimplemented),
|
||||||
SR::UniformBuffer => unreachable!(),
|
SR::UniformBuffer => Err(ConvertError::Unimplemented),
|
||||||
SR::StorageBuffer => unreachable!(),
|
SR::StorageBuffer => Err(ConvertError::Unimplemented),
|
||||||
SR::UniformBufferDynamic => unreachable!(),
|
SR::UniformBufferDynamic => Err(ConvertError::Unimplemented),
|
||||||
SR::StorageBufferDynamic => unreachable!(),
|
SR::StorageBufferDynamic => Err(ConvertError::Unimplemented),
|
||||||
SR::InputAttachment => unreachable!(),
|
SR::InputAttachment => Err(ConvertError::Unimplemented),
|
||||||
SR::AccelerationStructureNV => unreachable!(),
|
SR::AccelerationStructureNV => Err(ConvertError::Unimplemented),
|
||||||
};
|
|
||||||
SpirvTy {
|
|
||||||
inner: t,
|
|
||||||
}
|
}
|
||||||
|
.map(|t| SpirvTy{ inner: t })
|
||||||
|
.map_err(|e| Error::Layout(e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +139,7 @@ impl From<sr::types::ReflectFormat> for SpirvTy<Format> {
|
|||||||
use sr::types::ReflectFormat::*;
|
use sr::types::ReflectFormat::*;
|
||||||
use Format::*;
|
use Format::*;
|
||||||
let t = match f {
|
let t = match f {
|
||||||
Undefined => unreachable!(),
|
Undefined => unimplemented!(),
|
||||||
R32_UINT => R32Uint,
|
R32_UINT => R32Uint,
|
||||||
R32_SINT => R32Sint,
|
R32_SINT => R32Sint,
|
||||||
R32_SFLOAT => R32Sfloat,
|
R32_SFLOAT => R32Sfloat,
|
||||||
|
|||||||
Reference in New Issue
Block a user