vulkano 0.27.0

Safe wrapper for the Vulkan graphics API
Documentation
// 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(),
        }
    }
}