diff --git a/src/front/glsl/ast.rs b/src/front/glsl/ast.rs index 9be0827757..1d02b504a4 100644 --- a/src/front/glsl/ast.rs +++ b/src/front/glsl/ast.rs @@ -561,6 +561,7 @@ pub enum StorageQualifier { #[derive(Debug, Clone, Copy)] pub enum StructLayout { Std140, + Std430, } #[derive(Debug, Clone, PartialEq, Copy)] diff --git a/src/front/glsl/parser.rs b/src/front/glsl/parser.rs index 61ad7cab4c..543708dc3f 100644 --- a/src/front/glsl/parser.rs +++ b/src/front/glsl/parser.rs @@ -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(), diff --git a/src/front/glsl/parser_tests.rs b/src/front/glsl/parser_tests.rs index 3e3321e4ad..91c0e22fc4 100644 --- a/src/front/glsl/parser_tests.rs +++ b/src/front/glsl/parser_tests.rs @@ -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