diff options
Diffstat (limited to 'src/image/aspect.rs')
-rw-r--r-- | src/image/aspect.rs | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/image/aspect.rs b/src/image/aspect.rs new file mode 100644 index 0000000..41d834e --- /dev/null +++ b/src/image/aspect.rs @@ -0,0 +1,145 @@ +// Copyright (c) 2020 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::ops::BitOr; + +/// An individual data type within an image. +/// +/// Most images have only the `Color` aspect, but some may have several. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +#[repr(u32)] +pub enum ImageAspect { + Color = ash::vk::ImageAspectFlags::COLOR.as_raw(), + Depth = ash::vk::ImageAspectFlags::DEPTH.as_raw(), + Stencil = ash::vk::ImageAspectFlags::STENCIL.as_raw(), + Metadata = ash::vk::ImageAspectFlags::METADATA.as_raw(), + Plane0 = ash::vk::ImageAspectFlags::PLANE_0.as_raw(), + Plane1 = ash::vk::ImageAspectFlags::PLANE_1.as_raw(), + Plane2 = ash::vk::ImageAspectFlags::PLANE_2.as_raw(), + MemoryPlane0 = ash::vk::ImageAspectFlags::MEMORY_PLANE_0_EXT.as_raw(), + MemoryPlane1 = ash::vk::ImageAspectFlags::MEMORY_PLANE_1_EXT.as_raw(), + MemoryPlane2 = ash::vk::ImageAspectFlags::MEMORY_PLANE_2_EXT.as_raw(), +} + +impl From<ImageAspect> for ash::vk::ImageAspectFlags { + #[inline] + fn from(val: ImageAspect) -> Self { + Self::from_raw(val as u32) + } +} + +/// A mask specifying one or more `ImageAspect`s. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] +pub struct ImageAspects { + pub color: bool, + pub depth: bool, + pub stencil: bool, + pub metadata: bool, + pub plane0: bool, + pub plane1: bool, + pub plane2: bool, + pub memory_plane0: bool, + pub memory_plane1: bool, + pub memory_plane2: bool, +} + +impl ImageAspects { + /// Builds an `ImageAspect` with all values set to false. Useful as a default value. + #[inline] + pub const fn none() -> ImageAspects { + ImageAspects { + color: false, + depth: false, + stencil: false, + metadata: false, + plane0: false, + plane1: false, + plane2: false, + memory_plane0: false, + memory_plane1: false, + memory_plane2: false, + } + } +} + +impl BitOr for ImageAspects { + type Output = Self; + + #[inline] + fn bitor(self, rhs: Self) -> Self { + ImageAspects { + color: self.color || rhs.color, + depth: self.depth || rhs.depth, + stencil: self.stencil || rhs.stencil, + metadata: self.metadata || rhs.metadata, + plane0: self.plane0 || rhs.plane0, + plane1: self.plane1 || rhs.plane1, + plane2: self.plane2 || rhs.plane2, + memory_plane0: self.memory_plane0 || rhs.memory_plane0, + memory_plane1: self.memory_plane1 || rhs.memory_plane1, + memory_plane2: self.memory_plane2 || rhs.memory_plane2, + } + } +} + +impl From<ImageAspects> for ash::vk::ImageAspectFlags { + #[inline] + fn from(value: ImageAspects) -> ash::vk::ImageAspectFlags { + let mut result = ash::vk::ImageAspectFlags::empty(); + if value.color { + result |= ash::vk::ImageAspectFlags::COLOR; + } + if value.depth { + result |= ash::vk::ImageAspectFlags::DEPTH; + } + if value.stencil { + result |= ash::vk::ImageAspectFlags::STENCIL; + } + if value.metadata { + result |= ash::vk::ImageAspectFlags::METADATA; + } + if value.plane0 { + result |= ash::vk::ImageAspectFlags::PLANE_0; + } + if value.plane1 { + result |= ash::vk::ImageAspectFlags::PLANE_1; + } + if value.plane2 { + result |= ash::vk::ImageAspectFlags::PLANE_2; + } + if value.memory_plane0 { + result |= ash::vk::ImageAspectFlags::MEMORY_PLANE_0_EXT; + } + if value.memory_plane1 { + result |= ash::vk::ImageAspectFlags::MEMORY_PLANE_1_EXT; + } + if value.memory_plane2 { + result |= ash::vk::ImageAspectFlags::MEMORY_PLANE_2_EXT + } + result + } +} + +impl From<ash::vk::ImageAspectFlags> for ImageAspects { + #[inline] + fn from(val: ash::vk::ImageAspectFlags) -> ImageAspects { + ImageAspects { + color: !(val & ash::vk::ImageAspectFlags::COLOR).is_empty(), + depth: !(val & ash::vk::ImageAspectFlags::DEPTH).is_empty(), + stencil: !(val & ash::vk::ImageAspectFlags::STENCIL).is_empty(), + metadata: !(val & ash::vk::ImageAspectFlags::METADATA).is_empty(), + plane0: !(val & ash::vk::ImageAspectFlags::PLANE_0).is_empty(), + plane1: !(val & ash::vk::ImageAspectFlags::PLANE_1).is_empty(), + plane2: !(val & ash::vk::ImageAspectFlags::PLANE_2).is_empty(), + memory_plane0: !(val & ash::vk::ImageAspectFlags::MEMORY_PLANE_0_EXT).is_empty(), + memory_plane1: !(val & ash::vk::ImageAspectFlags::MEMORY_PLANE_1_EXT).is_empty(), + memory_plane2: !(val & ash::vk::ImageAspectFlags::MEMORY_PLANE_2_EXT).is_empty(), + } + } +} |