aboutsummaryrefslogtreecommitdiff
path: root/src/image/aspect.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/image/aspect.rs')
-rw-r--r--src/image/aspect.rs145
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(),
+ }
+ }
+}