Skip to content

Commit ace2e20

Browse files
authored
[naga wgsl-in] allow global vars without explicit type (#6199)
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
1 parent 105cb9d commit ace2e20

File tree

6 files changed

+234
-179
lines changed

6 files changed

+234
-179
lines changed

naga/src/front/wgsl/lower/mod.rs

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,26 +1034,41 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
10341034
ctx.globals.insert(f.name.name, lowered_decl);
10351035
}
10361036
ast::GlobalDeclKind::Var(ref v) => {
1037-
let ty = self.resolve_ast_type(v.ty, &mut ctx)?;
1038-
1039-
let init;
1040-
if let Some(init_ast) = v.init {
1041-
let mut ectx = ctx.as_override();
1042-
let lowered = self.expression_for_abstract(init_ast, &mut ectx)?;
1043-
let ty_res = crate::proc::TypeResolution::Handle(ty);
1044-
let converted = ectx
1045-
.try_automatic_conversions(lowered, &ty_res, v.name.span)
1046-
.map_err(|error| match error {
1037+
let explicit_ty =
1038+
v.ty.map(|ast| self.resolve_ast_type(ast, &mut ctx))
1039+
.transpose()?;
1040+
1041+
let mut ectx = ctx.as_override();
1042+
1043+
let ty;
1044+
let initializer;
1045+
match (v.init, explicit_ty) {
1046+
(Some(init), Some(explicit_ty)) => {
1047+
let init = self.expression_for_abstract(init, &mut ectx)?;
1048+
let ty_res = crate::proc::TypeResolution::Handle(explicit_ty);
1049+
let init = ectx
1050+
.try_automatic_conversions(init, &ty_res, v.name.span)
1051+
.map_err(|error| match error {
10471052
Error::AutoConversion(e) => Error::InitializationTypeMismatch {
10481053
name: v.name.span,
10491054
expected: e.dest_type,
10501055
got: e.source_type,
10511056
},
10521057
other => other,
10531058
})?;
1054-
init = Some(converted);
1055-
} else {
1056-
init = None;
1059+
ty = explicit_ty;
1060+
initializer = Some(init);
1061+
}
1062+
(Some(init), None) => {
1063+
let concretized = self.expression(init, &mut ectx)?;
1064+
ty = ectx.register_type(concretized)?;
1065+
initializer = Some(concretized);
1066+
}
1067+
(None, Some(explicit_ty)) => {
1068+
ty = explicit_ty;
1069+
initializer = None;
1070+
}
1071+
(None, None) => return Err(Error::DeclMissingTypeAndInit(v.name.span)),
10571072
}
10581073

10591074
let binding = if let Some(ref binding) = v.binding {
@@ -1071,7 +1086,7 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
10711086
space: v.space,
10721087
binding,
10731088
ty,
1074-
init,
1089+
init: initializer,
10751090
},
10761091
span,
10771092
);

naga/src/front/wgsl/parse/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ pub struct GlobalVariable<'a> {
142142
pub name: Ident<'a>,
143143
pub space: crate::AddressSpace,
144144
pub binding: Option<ResourceBinding<'a>>,
145-
pub ty: Handle<Type<'a>>,
145+
pub ty: Option<Handle<Type<'a>>>,
146146
pub init: Option<Handle<Expression<'a>>>,
147147
}
148148

naga/src/front/wgsl/parse/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -991,8 +991,12 @@ impl Parser {
991991
lexer.expect(Token::Paren('>'))?;
992992
}
993993
let name = lexer.next_ident()?;
994-
lexer.expect(Token::Separator(':'))?;
995-
let ty = self.type_decl(lexer, ctx)?;
994+
995+
let ty = if lexer.skip(Token::Separator(':')) {
996+
Some(self.type_decl(lexer, ctx)?)
997+
} else {
998+
None
999+
};
9961000

9971001
let init = if lexer.skip(Token::Operation('=')) {
9981002
let handle = self.general_expression(lexer, ctx)?;

naga/tests/in/abstract-types-var.wgsl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@ var<private> xafpaiaf: array<f32, 2> = array(1, 2.0);
4343
var<private> xafpafai: array<f32, 2> = array(1.0, 2);
4444
var<private> xafpafaf: array<f32, 2> = array(1.0, 2.0);
4545

46+
var<private> ivispai = vec2(1);
47+
var<private> ivfspaf = vec2(1.0);
48+
var<private> ivis_ai = vec2<i32>(1);
49+
var<private> ivus_ai = vec2<u32>(1);
50+
var<private> ivfs_ai = vec2<f32>(1);
51+
var<private> ivfs_af = vec2<f32>(1.0);
52+
53+
var<private> iafafaf = array<f32, 2>(1.0, 2.0);
54+
var<private> iafaiai = array<f32, 2>(1, 2);
55+
56+
var<private> iafpafaf = array(1.0, 2.0);
57+
var<private> iafpaiaf = array(1, 2.0);
58+
var<private> iafpafai = array(1.0, 2);
59+
4660
fn all_constant_arguments() {
4761
var xvipaiai: vec2<i32> = vec2(42, 43);
4862
var xvupaiai: vec2<u32> = vec2(44, 45);

0 commit comments

Comments
 (0)