Skip to content

Commit 34bb9e4

Browse files
authored
[naga wgsl] Implement local const declarations (#6156)
1 parent 4454cbf commit 34bb9e4

26 files changed

+769
-127
lines changed

naga/src/back/glsl/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ pub use features::Features;
4747

4848
use crate::{
4949
back::{self, Baked},
50-
proc::{self, NameKey},
50+
proc::{self, ExpressionKindTracker, NameKey},
5151
valid, Handle, ShaderStage, TypeInner,
5252
};
5353
use features::FeaturesManager;
@@ -1584,6 +1584,7 @@ impl<'a, W: Write> Writer<'a, W> {
15841584
info,
15851585
expressions: &func.expressions,
15861586
named_expressions: &func.named_expressions,
1587+
expr_kind_tracker: ExpressionKindTracker::from_arena(&func.expressions),
15871588
};
15881589

15891590
self.named_expressions.clear();

naga/src/back/hlsl/writer.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use super::{
88
};
99
use crate::{
1010
back::{self, Baked},
11-
proc::{self, NameKey},
11+
proc::{self, ExpressionKindTracker, NameKey},
1212
valid, Handle, Module, Scalar, ScalarKind, ShaderStage, TypeInner,
1313
};
1414
use std::{fmt, mem};
@@ -346,6 +346,7 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> {
346346
info,
347347
expressions: &function.expressions,
348348
named_expressions: &function.named_expressions,
349+
expr_kind_tracker: ExpressionKindTracker::from_arena(&function.expressions),
349350
};
350351
let name = self.names[&NameKey::Function(handle)].clone();
351352

@@ -386,6 +387,7 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> {
386387
info,
387388
expressions: &ep.function.expressions,
388389
named_expressions: &ep.function.named_expressions,
390+
expr_kind_tracker: ExpressionKindTracker::from_arena(&ep.function.expressions),
389391
};
390392

391393
self.write_wrapped_functions(module, &ctx)?;

naga/src/back/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ Backend functions that export shader [`Module`](super::Module)s into binary and
33
*/
44
#![allow(dead_code)] // can be dead if none of the enabled backends need it
55

6+
use crate::proc::ExpressionKindTracker;
7+
68
#[cfg(dot_out)]
79
pub mod dot;
810
#[cfg(glsl_out)]
@@ -118,6 +120,8 @@ pub struct FunctionCtx<'a> {
118120
pub expressions: &'a crate::Arena<crate::Expression>,
119121
/// Map of expressions that have associated variable names
120122
pub named_expressions: &'a crate::NamedExpressions,
123+
/// For constness checks
124+
pub expr_kind_tracker: ExpressionKindTracker,
121125
}
122126

123127
impl FunctionCtx<'_> {

naga/src/back/pipeline_constants.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ fn process_function(
289289
&mut local_expression_kind_tracker,
290290
&mut emitter,
291291
&mut block,
292+
false,
292293
);
293294

294295
for (old_h, mut expr, span) in expressions.drain() {

naga/src/back/wgsl/writer.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::Error;
22
use crate::{
33
back::{self, Baked},
4-
proc::{self, NameKey},
4+
proc::{self, ExpressionKindTracker, NameKey},
55
valid, Handle, Module, ShaderStage, TypeInner,
66
};
77
use std::fmt::Write;
@@ -166,6 +166,7 @@ impl<W: Write> Writer<W> {
166166
info: fun_info,
167167
expressions: &function.expressions,
168168
named_expressions: &function.named_expressions,
169+
expr_kind_tracker: ExpressionKindTracker::from_arena(&function.expressions),
169170
};
170171

171172
// Write the function
@@ -193,6 +194,7 @@ impl<W: Write> Writer<W> {
193194
info: info.get_entry_point(index),
194195
expressions: &ep.function.expressions,
195196
named_expressions: &ep.function.named_expressions,
197+
expr_kind_tracker: ExpressionKindTracker::from_arena(&ep.function.expressions),
196198
};
197199
self.write_function(module, &ep.function, &func_ctx)?;
198200

@@ -1115,8 +1117,14 @@ impl<W: Write> Writer<W> {
11151117
func_ctx: &back::FunctionCtx,
11161118
name: &str,
11171119
) -> BackendResult {
1120+
// Some functions are marked as const, but are not yet implemented as constant expression
1121+
let quantifier = if func_ctx.expr_kind_tracker.is_impl_const(handle) {
1122+
"const"
1123+
} else {
1124+
"let"
1125+
};
11181126
// Write variable name
1119-
write!(self.out, "let {name}")?;
1127+
write!(self.out, "{quantifier} {name}")?;
11201128
if self.flags.contains(WriterFlags::EXPLICIT_TYPES) {
11211129
write!(self.out, ": ")?;
11221130
let ty = &func_ctx.info[handle].ty;

0 commit comments

Comments
 (0)