@@ -67,6 +67,50 @@ bool IsSupportGuaranteedVulkan_1_2(uint32_t capability) {
67
67
return false ;
68
68
}
69
69
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
+
70
114
bool IsSupportOptionalVulkan_1_0 (uint32_t capability) {
71
115
switch (spv::Capability (capability)) {
72
116
case spv::Capability::Geometry:
@@ -172,6 +216,16 @@ bool IsSupportOptionalVulkan_1_2(uint32_t capability) {
172
216
return false ;
173
217
}
174
218
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
+
175
229
bool IsSupportGuaranteedOpenCL_1_2 (uint32_t capability, bool embedded_profile) {
176
230
switch (spv::Capability (capability)) {
177
231
case spv::Capability::Addresses:
@@ -341,6 +395,24 @@ spv_result_t CapabilityPass(ValidationState_t& _, const Instruction* inst) {
341
395
<< " is not allowed by Vulkan 1.2 specification"
342
396
<< " (or requires extension)" ;
343
397
}
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
+ }
344
416
} else if (env == SPV_ENV_OPENCL_1_2 || env == SPV_ENV_OPENCL_EMBEDDED_1_2) {
345
417
if (!IsSupportGuaranteedOpenCL_1_2 (capability, opencl_embedded) &&
346
418
!IsSupportOptionalOpenCL_1_2 (capability) &&
0 commit comments