diff --git a/src/back/spv/mod.rs b/src/back/spv/mod.rs index 1e10d2e9c6..642c0c7d1b 100644 --- a/src/back/spv/mod.rs +++ b/src/back/spv/mod.rs @@ -595,10 +595,10 @@ pub struct Writer { /// /// If `capabilities_available` is `Some`, then this is always a subset of /// that. - capabilities_used: crate::FastHashSet, + capabilities_used: crate::FastIndexSet, /// The set of spirv extensions used. - extensions_used: crate::FastHashSet<&'static str>, + extensions_used: crate::FastIndexSet<&'static str>, debugs: Vec, annotations: Vec, diff --git a/src/back/spv/recyclable.rs b/src/back/spv/recyclable.rs index 49f3a02741..cd1466e3c7 100644 --- a/src/back/spv/recyclable.rs +++ b/src/back/spv/recyclable.rs @@ -52,6 +52,13 @@ impl Recyclable for std::collections::HashSet { } } +impl Recyclable for indexmap::IndexSet { + fn recycle(mut self) -> Self { + self.clear(); + self + } +} + impl Recyclable for std::collections::BTreeMap { fn recycle(mut self) -> Self { self.clear(); diff --git a/src/back/spv/writer.rs b/src/back/spv/writer.rs index 64e27fae13..4a1bc8ff20 100644 --- a/src/back/spv/writer.rs +++ b/src/back/spv/writer.rs @@ -47,7 +47,7 @@ impl Writer { } let raw_version = ((major as u32) << 16) | ((minor as u32) << 8); - let mut capabilities_used = crate::FastHashSet::default(); + let mut capabilities_used = crate::FastIndexSet::default(); capabilities_used.insert(spirv::Capability::Shader); let mut id_gen = IdGenerator::default(); @@ -60,7 +60,7 @@ impl Writer { id_gen, capabilities_available: options.capabilities.clone(), capabilities_used, - extensions_used: crate::FastHashSet::default(), + extensions_used: crate::FastIndexSet::default(), debugs: vec![], annotations: vec![], flags: options.flags, @@ -1936,7 +1936,7 @@ impl Writer { } /// Return the set of capabilities the last module written used. - pub const fn get_capabilities_used(&self) -> &crate::FastHashSet { + pub const fn get_capabilities_used(&self) -> &crate::FastIndexSet { &self.capabilities_used } diff --git a/src/lib.rs b/src/lib.rs index 7ac59be50e..2d50e74349 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -254,6 +254,11 @@ pub type FastHashMap = rustc_hash::FxHashMap; /// Hash set that is faster but not resilient to DoS attacks. pub type FastHashSet = rustc_hash::FxHashSet; +/// Insertion-order-preserving hash set (`IndexSet`), but with the same +/// hasher as `FastHashSet` (faster but not resilient to DoS attacks). +pub type FastIndexSet = + indexmap::IndexSet>; + /// Map of expressions that have associated variable names pub(crate) type NamedExpressions = indexmap::IndexMap< Handle, diff --git a/tests/out/spv/bounds-check-image-restrict.spvasm b/tests/out/spv/bounds-check-image-restrict.spvasm index bfddef3938..c884210046 100644 --- a/tests/out/spv/bounds-check-image-restrict.spvasm +++ b/tests/out/spv/bounds-check-image-restrict.spvasm @@ -2,10 +2,10 @@ ; Version: 1.1 ; Generator: rspirv ; Bound: 310 -OpCapability ImageQuery -OpCapability Image1D OpCapability Shader OpCapability Sampled1D +OpCapability Image1D +OpCapability ImageQuery %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %269 "fragment_shader" %267 diff --git a/tests/out/spv/bounds-check-image-rzsw.spvasm b/tests/out/spv/bounds-check-image-rzsw.spvasm index 6228f45f91..e5e12fabd3 100644 --- a/tests/out/spv/bounds-check-image-rzsw.spvasm +++ b/tests/out/spv/bounds-check-image-rzsw.spvasm @@ -2,10 +2,10 @@ ; Version: 1.1 ; Generator: rspirv ; Bound: 347 -OpCapability ImageQuery -OpCapability Image1D OpCapability Shader OpCapability Sampled1D +OpCapability Image1D +OpCapability ImageQuery %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %306 "fragment_shader" %304 diff --git a/tests/out/spv/image.spvasm b/tests/out/spv/image.spvasm index 7b9aa5ed63..6b94b3e27a 100644 --- a/tests/out/spv/image.spvasm +++ b/tests/out/spv/image.spvasm @@ -2,11 +2,11 @@ ; Version: 1.1 ; Generator: rspirv ; Bound: 546 -OpCapability SampledCubeArray -OpCapability ImageQuery -OpCapability Image1D OpCapability Shader +OpCapability Image1D OpCapability Sampled1D +OpCapability SampledCubeArray +OpCapability ImageQuery %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %82 "main" %79 diff --git a/tests/out/spv/ray-query.spvasm b/tests/out/spv/ray-query.spvasm index 03a43966e7..2445b31697 100644 --- a/tests/out/spv/ray-query.spvasm +++ b/tests/out/spv/ray-query.spvasm @@ -2,8 +2,8 @@ ; Version: 1.4 ; Generator: rspirv ; Bound: 95 -OpCapability RayQueryKHR OpCapability Shader +OpCapability RayQueryKHR OpExtension "SPV_KHR_ray_query" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 diff --git a/tests/spirv-capabilities.rs b/tests/spirv-capabilities.rs index 2545909288..f269182859 100644 --- a/tests/spirv-capabilities.rs +++ b/tests/spirv-capabilities.rs @@ -6,7 +6,7 @@ Test SPIR-V backend capability checks. use spirv::Capability as Ca; -fn capabilities_used(source: &str) -> naga::FastHashSet { +fn capabilities_used(source: &str) -> naga::FastIndexSet { use naga::back::spv; use naga::valid; @@ -36,7 +36,7 @@ fn require_and_forbid(required: &[Ca], forbidden: &[Ca], source: &str) { let missing_caps: Vec<_> = required .iter() - .filter(|cap| !caps_used.contains(cap)) + .filter(|&cap| !caps_used.contains(cap)) .cloned() .collect(); if !missing_caps.is_empty() { @@ -45,7 +45,7 @@ fn require_and_forbid(required: &[Ca], forbidden: &[Ca], source: &str) { let forbidden_caps: Vec<_> = forbidden .iter() - .filter(|cap| caps_used.contains(cap)) + .filter(|&cap| caps_used.contains(cap)) .cloned() .collect(); if !forbidden_caps.is_empty() {