Skip to content

Commit 0dd6a1c

Browse files
committed
[naga] Retain unnamed overrides' types during compaction.
Ensure that unnamed overrides' types are retained, even when the overrides are used only by global expressions. Add a test case. Fixes #7072.
1 parent c934184 commit 0dd6a1c

File tree

2 files changed

+76
-10
lines changed

2 files changed

+76
-10
lines changed

naga/src/compact/expressions.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ impl ExpressionTracer<'_> {
103103
}
104104
Ex::Override(handle) => {
105105
self.overrides_used.insert(handle);
106-
if let Some(init) = self.overrides[handle].init {
106+
let r#override = &self.overrides[handle];
107+
self.types_used.insert(r#override.ty);
108+
if let Some(init) = r#override.init {
107109
match self.global_expressions_used {
108110
Some(ref mut used) => used.insert(init),
109111
None => self.expressions_used.insert(init),

naga/src/compact/mod.rs

+73-9
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ pub fn compact(module: &mut crate::Module) {
127127
if r#override.name.is_some() {
128128
log::trace!("tracing override {:?}", r#override.name.as_ref().unwrap());
129129
module_tracer.overrides_used.insert(handle);
130+
module_tracer.types_used.insert(r#override.ty);
130131
if let Some(init) = r#override.init {
131132
module_tracer.global_expressions_used.insert(init);
132133
}
@@ -171,15 +172,6 @@ pub fn compact(module: &mut crate::Module) {
171172
})
172173
.collect();
173174

174-
// Overrides' initializers are taken care of already, because
175-
// expression tracing sees through overrides. But we still need to
176-
// note type usage.
177-
for (handle, r#override) in module.overrides.iter() {
178-
if module_tracer.overrides_used.contains(handle) {
179-
module_tracer.types_used.insert(r#override.ty);
180-
}
181-
}
182-
183175
// Treat all named types as used.
184176
for (handle, ty) in module.types.iter() {
185177
log::trace!("tracing type {:?}, name {:?}", handle, ty.name);
@@ -1006,3 +998,75 @@ fn unnamed_constant_type() {
1006998
compact(&mut module);
1007999
assert!(validator.validate(&module).is_ok());
10081000
}
1001+
1002+
#[test]
1003+
fn unnamed_override_type() {
1004+
let mut module = crate::Module::default();
1005+
let nowhere = crate::Span::default();
1006+
1007+
// This type is used only by the unnamed override.
1008+
let ty_u32 = module.types.insert(
1009+
crate::Type {
1010+
name: None,
1011+
inner: crate::TypeInner::Scalar(crate::Scalar::U32),
1012+
},
1013+
nowhere,
1014+
);
1015+
1016+
// This type is used by the named override.
1017+
let ty_i32 = module.types.insert(
1018+
crate::Type {
1019+
name: None,
1020+
inner: crate::TypeInner::Scalar(crate::Scalar::I32),
1021+
},
1022+
nowhere,
1023+
);
1024+
1025+
let unnamed_init = module
1026+
.global_expressions
1027+
.append(crate::Expression::Literal(crate::Literal::U32(0)), nowhere);
1028+
1029+
let unnamed_override = module.overrides.append(
1030+
crate::Override {
1031+
name: None,
1032+
id: Some(42),
1033+
ty: ty_u32,
1034+
init: Some(unnamed_init),
1035+
},
1036+
nowhere,
1037+
);
1038+
1039+
// The named override is initialized using a Splat expression, to
1040+
// give the named override a type distinct from the unnamed
1041+
// override's.
1042+
let unnamed_override_expr = module
1043+
.global_expressions
1044+
.append(crate::Expression::Override(unnamed_override), nowhere);
1045+
let named_init = module.global_expressions.append(
1046+
crate::Expression::As {
1047+
expr: unnamed_override_expr,
1048+
kind: crate::ScalarKind::Sint,
1049+
convert: None,
1050+
},
1051+
nowhere,
1052+
);
1053+
1054+
let _named_override = module.overrides.append(
1055+
crate::Override {
1056+
name: Some("totally_named".to_string()),
1057+
id: None,
1058+
ty: ty_i32,
1059+
init: Some(named_init),
1060+
},
1061+
nowhere,
1062+
);
1063+
1064+
let mut validator = super::valid::Validator::new(
1065+
super::valid::ValidationFlags::all(),
1066+
super::valid::Capabilities::all(),
1067+
);
1068+
1069+
assert!(validator.validate(&module).is_ok());
1070+
compact(&mut module);
1071+
assert!(validator.validate(&module).is_ok());
1072+
}

0 commit comments

Comments
 (0)