@@ -434,14 +434,20 @@ pub fn read_env_from_text(text: &[u8]) -> Option<TargetEnv> {
434434impl 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