Skip to content

Commit 7e41c71

Browse files
authored
Add Vulkan 1.3 and 1.4 capability checks (KhronosGroup#6063)
* Add Vulkan 1.3 and 1.4 capability checks Fixes KhronosGroup#6050 * formatting * add missed caps
1 parent f53aac8 commit 7e41c71

File tree

2 files changed

+447
-0
lines changed

2 files changed

+447
-0
lines changed

source/val/validate_capability.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
70114
bool 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+
175229
bool 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

Comments
 (0)