@@ -67,6 +67,50 @@ bool IsSupportGuaranteedVulkan_1_2(uint32_t capability) {
6767 return false ;
6868}
6969
70+ bool IsSupportGuaranteedVulkan_1_3 (uint32_t capability) {
71+ if (IsSupportGuaranteedVulkan_1_2 (capability)) return true ;
72+ switch (spv::Capability (capability)) {
73+ case spv::Capability::DotProduct:
74+ case spv::Capability::DotProductInputAll:
75+ case spv::Capability::DotProductInput4x8Bit:
76+ case spv::Capability::DotProductInput4x8BitPacked:
77+ case spv::Capability::VulkanMemoryModel:
78+ case spv::Capability::VulkanMemoryModelDeviceScope:
79+ case spv::Capability::PhysicalStorageBufferAddresses:
80+ case spv::Capability::DemoteToHelperInvocation:
81+ return true ;
82+ default :
83+ break ;
84+ }
85+ return false ;
86+ }
87+
88+ bool IsSupportGuaranteedVulkan_1_4 (uint32_t capability) {
89+ if (IsSupportGuaranteedVulkan_1_3 (capability)) return true ;
90+ switch (spv::Capability (capability)) {
91+ case spv::Capability::UniformBufferArrayDynamicIndexing:
92+ case spv::Capability::SampledImageArrayDynamicIndexing:
93+ case spv::Capability::StorageBufferArrayDynamicIndexing:
94+ case spv::Capability::StorageImageArrayDynamicIndexing:
95+ case spv::Capability::Int16:
96+ case spv::Capability::StorageBuffer16BitAccess:
97+ case spv::Capability::VariablePointers:
98+ case spv::Capability::VariablePointersStorageBuffer:
99+ case spv::Capability::UniformTexelBufferArrayDynamicIndexing:
100+ case spv::Capability::StorageTexelBufferArrayDynamicIndexing:
101+ case spv::Capability::Int8:
102+ case spv::Capability::StorageBuffer8BitAccess:
103+ case spv::Capability::FloatControls2:
104+ case spv::Capability::SampleRateShading:
105+ case spv::Capability::StorageImageExtendedFormats:
106+ case spv::Capability::ImageGatherExtended:
107+ return true ;
108+ default :
109+ break ;
110+ }
111+ return false ;
112+ }
113+
70114bool IsSupportOptionalVulkan_1_0 (uint32_t capability) {
71115 switch (spv::Capability (capability)) {
72116 case spv::Capability::Geometry:
@@ -172,6 +216,16 @@ bool IsSupportOptionalVulkan_1_2(uint32_t capability) {
172216 return false ;
173217}
174218
219+ // Vulkan 1.3 only added required features.
220+ bool IsSupportOptionalVulkan_1_3 (uint32_t capability) {
221+ return IsSupportOptionalVulkan_1_2 (capability);
222+ }
223+
224+ // Vulkan 1.4 only added required features.
225+ bool IsSupportOptionalVulkan_1_4 (uint32_t capability) {
226+ return IsSupportOptionalVulkan_1_3 (capability);
227+ }
228+
175229bool IsSupportGuaranteedOpenCL_1_2 (uint32_t capability, bool embedded_profile) {
176230 switch (spv::Capability (capability)) {
177231 case spv::Capability::Addresses:
@@ -341,6 +395,24 @@ spv_result_t CapabilityPass(ValidationState_t& _, const Instruction* inst) {
341395 << " is not allowed by Vulkan 1.2 specification"
342396 << " (or requires extension)" ;
343397 }
398+ } else if (env == SPV_ENV_VULKAN_1_3) {
399+ if (!IsSupportGuaranteedVulkan_1_3 (capability) &&
400+ !IsSupportOptionalVulkan_1_3 (capability) &&
401+ !IsEnabledByExtension (_, capability)) {
402+ return _.diag (SPV_ERROR_INVALID_CAPABILITY, inst)
403+ << " Capability " << capability_str ()
404+ << " is not allowed by Vulkan 1.3 specification"
405+ << " (or requires extension)" ;
406+ }
407+ } else if (env == SPV_ENV_VULKAN_1_4) {
408+ if (!IsSupportGuaranteedVulkan_1_4 (capability) &&
409+ !IsSupportOptionalVulkan_1_4 (capability) &&
410+ !IsEnabledByExtension (_, capability)) {
411+ return _.diag (SPV_ERROR_INVALID_CAPABILITY, inst)
412+ << " Capability " << capability_str ()
413+ << " is not allowed by Vulkan 1.4 specification"
414+ << " (or requires extension)" ;
415+ }
344416 } else if (env == SPV_ENV_OPENCL_1_2 || env == SPV_ENV_OPENCL_EMBEDDED_1_2) {
345417 if (!IsSupportGuaranteedOpenCL_1_2 (capability, opencl_embedded) &&
346418 !IsSupportOptionalOpenCL_1_2 (capability) &&
0 commit comments