bitflags::bitflags! {
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub struct CapabilityFlags: u32 {
const RAY_QUERY = 1;
const MESH_SHADERS = 1 << 1;
const BINDLESS = 1 << 2;
const TIMESTAMP_QUERIES = 1 << 3;
const SUBGROUP_OPS = 1 << 4;
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub struct TextureFormatCapabilities {
pub sampled: bool,
pub storage_write: bool,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub struct Capabilities {
pub flags: CapabilityFlags,
pub max_storage_buffer_bytes: u64,
pub max_storage_buffers_per_shader_stage: u32,
pub max_texture_dim: u32,
pub max_texture_dim_3d: u32,
pub r32float: TextureFormatCapabilities,
pub rg32float: TextureFormatCapabilities,
pub rgba32float: TextureFormatCapabilities,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub struct RayQueryLimits {
pub max_blas_primitives: u32,
pub max_blas_geometries: u32,
pub max_tlas_instances: u32,
pub max_bindings_per_shader_stage: u32,
}
impl Capabilities {
#[must_use]
pub fn hardware_ray_tracing(&self) -> bool {
self.ray_query()
}
#[must_use]
pub fn ray_query(&self) -> bool {
self.flags.contains(CapabilityFlags::RAY_QUERY)
}
#[must_use]
pub fn mesh_shaders(&self) -> bool {
self.flags.contains(CapabilityFlags::MESH_SHADERS)
}
#[must_use]
pub fn bindless(&self) -> bool {
self.flags.contains(CapabilityFlags::BINDLESS)
}
#[must_use]
pub fn timestamp_queries(&self) -> bool {
self.flags.contains(CapabilityFlags::TIMESTAMP_QUERIES)
}
#[must_use]
pub fn subgroup_ops(&self) -> bool {
self.flags.contains(CapabilityFlags::SUBGROUP_OPS)
}
}
#[cfg(test)]
#[path = "capabilities_tests.rs"]
mod tests;