mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Make type handling more generic in glsl-new (#134)
* Make type handling more generic in glsl-new * Remove commented-out code
This commit is contained in:
@@ -119,23 +119,66 @@ pub fn consume_token(mut input: &str) -> (Option<Token>, &str) {
|
||||
"double" => (Some(Token::Double(meta)), rest),
|
||||
"int" => (Some(Token::Int(meta)), rest),
|
||||
"uint" => (Some(Token::Uint(meta)), rest),
|
||||
"vec2" => (Some(Token::Vec2(meta)), rest),
|
||||
"bvec2" => (Some(Token::Bvec2(meta)), rest),
|
||||
"ivec2" => (Some(Token::Ivec2(meta)), rest),
|
||||
"uvec2" => (Some(Token::Uvec2(meta)), rest),
|
||||
"dvec2" => (Some(Token::Dvec2(meta)), rest),
|
||||
"vec3" => (Some(Token::Vec3(meta)), rest),
|
||||
"bvec3" => (Some(Token::Bvec3(meta)), rest),
|
||||
"ivec3" => (Some(Token::Ivec3(meta)), rest),
|
||||
"uvec3" => (Some(Token::Uvec3(meta)), rest),
|
||||
"dvec3" => (Some(Token::Dvec3(meta)), rest),
|
||||
"vec4" => (Some(Token::Vec4(meta)), rest),
|
||||
"bvec4" => (Some(Token::Bvec4(meta)), rest),
|
||||
"ivec4" => (Some(Token::Ivec4(meta)), rest),
|
||||
"uvec4" => (Some(Token::Uvec4(meta)), rest),
|
||||
"dvec4" => (Some(Token::Dvec4(meta)), rest),
|
||||
//TODO: remaining types
|
||||
_ => (Some(Token::Identifier((meta, String::from(word)))), rest),
|
||||
word => {
|
||||
use crate::{ScalarKind, VectorSize};
|
||||
|
||||
fn kind_width_parse(ty: &str) -> Option<(ScalarKind, u8)> {
|
||||
Some(match ty {
|
||||
"" => (ScalarKind::Float, 4),
|
||||
"b" => (ScalarKind::Bool, 4),
|
||||
"i" => (ScalarKind::Sint, 4),
|
||||
"u" => (ScalarKind::Uint, 4),
|
||||
"d" => (ScalarKind::Float, 8),
|
||||
_ => return None,
|
||||
})
|
||||
}
|
||||
|
||||
fn size_parse(n: &str) -> Option<VectorSize> {
|
||||
Some(match n {
|
||||
"2" => VectorSize::Bi,
|
||||
"3" => VectorSize::Tri,
|
||||
"4" => VectorSize::Quad,
|
||||
_ => return None,
|
||||
})
|
||||
}
|
||||
|
||||
let vec_parse = |word: &str| {
|
||||
let mut iter = word.split("vec");
|
||||
|
||||
let kind = iter.next()?;
|
||||
let size = iter.next()?;
|
||||
let (kind, width) = kind_width_parse(kind)?;
|
||||
let size = size_parse(size)?;
|
||||
|
||||
Some(Token::Vec((meta.clone(), (size, kind, width))))
|
||||
};
|
||||
|
||||
let mat_parse = |word: &str| {
|
||||
let mut iter = word.split("mat");
|
||||
|
||||
let kind = iter.next()?;
|
||||
let size = iter.next()?;
|
||||
let (kind, width) = kind_width_parse(kind)?;
|
||||
|
||||
let (col, row) = if let Some(size) = size_parse(size) {
|
||||
(size, size)
|
||||
} else {
|
||||
let mut iter = size.split('x');
|
||||
match (iter.next()?, iter.next()?, iter.next()) {
|
||||
(col, row, None) => (size_parse(col)?, size_parse(row)?),
|
||||
_ => return None,
|
||||
}
|
||||
};
|
||||
|
||||
Some(Token::Mat((meta.clone(), (col, row, kind, width))))
|
||||
};
|
||||
|
||||
let token = vec_parse(word)
|
||||
.or_else(|| mat_parse(word))
|
||||
.unwrap_or_else(|| Token::Identifier((meta, String::from(word))));
|
||||
|
||||
(Some(token), rest)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ pomelo! {
|
||||
use super::super::{error::ErrorKind, token::*, ast::*};
|
||||
use crate::{Arena, BinaryOperator, Binding, Block, BuiltIn, Constant, ConstantInner, Expression,
|
||||
Function, GlobalVariable, Handle, LocalVariable, ScalarKind,
|
||||
ShaderStage, Statement, StorageClass, Type, TypeInner, VectorSize};
|
||||
ShaderStage, Statement, StorageClass, Type, TypeInner, VectorSize, Bytes};
|
||||
}
|
||||
%token #[derive(Debug)] pub enum Token {};
|
||||
%parser pub struct Parser<'a> {};
|
||||
@@ -105,6 +105,9 @@ pomelo! {
|
||||
%type type_specifier Option<Handle<Type>>;
|
||||
%type type_specifier_nonarray Option<Type>;
|
||||
|
||||
%type Vec (VectorSize, ScalarKind, Bytes);
|
||||
%type Mat (VectorSize, VectorSize, ScalarKind, Bytes);
|
||||
|
||||
|
||||
root ::= version_pragma translation_unit;
|
||||
version_pragma ::= Version IntConstant(V) Identifier?(P) {
|
||||
@@ -689,161 +692,27 @@ pomelo! {
|
||||
}
|
||||
})
|
||||
}
|
||||
// Vectors (2)
|
||||
type_specifier_nonarray ::= Vec2 {
|
||||
type_specifier_nonarray ::= Vec((_, (size, kind, width))) {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Float,
|
||||
width: 4,
|
||||
size,
|
||||
kind,
|
||||
width,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Bvec2 {
|
||||
type_specifier_nonarray ::= Mat((_, (columns, rows, kind, width))) {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Bool,
|
||||
width: 4,
|
||||
inner: TypeInner::Matrix {
|
||||
columns,
|
||||
rows,
|
||||
kind,
|
||||
width,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Ivec2 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Sint,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Uvec2 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Uint,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Dvec2 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Float,
|
||||
width: 8,
|
||||
}
|
||||
})
|
||||
}
|
||||
// Vectors (3)
|
||||
type_specifier_nonarray ::= Vec3 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Float,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Bvec3 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Bool,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Ivec3 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Sint,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Uvec3 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Uint,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Dvec3 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Float,
|
||||
width: 8,
|
||||
}
|
||||
})
|
||||
}
|
||||
// Vectors (4)
|
||||
type_specifier_nonarray ::= Vec4 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Float,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Bvec4 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Bool,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Ivec4 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Sint,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Uvec4 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Uint,
|
||||
width: 4,
|
||||
}
|
||||
})
|
||||
}
|
||||
type_specifier_nonarray ::= Dvec4 {
|
||||
Some(Type {
|
||||
name: None,
|
||||
inner: TypeInner::Vector {
|
||||
size: VectorSize::Bi,
|
||||
kind: ScalarKind::Float,
|
||||
width: 8,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
//TODO: remaining types
|
||||
|
||||
// misc
|
||||
translation_unit ::= external_declaration;
|
||||
|
||||
Reference in New Issue
Block a user