blob: 41d834eb3d438b65f9a157a6090c41670d9fe00a [file] [log] [blame]
// 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(),
}
}
}