mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
[glsl-in] Support parsing push_constant and std430
This commit is contained in:
@@ -561,6 +561,7 @@ pub enum StorageQualifier {
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum StructLayout {
|
||||
Std140,
|
||||
Std430,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Copy)]
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user