@@ -135,12 +135,6 @@ impl<W: Write> Writer<W> {
135135 }
136136
137137 pub fn write ( & mut self , module : & Module , info : & valid:: ModuleInfo ) -> BackendResult {
138- if !module. overrides . is_empty ( ) {
139- return Err ( Error :: Unimplemented (
140- "Pipeline constants are not yet supported for this back-end" . to_string ( ) ,
141- ) ) ;
142- }
143-
144138 self . reset ( module) ;
145139
146140 // Write all `enable` declarations
@@ -172,6 +166,16 @@ impl<W: Write> Writer<W> {
172166 }
173167 }
174168
169+ // Write all overrides
170+ let mut overrides = module. overrides . iter ( ) . peekable ( ) ;
171+ while let Some ( ( handle, _) ) = overrides. next ( ) {
172+ self . write_override ( module, handle) ?;
173+ // Add extra newline for readability on last iteration
174+ if overrides. peek ( ) . is_none ( ) {
175+ writeln ! ( self . out) ?;
176+ }
177+ }
178+
175179 // Write all globals
176180 for ( ty, global) in module. global_variables . iter ( ) {
177181 self . write_global ( module, global, ty) ?;
@@ -1205,6 +1209,9 @@ impl<W: Write> Writer<W> {
12051209 write_expression ( self , value) ?;
12061210 write ! ( self . out, ")" ) ?;
12071211 }
1212+ Expression :: Override ( handle) => {
1213+ write ! ( self . out, "{}" , self . names[ & NameKey :: Override ( handle) ] ) ?;
1214+ }
12081215 _ => unreachable ! ( ) ,
12091216 }
12101217
@@ -1255,7 +1262,9 @@ impl<W: Write> Writer<W> {
12551262 |writer, expr| writer. write_expr ( module, expr, func_ctx) ,
12561263 ) ?;
12571264 }
1258- Expression :: Override ( _) => unreachable ! ( ) ,
1265+ Expression :: Override ( handle) => {
1266+ write ! ( self . out, "{}" , self . names[ & NameKey :: Override ( handle) ] ) ?;
1267+ }
12591268 Expression :: FunctionArgument ( pos) => {
12601269 let name_key = func_ctx. argument_key ( pos) ;
12611270 let name = & self . names [ & name_key] ;
@@ -1770,6 +1779,38 @@ impl<W: Write> Writer<W> {
17701779 Ok ( ( ) )
17711780 }
17721781
1782+ /// Helper method used to write overrides
1783+ ///
1784+ /// # Notes
1785+ /// Ends in a newline
1786+ fn write_override (
1787+ & mut self ,
1788+ module : & Module ,
1789+ handle : Handle < crate :: Override > ,
1790+ ) -> BackendResult {
1791+ let override_ = & module. overrides [ handle] ;
1792+ let name = & self . names [ & NameKey :: Override ( handle) ] ;
1793+
1794+ // Write @id attribute if present
1795+ if let Some ( id) = override_. id {
1796+ write ! ( self . out, "@id({id}) " ) ?;
1797+ }
1798+
1799+ // Write override declaration
1800+ write ! ( self . out, "override {name}: " ) ?;
1801+ self . write_type ( module, override_. ty ) ?;
1802+
1803+ // Write initializer if present
1804+ if let Some ( init) = override_. init {
1805+ write ! ( self . out, " = " ) ?;
1806+ self . write_const_expression ( module, init, & module. global_expressions ) ?;
1807+ }
1808+
1809+ writeln ! ( self . out, ";" ) ?;
1810+
1811+ Ok ( ( ) )
1812+ }
1813+
17731814 // See https://github.com/rust-lang/rust-clippy/issues/4979.
17741815 #[ allow( clippy:: missing_const_for_fn) ]
17751816 pub fn finish ( self ) -> W {
@@ -1795,8 +1836,12 @@ impl TypeContext for WriterTypeContext<'_> {
17951836 unreachable ! ( "the WGSL back end should always provide type handles" ) ;
17961837 }
17971838
1798- fn write_override < W : Write > ( & self , _: Handle < crate :: Override > , _: & mut W ) -> core:: fmt:: Result {
1799- unreachable ! ( "overrides should be validated out" ) ;
1839+ fn write_override < W : Write > (
1840+ & self ,
1841+ handle : Handle < crate :: Override > ,
1842+ out : & mut W ,
1843+ ) -> core:: fmt:: Result {
1844+ write ! ( out, "{}" , self . names[ & NameKey :: Override ( handle) ] )
18001845 }
18011846
18021847 fn write_non_wgsl_inner < W : Write > ( & self , _: & TypeInner , _: & mut W ) -> core:: fmt:: Result {
0 commit comments