pub(super) fn adapter_naga_capabilities(
features: wgpu::Features,
downlevel: wgpu::DownlevelCapabilities,
) -> naga::valid::Capabilities {
use naga::valid::Capabilities as Caps;
let mut caps = Caps::empty();
caps.set(
Caps::PUSH_CONSTANT,
features.contains(wgpu::Features::PUSH_CONSTANTS),
);
caps.set(Caps::FLOAT64, features.contains(wgpu::Features::SHADER_F64));
caps.set(
Caps::PRIMITIVE_INDEX,
features.contains(wgpu::Features::SHADER_PRIMITIVE_INDEX),
);
caps.set(
Caps::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
features.contains(
wgpu::Features::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
),
);
caps.set(
Caps::UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING,
features.contains(
wgpu::Features::UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING,
),
);
caps.set(
Caps::SAMPLER_NON_UNIFORM_INDEXING,
features.contains(
wgpu::Features::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
),
);
caps.set(
Caps::STORAGE_TEXTURE_16BIT_NORM_FORMATS,
features.contains(wgpu::Features::TEXTURE_FORMAT_16BIT_NORM),
);
caps.set(
Caps::MULTIVIEW,
features.contains(wgpu::Features::MULTIVIEW),
);
caps.set(
Caps::EARLY_DEPTH_TEST,
features.contains(wgpu::Features::SHADER_EARLY_DEPTH_TEST),
);
caps.set(
Caps::SHADER_INT64,
features.contains(wgpu::Features::SHADER_INT64),
);
caps.set(
Caps::SHADER_INT64_ATOMIC_MIN_MAX,
features.intersects(
wgpu::Features::SHADER_INT64_ATOMIC_MIN_MAX
| wgpu::Features::SHADER_INT64_ATOMIC_ALL_OPS,
),
);
caps.set(
Caps::SHADER_INT64_ATOMIC_ALL_OPS,
features.contains(wgpu::Features::SHADER_INT64_ATOMIC_ALL_OPS),
);
caps.set(
Caps::TEXTURE_ATOMIC,
features.contains(wgpu::Features::TEXTURE_ATOMIC),
);
caps.set(
Caps::TEXTURE_INT64_ATOMIC,
features.contains(wgpu::Features::TEXTURE_INT64_ATOMIC),
);
caps.set(
Caps::SHADER_FLOAT32_ATOMIC,
features.contains(wgpu::Features::SHADER_FLOAT32_ATOMIC),
);
caps.set(
Caps::MULTISAMPLED_SHADING,
downlevel
.flags
.contains(wgpu::DownlevelFlags::MULTISAMPLED_SHADING),
);
caps.set(
Caps::DUAL_SOURCE_BLENDING,
features.contains(wgpu::Features::DUAL_SOURCE_BLENDING),
);
caps.set(
Caps::CUBE_ARRAY_TEXTURES,
downlevel
.flags
.contains(wgpu::DownlevelFlags::CUBE_ARRAY_TEXTURES),
);
caps.set(
Caps::SUBGROUP,
features.intersects(wgpu::Features::SUBGROUP | wgpu::Features::SUBGROUP_VERTEX),
);
caps.set(
Caps::SUBGROUP_BARRIER,
features.intersects(wgpu::Features::SUBGROUP_BARRIER),
);
caps.set(
Caps::RAY_QUERY,
features.intersects(wgpu::Features::EXPERIMENTAL_RAY_QUERY),
);
caps.set(
Caps::SUBGROUP_VERTEX_STAGE,
features.contains(wgpu::Features::SUBGROUP_VERTEX),
);
caps
}