// Copyright (c) 2016 The vulkano developers // Licensed under the Apache License, Version 2.0 // or the MIT // license , // at your option. All files in the project carrying such // notice may not be copied, modified, or distributed except // according to those terms. use std::{ error::Error, fmt::{Display, Error as FmtError, Formatter}, }; // Generated by build.rs include!(concat!(env!("OUT_DIR"), "/features.rs")); /// An error that can happen when enabling a feature on a device. #[derive(Clone, Copy, Debug)] pub struct FeatureRestrictionError { /// The feature in question. pub feature: &'static str, /// The restriction that was not met. pub restriction: FeatureRestriction, } impl Error for FeatureRestrictionError {} impl Display for FeatureRestrictionError { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), FmtError> { write!( f, "a restriction for the feature {} was not met: {}", self.feature, self.restriction, ) } } #[derive(Clone, Copy, Debug)] pub enum FeatureRestriction { /// Not supported by the physical device. NotSupported, /// Requires a feature to be enabled. RequiresFeature(&'static str), /// Requires a feature to be disabled. ConflictsFeature(&'static str), /// An extension requires this feature to be enabled. RequiredByExtension(&'static str), } impl Display for FeatureRestriction { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), FmtError> { match *self { FeatureRestriction::NotSupported => { write!(f, "not supported by the physical device") } FeatureRestriction::RequiresFeature(feat) => { write!(f, "requires feature {} to be enabled", feat) } FeatureRestriction::ConflictsFeature(feat) => { write!(f, "requires feature {} to be disabled", feat) } FeatureRestriction::RequiredByExtension(ext) => { write!(f, "required to be enabled by extension {}", ext) } } } } #[cfg(test)] mod tests { use super::Features; #[test] fn into_iter() { let features = Features { tessellation_shader: true, ..Features::empty() }; for (name, enabled) in features { if name == "tessellationShader" { assert!(enabled); } else { assert!(!enabled); } } } }