Skip to content

Commit ff64f65

Browse files
committed
Allow all extensions for Universal target environments
The C++ SPIRV-Tools does not validate extensions for Universal target environments - the capability/extension validation pass returns SPV_SUCCESS without checking. The Rust port was incorrectly rejecting Vulkan-only extensions like SPV_EXT_descriptor_indexing for Universal targets. This fix makes Universal environments permissive for extensions, matching both the C++ behavior and the Rust port's own capability handling (which already returns true for all capabilities on Universal).
1 parent 8d91683 commit ff64f65

2 files changed

Lines changed: 86 additions & 173 deletions

File tree

rust/spirv-tools-core/src/target_env.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -434,14 +434,20 @@ pub fn read_env_from_text(text: &[u8]) -> Option<TargetEnv> {
434434
impl TargetEnv {
435435
/// Returns whether an extension is permitted for this target environment.
436436
///
437-
/// The WebGPU environment forbids all extensions. Other environments consult the
438-
/// generated allowlist derived from the extension registry (vendor prefixes and
439-
/// known Vulkan-only/OpenCL-only exceptions) to decide whether a declaration is
440-
/// legal for the target.
437+
/// The WebGPU environment forbids all extensions. Universal environments allow
438+
/// all extensions (matching the C++ SPIRV-Tools behavior where Universal targets
439+
/// have no extension restrictions). Other environments consult the generated
440+
/// allowlist derived from the extension registry.
441441
pub fn is_extension_allowed(self, extension: &ExtensionName) -> bool {
442442
if matches!(self, TargetEnv::WebGpu0) {
443443
return false;
444444
}
445+
// Universal environments allow all extensions, matching the C++ SPIRV-Tools
446+
// behavior where the capability/extension validation pass simply returns
447+
// SPV_SUCCESS for Universal targets without checking.
448+
if self.is_universal() {
449+
return true;
450+
}
445451
let name = extension.as_str();
446452
let normalized = name.to_ascii_lowercase();
447453
if normalized.contains("opencl") {
@@ -802,12 +808,12 @@ mod tests {
802808
use super::ExtensionName;
803809
let nv_ext = ExtensionName::from("SPV_NV_mesh_shader");
804810
assert!(TargetEnv::Vulkan1_2.is_extension_allowed(&nv_ext));
805-
assert!(!TargetEnv::Universal1_6.is_extension_allowed(&nv_ext));
811+
assert!(TargetEnv::Universal1_6.is_extension_allowed(&nv_ext));
806812
assert!(!TargetEnv::OpenCl2_2.is_extension_allowed(&nv_ext));
807813

808814
let nvx_ext = ExtensionName::from("SPV_NVX_multiview_per_view_attributes");
809815
assert!(TargetEnv::Vulkan1_2.is_extension_allowed(&nvx_ext));
810-
assert!(!TargetEnv::Universal1_6.is_extension_allowed(&nvx_ext));
816+
assert!(TargetEnv::Universal1_6.is_extension_allowed(&nvx_ext));
811817
assert!(!TargetEnv::OpenCl2_2.is_extension_allowed(&nvx_ext));
812818

813819
let amd_ext = ExtensionName::from("SPV_AMD_shader_trinary_minmax");
@@ -818,7 +824,7 @@ mod tests {
818824

819825
let amdx_ext = ExtensionName::from("SPV_AMDX_shader_enqueue");
820826
assert!(TargetEnv::Vulkan1_2.is_extension_allowed(&amdx_ext));
821-
assert!(!TargetEnv::Universal1_6.is_extension_allowed(&amdx_ext));
827+
assert!(TargetEnv::Universal1_6.is_extension_allowed(&amdx_ext));
822828
assert!(!TargetEnv::OpenCl1_2.is_extension_allowed(&amdx_ext));
823829

824830
let google_ext = ExtensionName::from("SPV_GOOGLE_decorate_string");
@@ -829,12 +835,12 @@ mod tests {
829835

830836
let qcom_ext = ExtensionName::from("SPV_QCOM_image_processing");
831837
assert!(TargetEnv::Vulkan1_2.is_extension_allowed(&qcom_ext));
832-
assert!(!TargetEnv::Universal1_6.is_extension_allowed(&qcom_ext));
838+
assert!(TargetEnv::Universal1_6.is_extension_allowed(&qcom_ext));
833839
assert!(!TargetEnv::OpenCl1_2.is_extension_allowed(&qcom_ext));
834840

835841
let arm_ext = ExtensionName::from("SPV_ARM_core_builtins");
836842
assert!(TargetEnv::Vulkan1_2.is_extension_allowed(&arm_ext));
837-
assert!(!TargetEnv::Universal1_6.is_extension_allowed(&arm_ext));
843+
assert!(TargetEnv::Universal1_6.is_extension_allowed(&arm_ext));
838844
assert!(!TargetEnv::OpenCl2_2.is_extension_allowed(&arm_ext));
839845
}
840846

0 commit comments

Comments
 (0)