| // Copyright (c) 2016 The vulkano developers |
| // Licensed under the Apache License, Version 2.0 |
| // <LICENSE-APACHE or |
| // https://www.apache.org/licenses/LICENSE-2.0> or the MIT |
| // license <LICENSE-MIT or https://opensource.org/licenses/MIT>, |
| // 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); |
| } |
| } |
| } |
| } |