blob: f46bc2798f3ff9518b4d3fcb25207af582a290a0 [file] [log] [blame] [edit]
// This file is auto-generated by vulkano autogen from vk.xml header version 1.3.238.
// It should not be edited manually. Changes should be made by editing autogen.
fn check_spirv_capability(
device: &Device,
capability: Capability,
) -> Result<(), ShaderSupportError> {
match capability {
Capability::Matrix => (),
Capability::Shader => (),
Capability::InputAttachment => (),
Capability::Sampled1D => (),
Capability::Image1D => (),
Capability::SampledBuffer => (),
Capability::ImageBuffer => (),
Capability::ImageQuery => (),
Capability::DerivativeControl => (),
Capability::Geometry => {
if !(device.enabled_features().geometry_shader) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `geometry_shader`",
]));
}
}
Capability::Tessellation => {
if !(device.enabled_features().tessellation_shader) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `tessellation_shader`",
]));
}
}
Capability::Float64 => {
if !(device.enabled_features().shader_float64) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_float64`",
]));
}
}
Capability::Int64 => {
if !(device.enabled_features().shader_int64) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_int64`",
]));
}
}
Capability::Int64Atomics => {
if !(device.enabled_features().shader_buffer_int64_atomics
|| device.enabled_features().shader_shared_int64_atomics
|| device.enabled_features().shader_image_int64_atomics)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_buffer_int64_atomics`",
"feature `shader_shared_int64_atomics`",
"feature `shader_image_int64_atomics`",
]));
}
}
Capability::AtomicFloat16AddEXT => {
if !(device.enabled_features().shader_buffer_float16_atomic_add
|| device.enabled_features().shader_shared_float16_atomic_add)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_buffer_float16_atomic_add`",
"feature `shader_shared_float16_atomic_add`",
]));
}
}
Capability::AtomicFloat32AddEXT => {
if !(device.enabled_features().shader_buffer_float32_atomic_add
|| device.enabled_features().shader_shared_float32_atomic_add
|| device.enabled_features().shader_image_float32_atomic_add)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_buffer_float32_atomic_add`",
"feature `shader_shared_float32_atomic_add`",
"feature `shader_image_float32_atomic_add`",
]));
}
}
Capability::AtomicFloat64AddEXT => {
if !(device.enabled_features().shader_buffer_float64_atomic_add
|| device.enabled_features().shader_shared_float64_atomic_add)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_buffer_float64_atomic_add`",
"feature `shader_shared_float64_atomic_add`",
]));
}
}
Capability::AtomicFloat16MinMaxEXT => {
if !(device
.enabled_features()
.shader_buffer_float16_atomic_min_max
|| device
.enabled_features()
.shader_shared_float16_atomic_min_max)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_buffer_float16_atomic_min_max`",
"feature `shader_shared_float16_atomic_min_max`",
]));
}
}
Capability::AtomicFloat32MinMaxEXT => {
if !(device
.enabled_features()
.shader_buffer_float32_atomic_min_max
|| device
.enabled_features()
.shader_shared_float32_atomic_min_max
|| device
.enabled_features()
.shader_image_float32_atomic_min_max)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_buffer_float32_atomic_min_max`",
"feature `shader_shared_float32_atomic_min_max`",
"feature `shader_image_float32_atomic_min_max`",
]));
}
}
Capability::AtomicFloat64MinMaxEXT => {
if !(device
.enabled_features()
.shader_buffer_float64_atomic_min_max
|| device
.enabled_features()
.shader_shared_float64_atomic_min_max)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_buffer_float64_atomic_min_max`",
"feature `shader_shared_float64_atomic_min_max`",
]));
}
}
Capability::Int64ImageEXT => {
if !(device.enabled_features().shader_image_int64_atomics) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_image_int64_atomics`",
]));
}
}
Capability::Int16 => {
if !(device.enabled_features().shader_int16) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_int16`",
]));
}
}
Capability::TessellationPointSize => {
if !(device
.enabled_features()
.shader_tessellation_and_geometry_point_size)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_tessellation_and_geometry_point_size`",
]));
}
}
Capability::GeometryPointSize => {
if !(device
.enabled_features()
.shader_tessellation_and_geometry_point_size)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_tessellation_and_geometry_point_size`",
]));
}
}
Capability::ImageGatherExtended => {
if !(device.enabled_features().shader_image_gather_extended) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_image_gather_extended`",
]));
}
}
Capability::StorageImageMultisample => {
if !(device.enabled_features().shader_storage_image_multisample) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_image_multisample`",
]));
}
}
Capability::UniformBufferArrayDynamicIndexing => {
if !(device
.enabled_features()
.shader_uniform_buffer_array_dynamic_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_uniform_buffer_array_dynamic_indexing`",
]));
}
}
Capability::SampledImageArrayDynamicIndexing => {
if !(device
.enabled_features()
.shader_sampled_image_array_dynamic_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_sampled_image_array_dynamic_indexing`",
]));
}
}
Capability::StorageBufferArrayDynamicIndexing => {
if !(device
.enabled_features()
.shader_storage_buffer_array_dynamic_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_buffer_array_dynamic_indexing`",
]));
}
}
Capability::StorageImageArrayDynamicIndexing => {
if !(device
.enabled_features()
.shader_storage_image_array_dynamic_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_image_array_dynamic_indexing`",
]));
}
}
Capability::ClipDistance => {
if !(device.enabled_features().shader_clip_distance) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_clip_distance`",
]));
}
}
Capability::CullDistance => {
if !(device.enabled_features().shader_cull_distance) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_cull_distance`",
]));
}
}
Capability::ImageCubeArray => {
if !(device.enabled_features().image_cube_array) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `image_cube_array`",
]));
}
}
Capability::SampleRateShading => {
if !(device.enabled_features().sample_rate_shading) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `sample_rate_shading`",
]));
}
}
Capability::SparseResidency => {
if !(device.enabled_features().shader_resource_residency) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_resource_residency`",
]));
}
}
Capability::MinLod => {
if !(device.enabled_features().shader_resource_min_lod) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_resource_min_lod`",
]));
}
}
Capability::SampledCubeArray => {
if !(device.enabled_features().image_cube_array) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `image_cube_array`",
]));
}
}
Capability::ImageMSArray => {
if !(device.enabled_features().shader_storage_image_multisample) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_image_multisample`",
]));
}
}
Capability::StorageImageExtendedFormats => (),
Capability::InterpolationFunction => {
if !(device.enabled_features().sample_rate_shading) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `sample_rate_shading`",
]));
}
}
Capability::StorageImageReadWithoutFormat => {
if !(device
.enabled_features()
.shader_storage_image_read_without_format
|| device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_format_feature_flags2)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_image_read_without_format`",
"Vulkan API version 1.1",
"device extension `khr_format_feature_flags2`",
]));
}
}
Capability::StorageImageWriteWithoutFormat => {
if !(device
.enabled_features()
.shader_storage_image_write_without_format
|| device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_format_feature_flags2)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_image_write_without_format`",
"Vulkan API version 1.1",
"device extension `khr_format_feature_flags2`",
]));
}
}
Capability::MultiViewport => {
if !(device.enabled_features().multi_viewport) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `multi_viewport`",
]));
}
}
Capability::DrawParameters => {
if !(device.enabled_features().shader_draw_parameters
|| device.enabled_extensions().khr_shader_draw_parameters)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_draw_parameters`",
"device extension `khr_shader_draw_parameters`",
]));
}
}
Capability::MultiView => {
if !(device.enabled_features().multiview) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `multiview`",
]));
}
}
Capability::DeviceGroup => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_device_group)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_device_group`",
]));
}
}
Capability::VariablePointersStorageBuffer => {
if !(device.enabled_features().variable_pointers_storage_buffer) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `variable_pointers_storage_buffer`",
]));
}
}
Capability::VariablePointers => {
if !(device.enabled_features().variable_pointers) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `variable_pointers`",
]));
}
}
Capability::ShaderClockKHR => {
if !(device.enabled_extensions().khr_shader_clock) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `khr_shader_clock`",
]));
}
}
Capability::StencilExportEXT => {
if !(device.enabled_extensions().ext_shader_stencil_export) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_stencil_export`",
]));
}
}
Capability::SubgroupBallotKHR => {
if !(device.enabled_extensions().ext_shader_subgroup_ballot) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_subgroup_ballot`",
]));
}
}
Capability::SubgroupVoteKHR => {
if !(device.enabled_extensions().ext_shader_subgroup_vote) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_subgroup_vote`",
]));
}
}
Capability::ImageReadWriteLodAMD => {
if !(device.enabled_extensions().amd_shader_image_load_store_lod) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_shader_image_load_store_lod`",
]));
}
}
Capability::ImageGatherBiasLodAMD => {
if !(device.enabled_extensions().amd_texture_gather_bias_lod) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_texture_gather_bias_lod`",
]));
}
}
Capability::FragmentMaskAMD => {
if !(device.enabled_extensions().amd_shader_fragment_mask) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_shader_fragment_mask`",
]));
}
}
Capability::SampleMaskOverrideCoverageNV => {
if !(device.enabled_extensions().nv_sample_mask_override_coverage) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_sample_mask_override_coverage`",
]));
}
}
Capability::GeometryShaderPassthroughNV => {
if !(device.enabled_extensions().nv_geometry_shader_passthrough) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_geometry_shader_passthrough`",
]));
}
}
Capability::ShaderViewportIndex => {
if !(device.enabled_features().shader_output_viewport_index) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_output_viewport_index`",
]));
}
}
Capability::ShaderLayer => {
if !(device.enabled_features().shader_output_layer) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_output_layer`",
]));
}
}
Capability::ShaderViewportIndexLayerEXT => {
if !(device.enabled_extensions().ext_shader_viewport_index_layer
|| device.enabled_extensions().nv_viewport_array2)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_viewport_index_layer`",
"device extension `nv_viewport_array2`",
]));
}
}
Capability::ShaderViewportMaskNV => {
if !(device.enabled_extensions().nv_viewport_array2) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_viewport_array2`",
]));
}
}
Capability::PerViewAttributesNV => {
if !(device
.enabled_extensions()
.nvx_multiview_per_view_attributes)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nvx_multiview_per_view_attributes`",
]));
}
}
Capability::StorageBuffer16BitAccess => {
if !(device.enabled_features().storage_buffer16_bit_access) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `storage_buffer16_bit_access`",
]));
}
}
Capability::UniformAndStorageBuffer16BitAccess => {
if !(device
.enabled_features()
.uniform_and_storage_buffer16_bit_access)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `uniform_and_storage_buffer16_bit_access`",
]));
}
}
Capability::StoragePushConstant16 => {
if !(device.enabled_features().storage_push_constant16) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `storage_push_constant16`",
]));
}
}
Capability::StorageInputOutput16 => {
if !(device.enabled_features().storage_input_output16) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `storage_input_output16`",
]));
}
}
Capability::GroupNonUniform => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::BASIC))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.BASIC`",
]));
}
}
Capability::GroupNonUniformVote => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::VOTE))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.VOTE`",
]));
}
}
Capability::GroupNonUniformArithmetic => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::ARITHMETIC))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.ARITHMETIC`",
]));
}
}
Capability::GroupNonUniformBallot => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::BALLOT))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.BALLOT`",
]));
}
}
Capability::GroupNonUniformShuffle => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::SHUFFLE))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.SHUFFLE`",
]));
}
}
Capability::GroupNonUniformShuffleRelative => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::SHUFFLE_RELATIVE))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.SHUFFLE_RELATIVE`",
]));
}
}
Capability::GroupNonUniformClustered => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::CLUSTERED))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.CLUSTERED`",
]));
}
}
Capability::GroupNonUniformQuad => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::QUAD))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.QUAD`",
]));
}
}
Capability::GroupNonUniformPartitionedNV => {
if !(device
.physical_device()
.properties()
.subgroup_supported_operations
.map(|x| x.intersects(crate::device::physical::SubgroupFeatures::PARTITIONED))
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `subgroup_supported_operations.PARTITIONED`",
]));
}
}
Capability::SampleMaskPostDepthCoverage => {
if !(device.enabled_extensions().ext_post_depth_coverage) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_post_depth_coverage`",
]));
}
}
Capability::ShaderNonUniform => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().ext_descriptor_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `ext_descriptor_indexing`",
]));
}
}
Capability::RuntimeDescriptorArray => {
if !(device.enabled_features().runtime_descriptor_array) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `runtime_descriptor_array`",
]));
}
}
Capability::InputAttachmentArrayDynamicIndexing => {
if !(device
.enabled_features()
.shader_input_attachment_array_dynamic_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_input_attachment_array_dynamic_indexing`",
]));
}
}
Capability::UniformTexelBufferArrayDynamicIndexing => {
if !(device
.enabled_features()
.shader_uniform_texel_buffer_array_dynamic_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_uniform_texel_buffer_array_dynamic_indexing`",
]));
}
}
Capability::StorageTexelBufferArrayDynamicIndexing => {
if !(device
.enabled_features()
.shader_storage_texel_buffer_array_dynamic_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_texel_buffer_array_dynamic_indexing`",
]));
}
}
Capability::UniformBufferArrayNonUniformIndexing => {
if !(device
.enabled_features()
.shader_uniform_buffer_array_non_uniform_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_uniform_buffer_array_non_uniform_indexing`",
]));
}
}
Capability::SampledImageArrayNonUniformIndexing => {
if !(device
.enabled_features()
.shader_sampled_image_array_non_uniform_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_sampled_image_array_non_uniform_indexing`",
]));
}
}
Capability::StorageBufferArrayNonUniformIndexing => {
if !(device
.enabled_features()
.shader_storage_buffer_array_non_uniform_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_buffer_array_non_uniform_indexing`",
]));
}
}
Capability::StorageImageArrayNonUniformIndexing => {
if !(device
.enabled_features()
.shader_storage_image_array_non_uniform_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_image_array_non_uniform_indexing`",
]));
}
}
Capability::InputAttachmentArrayNonUniformIndexing => {
if !(device
.enabled_features()
.shader_input_attachment_array_non_uniform_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_input_attachment_array_non_uniform_indexing`",
]));
}
}
Capability::UniformTexelBufferArrayNonUniformIndexing => {
if !(device
.enabled_features()
.shader_uniform_texel_buffer_array_non_uniform_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_uniform_texel_buffer_array_non_uniform_indexing`",
]));
}
}
Capability::StorageTexelBufferArrayNonUniformIndexing => {
if !(device
.enabled_features()
.shader_storage_texel_buffer_array_non_uniform_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_storage_texel_buffer_array_non_uniform_indexing`",
]));
}
}
Capability::FragmentFullyCoveredEXT => {
if !(device.enabled_extensions().ext_conservative_rasterization) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_conservative_rasterization`",
]));
}
}
Capability::Float16 => {
if !(device.enabled_features().shader_float16
|| device.enabled_extensions().amd_gpu_shader_half_float)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_float16`",
"device extension `amd_gpu_shader_half_float`",
]));
}
}
Capability::Int8 => {
if !(device.enabled_features().shader_int8) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_int8`",
]));
}
}
Capability::StorageBuffer8BitAccess => {
if !(device.enabled_features().storage_buffer8_bit_access) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `storage_buffer8_bit_access`",
]));
}
}
Capability::UniformAndStorageBuffer8BitAccess => {
if !(device
.enabled_features()
.uniform_and_storage_buffer8_bit_access)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `uniform_and_storage_buffer8_bit_access`",
]));
}
}
Capability::StoragePushConstant8 => {
if !(device.enabled_features().storage_push_constant8) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `storage_push_constant8`",
]));
}
}
Capability::VulkanMemoryModel => {
if !(device.enabled_features().vulkan_memory_model) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `vulkan_memory_model`",
]));
}
}
Capability::VulkanMemoryModelDeviceScope => {
if !(device.enabled_features().vulkan_memory_model_device_scope) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `vulkan_memory_model_device_scope`",
]));
}
}
Capability::DenormPreserve => {
if !(device
.physical_device()
.properties()
.shader_denorm_preserve_float16
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_denorm_preserve_float32
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_denorm_preserve_float64
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `shader_denorm_preserve_float16`",
"property `shader_denorm_preserve_float32`",
"property `shader_denorm_preserve_float64`",
]));
}
}
Capability::DenormFlushToZero => {
if !(device
.physical_device()
.properties()
.shader_denorm_flush_to_zero_float16
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_denorm_flush_to_zero_float32
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_denorm_flush_to_zero_float64
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `shader_denorm_flush_to_zero_float16`",
"property `shader_denorm_flush_to_zero_float32`",
"property `shader_denorm_flush_to_zero_float64`",
]));
}
}
Capability::SignedZeroInfNanPreserve => {
if !(device
.physical_device()
.properties()
.shader_signed_zero_inf_nan_preserve_float16
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_signed_zero_inf_nan_preserve_float32
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_signed_zero_inf_nan_preserve_float64
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `shader_signed_zero_inf_nan_preserve_float16`",
"property `shader_signed_zero_inf_nan_preserve_float32`",
"property `shader_signed_zero_inf_nan_preserve_float64`",
]));
}
}
Capability::RoundingModeRTE => {
if !(device
.physical_device()
.properties()
.shader_rounding_mode_rte_float16
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_rounding_mode_rte_float32
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_rounding_mode_rte_float64
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `shader_rounding_mode_rte_float16`",
"property `shader_rounding_mode_rte_float32`",
"property `shader_rounding_mode_rte_float64`",
]));
}
}
Capability::RoundingModeRTZ => {
if !(device
.physical_device()
.properties()
.shader_rounding_mode_rtz_float16
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_rounding_mode_rtz_float32
.unwrap_or(false)
|| device
.physical_device()
.properties()
.shader_rounding_mode_rtz_float64
.unwrap_or(false))
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"property `shader_rounding_mode_rtz_float16`",
"property `shader_rounding_mode_rtz_float32`",
"property `shader_rounding_mode_rtz_float64`",
]));
}
}
Capability::ComputeDerivativeGroupQuadsNV => {
if !(device.enabled_features().compute_derivative_group_quads) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `compute_derivative_group_quads`",
]));
}
}
Capability::ComputeDerivativeGroupLinearNV => {
if !(device.enabled_features().compute_derivative_group_linear) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `compute_derivative_group_linear`",
]));
}
}
Capability::FragmentBarycentricKHR => {
if !(device.enabled_features().fragment_shader_barycentric
|| device.enabled_features().fragment_shader_barycentric)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `fragment_shader_barycentric`",
"feature `fragment_shader_barycentric`",
]));
}
}
Capability::ImageFootprintNV => {
if !(device.enabled_features().image_footprint) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `image_footprint`",
]));
}
}
Capability::FragmentDensityEXT => {
if !(device.enabled_features().shading_rate_image
|| device.enabled_features().fragment_density_map)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shading_rate_image`",
"feature `fragment_density_map`",
]));
}
}
Capability::MeshShadingNV => {
if !(device.enabled_extensions().nv_mesh_shader) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_mesh_shader`",
]));
}
}
Capability::RayTracingKHR => {
if !(device.enabled_features().ray_tracing_pipeline) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `ray_tracing_pipeline`",
]));
}
}
Capability::RayQueryKHR => {
if !(device.enabled_features().ray_query) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `ray_query`",
]));
}
}
Capability::RayTraversalPrimitiveCullingKHR => {
if !(device.enabled_features().ray_traversal_primitive_culling
|| device.enabled_features().ray_query)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `ray_traversal_primitive_culling`",
"feature `ray_query`",
]));
}
}
Capability::RayTracingNV => {
if !(device.enabled_extensions().nv_ray_tracing) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_ray_tracing`",
]));
}
}
Capability::RayTracingMotionBlurNV => {
if !(device.enabled_features().ray_tracing_motion_blur) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `ray_tracing_motion_blur`",
]));
}
}
Capability::TransformFeedback => {
if !(device.enabled_features().transform_feedback) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `transform_feedback`",
]));
}
}
Capability::GeometryStreams => {
if !(device.enabled_features().geometry_streams) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `geometry_streams`",
]));
}
}
Capability::PhysicalStorageBufferAddresses => {
if !(device.enabled_features().buffer_device_address) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `buffer_device_address`",
]));
}
}
Capability::CooperativeMatrixNV => {
if !(device.enabled_features().cooperative_matrix) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `cooperative_matrix`",
]));
}
}
Capability::IntegerFunctions2INTEL => {
if !(device.enabled_features().shader_integer_functions2) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_integer_functions2`",
]));
}
}
Capability::ShaderSMBuiltinsNV => {
if !(device.enabled_features().shader_sm_builtins) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_sm_builtins`",
]));
}
}
Capability::FragmentShaderSampleInterlockEXT => {
if !(device.enabled_features().fragment_shader_sample_interlock) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `fragment_shader_sample_interlock`",
]));
}
}
Capability::FragmentShaderPixelInterlockEXT => {
if !(device.enabled_features().fragment_shader_pixel_interlock) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `fragment_shader_pixel_interlock`",
]));
}
}
Capability::FragmentShaderShadingRateInterlockEXT => {
if !(device
.enabled_features()
.fragment_shader_shading_rate_interlock
|| device.enabled_features().shading_rate_image)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `fragment_shader_shading_rate_interlock`",
"feature `shading_rate_image`",
]));
}
}
Capability::DemoteToHelperInvocation => {
if !(device.enabled_features().shader_demote_to_helper_invocation) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_demote_to_helper_invocation`",
]));
}
}
Capability::FragmentShadingRateKHR => {
if !(device.enabled_features().pipeline_fragment_shading_rate
|| device.enabled_features().primitive_fragment_shading_rate
|| device.enabled_features().attachment_fragment_shading_rate)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `pipeline_fragment_shading_rate`",
"feature `primitive_fragment_shading_rate`",
"feature `attachment_fragment_shading_rate`",
]));
}
}
Capability::WorkgroupMemoryExplicitLayoutKHR => {
if !(device.enabled_features().workgroup_memory_explicit_layout) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `workgroup_memory_explicit_layout`",
]));
}
}
Capability::WorkgroupMemoryExplicitLayout8BitAccessKHR => {
if !(device
.enabled_features()
.workgroup_memory_explicit_layout8_bit_access)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `workgroup_memory_explicit_layout8_bit_access`",
]));
}
}
Capability::WorkgroupMemoryExplicitLayout16BitAccessKHR => {
if !(device
.enabled_features()
.workgroup_memory_explicit_layout16_bit_access)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `workgroup_memory_explicit_layout16_bit_access`",
]));
}
}
Capability::DotProductInputAll => {
if !(device.enabled_features().shader_integer_dot_product) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_integer_dot_product`",
]));
}
}
Capability::DotProductInput4x8Bit => {
if !(device.enabled_features().shader_integer_dot_product) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_integer_dot_product`",
]));
}
}
Capability::DotProductInput4x8BitPacked => {
if !(device.enabled_features().shader_integer_dot_product) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_integer_dot_product`",
]));
}
}
Capability::DotProduct => {
if !(device.enabled_features().shader_integer_dot_product) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"feature `shader_integer_dot_product`",
]));
}
}
_ => return Err(ShaderSupportError::NotSupportedByVulkan),
}
Ok(())
}
fn check_spirv_extension(device: &Device, extension: &str) -> Result<(), ShaderSupportError> {
match extension {
"SPV_KHR_variable_pointers" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_variable_pointers)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_variable_pointers`",
]));
}
}
"SPV_AMD_shader_explicit_vertex_parameter" => {
if !(device
.enabled_extensions()
.amd_shader_explicit_vertex_parameter)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_shader_explicit_vertex_parameter`",
]));
}
}
"SPV_AMD_gcn_shader" => {
if !(device.enabled_extensions().amd_gcn_shader) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_gcn_shader`",
]));
}
}
"SPV_AMD_gpu_shader_half_float" => {
if !(device.enabled_extensions().amd_gpu_shader_half_float) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_gpu_shader_half_float`",
]));
}
}
"SPV_AMD_gpu_shader_int16" => {
if !(device.enabled_extensions().amd_gpu_shader_int16) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_gpu_shader_int16`",
]));
}
}
"SPV_AMD_shader_ballot" => {
if !(device.enabled_extensions().amd_shader_ballot) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_shader_ballot`",
]));
}
}
"SPV_AMD_shader_fragment_mask" => {
if !(device.enabled_extensions().amd_shader_fragment_mask) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_shader_fragment_mask`",
]));
}
}
"SPV_AMD_shader_image_load_store_lod" => {
if !(device.enabled_extensions().amd_shader_image_load_store_lod) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_shader_image_load_store_lod`",
]));
}
}
"SPV_AMD_shader_trinary_minmax" => {
if !(device.enabled_extensions().amd_shader_trinary_minmax) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_shader_trinary_minmax`",
]));
}
}
"SPV_AMD_texture_gather_bias_lod" => {
if !(device.enabled_extensions().amd_texture_gather_bias_lod) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_texture_gather_bias_lod`",
]));
}
}
"SPV_AMD_shader_early_and_late_fragment_tests" => {
if !(device
.enabled_extensions()
.amd_shader_early_and_late_fragment_tests)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `amd_shader_early_and_late_fragment_tests`",
]));
}
}
"SPV_KHR_shader_draw_parameters" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_shader_draw_parameters)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_shader_draw_parameters`",
]));
}
}
"SPV_KHR_8bit_storage" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_8bit_storage)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_8bit_storage`",
]));
}
}
"SPV_KHR_16bit_storage" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_16bit_storage)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_16bit_storage`",
]));
}
}
"SPV_KHR_shader_clock" => {
if !(device.enabled_extensions().khr_shader_clock) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `khr_shader_clock`",
]));
}
}
"SPV_KHR_float_controls" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_shader_float_controls)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_shader_float_controls`",
]));
}
}
"SPV_KHR_storage_buffer_storage_class" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_storage_buffer_storage_class)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_storage_buffer_storage_class`",
]));
}
}
"SPV_KHR_post_depth_coverage" => {
if !(device.enabled_extensions().ext_post_depth_coverage) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_post_depth_coverage`",
]));
}
}
"SPV_EXT_shader_stencil_export" => {
if !(device.enabled_extensions().ext_shader_stencil_export) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_stencil_export`",
]));
}
}
"SPV_KHR_shader_ballot" => {
if !(device.enabled_extensions().ext_shader_subgroup_ballot) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_subgroup_ballot`",
]));
}
}
"SPV_KHR_subgroup_vote" => {
if !(device.enabled_extensions().ext_shader_subgroup_vote) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_subgroup_vote`",
]));
}
}
"SPV_NV_sample_mask_override_coverage" => {
if !(device.enabled_extensions().nv_sample_mask_override_coverage) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_sample_mask_override_coverage`",
]));
}
}
"SPV_NV_geometry_shader_passthrough" => {
if !(device.enabled_extensions().nv_geometry_shader_passthrough) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_geometry_shader_passthrough`",
]));
}
}
"SPV_NV_mesh_shader" => {
if !(device.enabled_extensions().nv_mesh_shader) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_mesh_shader`",
]));
}
}
"SPV_NV_viewport_array2" => {
if !(device.enabled_extensions().nv_viewport_array2) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_viewport_array2`",
]));
}
}
"SPV_NV_shader_subgroup_partitioned" => {
if !(device.enabled_extensions().nv_shader_subgroup_partitioned) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_shader_subgroup_partitioned`",
]));
}
}
"SPV_NV_shader_invocation_reorder" => {
if !(device
.enabled_extensions()
.nv_ray_tracing_invocation_reorder)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_ray_tracing_invocation_reorder`",
]));
}
}
"SPV_EXT_shader_viewport_index_layer" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().ext_shader_viewport_index_layer)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `ext_shader_viewport_index_layer`",
]));
}
}
"SPV_NVX_multiview_per_view_attributes" => {
if !(device
.enabled_extensions()
.nvx_multiview_per_view_attributes)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nvx_multiview_per_view_attributes`",
]));
}
}
"SPV_EXT_descriptor_indexing" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().ext_descriptor_indexing)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `ext_descriptor_indexing`",
]));
}
}
"SPV_KHR_vulkan_memory_model" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_vulkan_memory_model)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_vulkan_memory_model`",
]));
}
}
"SPV_NV_compute_shader_derivatives" => {
if !(device.enabled_extensions().nv_compute_shader_derivatives) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_compute_shader_derivatives`",
]));
}
}
"SPV_NV_fragment_shader_barycentric" => {
if !(device.enabled_extensions().nv_fragment_shader_barycentric) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_fragment_shader_barycentric`",
]));
}
}
"SPV_NV_shader_image_footprint" => {
if !(device.enabled_extensions().nv_shader_image_footprint) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_shader_image_footprint`",
]));
}
}
"SPV_NV_shading_rate" => {
if !(device.enabled_extensions().nv_shading_rate_image) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_shading_rate_image`",
]));
}
}
"SPV_NV_ray_tracing" => {
if !(device.enabled_extensions().nv_ray_tracing) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_ray_tracing`",
]));
}
}
"SPV_KHR_ray_tracing" => {
if !(device.enabled_extensions().khr_ray_tracing_pipeline) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `khr_ray_tracing_pipeline`",
]));
}
}
"SPV_KHR_ray_query" => {
if !(device.enabled_extensions().khr_ray_query) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `khr_ray_query`",
]));
}
}
"SPV_KHR_ray_cull_mask" => {
if !(device.enabled_extensions().khr_ray_tracing_maintenance1) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `khr_ray_tracing_maintenance1`",
]));
}
}
"SPV_GOOGLE_hlsl_functionality1" => {
if !(device.enabled_extensions().google_hlsl_functionality1) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `google_hlsl_functionality1`",
]));
}
}
"SPV_GOOGLE_user_type" => {
if !(device.enabled_extensions().google_user_type) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `google_user_type`",
]));
}
}
"SPV_GOOGLE_decorate_string" => {
if !(device.enabled_extensions().google_decorate_string) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `google_decorate_string`",
]));
}
}
"SPV_EXT_fragment_invocation_density" => {
if !(device.enabled_extensions().ext_fragment_density_map) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_fragment_density_map`",
]));
}
}
"SPV_KHR_physical_storage_buffer" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_buffer_device_address)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_buffer_device_address`",
]));
}
}
"SPV_EXT_physical_storage_buffer" => {
if !(device.enabled_extensions().ext_buffer_device_address) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_buffer_device_address`",
]));
}
}
"SPV_NV_cooperative_matrix" => {
if !(device.enabled_extensions().nv_cooperative_matrix) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_cooperative_matrix`",
]));
}
}
"SPV_NV_shader_sm_builtins" => {
if !(device.enabled_extensions().nv_shader_sm_builtins) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `nv_shader_sm_builtins`",
]));
}
}
"SPV_EXT_fragment_shader_interlock" => {
if !(device.enabled_extensions().ext_fragment_shader_interlock) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_fragment_shader_interlock`",
]));
}
}
"SPV_EXT_demote_to_helper_invocation" => {
if !(device.api_version() >= Version::V1_1
|| device
.enabled_extensions()
.ext_shader_demote_to_helper_invocation)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `ext_shader_demote_to_helper_invocation`",
]));
}
}
"SPV_KHR_fragment_shading_rate" => {
if !(device.enabled_extensions().khr_fragment_shading_rate) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `khr_fragment_shading_rate`",
]));
}
}
"SPV_KHR_non_semantic_info" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_shader_non_semantic_info)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_shader_non_semantic_info`",
]));
}
}
"SPV_EXT_shader_image_int64" => {
if !(device.enabled_extensions().ext_shader_image_atomic_int64) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_image_atomic_int64`",
]));
}
}
"SPV_KHR_terminate_invocation" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_shader_terminate_invocation)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_shader_terminate_invocation`",
]));
}
}
"SPV_KHR_multiview" => {
if !(device.api_version() >= Version::V1_1 || device.enabled_extensions().khr_multiview)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_multiview`",
]));
}
}
"SPV_KHR_workgroup_memory_explicit_layout" => {
if !(device
.enabled_extensions()
.khr_workgroup_memory_explicit_layout)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `khr_workgroup_memory_explicit_layout`",
]));
}
}
"SPV_EXT_shader_atomic_float_add" => {
if !(device.enabled_extensions().ext_shader_atomic_float) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_atomic_float`",
]));
}
}
"SPV_KHR_fragment_shader_barycentric" => {
if !(device.enabled_extensions().khr_fragment_shader_barycentric) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `khr_fragment_shader_barycentric`",
]));
}
}
"SPV_KHR_subgroup_uniform_control_flow" => {
if !(device.api_version() >= Version::V1_1
|| device
.enabled_extensions()
.khr_shader_subgroup_uniform_control_flow)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_shader_subgroup_uniform_control_flow`",
]));
}
}
"SPV_EXT_shader_atomic_float_min_max" => {
if !(device.enabled_extensions().ext_shader_atomic_float2) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_atomic_float2`",
]));
}
}
"SPV_EXT_shader_atomic_float16_add" => {
if !(device.enabled_extensions().ext_shader_atomic_float2) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_shader_atomic_float2`",
]));
}
}
"SPV_KHR_integer_dot_product" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_shader_integer_dot_product)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_shader_integer_dot_product`",
]));
}
}
"SPV_INTEL_shader_integer_functions" => {
if !(device.enabled_extensions().intel_shader_integer_functions2) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `intel_shader_integer_functions2`",
]));
}
}
"SPV_KHR_device_group" => {
if !(device.api_version() >= Version::V1_1
|| device.enabled_extensions().khr_device_group)
{
return Err(ShaderSupportError::RequirementsNotMet(&[
"Vulkan API version 1.1",
"device extension `khr_device_group`",
]));
}
}
"SPV_QCOM_image_processing" => {
if !(device.enabled_extensions().qcom_image_processing) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `qcom_image_processing`",
]));
}
}
"SPV_EXT_mesh_shader" => {
if !(device.enabled_extensions().ext_mesh_shader) {
return Err(ShaderSupportError::RequirementsNotMet(&[
"device extension `ext_mesh_shader`",
]));
}
}
_ => return Err(ShaderSupportError::NotSupportedByVulkan),
}
Ok(())
}