[glsl-in] Support parsing push_constant and std430

This commit is contained in:
Jack Foltz
2021-05-22 13:25:58 -04:00
committed by João Capucho
parent 652b65cfa9
commit 813da7a87e
3 changed files with 40 additions and 1 deletions

View File

@@ -561,6 +561,7 @@ pub enum StorageQualifier {
#[derive(Debug, Clone, Copy)]
pub enum StructLayout {
Std140,
Std430,
}
#[derive(Debug, Clone, PartialEq, Copy)]

View File

@@ -300,7 +300,14 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> {
}
} else {
match name.as_str() {
"push_constant" => {
qualifiers.push(TypeQualifier::StorageQualifier(
StorageQualifier::StorageClass(StorageClass::PushConstant),
));
qualifiers.push(TypeQualifier::Layout(StructLayout::Std430));
}
"std140" => qualifiers.push(TypeQualifier::Layout(StructLayout::Std140)),
"std430" => qualifiers.push(TypeQualifier::Layout(StructLayout::Std430)),
"early_fragment_tests" => {
qualifiers.push(TypeQualifier::EarlyFragmentTests)
}
@@ -694,7 +701,10 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> {
for qualifier in qualifiers {
match *qualifier {
TypeQualifier::StorageQualifier(StorageQualifier::StorageClass(c)) => {
if StorageClass::Private != class {
if StorageClass::PushConstant == class && c == StorageClass::Uniform {
// Ignore the Uniform qualifier if the class was already set to PushConstant
continue;
} else if StorageClass::Private != class {
return Err(ErrorKind::SemanticError(
meta,
"Cannot use more than one storage qualifier per declaration".into(),

View File

@@ -188,6 +188,34 @@ fn declarations() {
)
.unwrap();
let _program = parse_program(
r#"
#version 450
layout(push_constant, set = 2, binding = 0)
uniform u_locals {
vec3 model_offs;
float load_time;
ivec4 atlas_offs;
};
"#,
&entry_points,
)
.unwrap();
let _program = parse_program(
r#"
#version 450
layout(std430, set = 2, binding = 0)
uniform u_locals {
vec3 model_offs;
float load_time;
ivec4 atlas_offs;
};
"#,
&entry_points,
)
.unwrap();
let _program = parse_program(
r#"
#version 450