pub use crate::backend::ImageView;
use crate::{
backend::Device,
image::{Image, ImageExtent, ImageSubresourceRange},
OutOfMemory,
};
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
#[cfg_attr(feature = "serde-1", derive(serde::Serialize, serde::Deserialize))]
pub enum ImageViewKind {
D1,
D2,
D3,
Cube,
}
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
pub struct ImageViewInfo {
pub view_kind: ImageViewKind,
pub subresource: ImageSubresourceRange,
pub image: Image,
}
impl ImageViewInfo {
pub fn new(image: Image) -> Self {
let info = image.info();
ImageViewInfo {
view_kind: match info.extent {
ImageExtent::D1 { .. } => ImageViewKind::D1,
ImageExtent::D2 { .. } => ImageViewKind::D2,
ImageExtent::D3 { .. } => ImageViewKind::D3,
},
subresource: ImageSubresourceRange::new(
info.format.aspect_flags(),
0..info.levels,
0..info.layers,
),
image,
}
}
}
#[doc(hidden)]
pub trait MakeImageView {
fn make_view<'a>(&'a self, device: &Device) -> Result<ImageView, OutOfMemory>;
}
impl MakeImageView for ImageView {
fn make_view<'a>(&'a self, _device: &Device) -> Result<ImageView, OutOfMemory> {
Ok(self.clone())
}
}
impl MakeImageView for Image {
fn make_view<'a>(&'a self, device: &Device) -> Result<ImageView, OutOfMemory> {
let view = device.create_image_view(ImageViewInfo::new(self.clone()))?;
Ok(view)
}
}