diff options
Diffstat (limited to 'src/command_buffer/validity/clear_color_image.rs')
-rw-r--r-- | src/command_buffer/validity/clear_color_image.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/command_buffer/validity/clear_color_image.rs b/src/command_buffer/validity/clear_color_image.rs new file mode 100644 index 0000000..6ecb68f --- /dev/null +++ b/src/command_buffer/validity/clear_color_image.rs @@ -0,0 +1,81 @@ +// Copyright (c) 2016 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::error; +use std::fmt; + +use crate::device::Device; +use crate::image::ImageAccess; +use crate::VulkanObject; + +/// Checks whether a clear color image command is valid. +/// +/// # Panic +/// +/// - Panics if the destination was not created with `device`. +/// +pub fn check_clear_color_image<I>( + device: &Device, + image: &I, + first_layer: u32, + num_layers: u32, + first_mipmap: u32, + num_mipmaps: u32, +) -> Result<(), CheckClearColorImageError> +where + I: ?Sized + ImageAccess, +{ + assert_eq!( + image.inner().image.device().internal_object(), + device.internal_object() + ); + + if !image.inner().image.usage().transfer_destination { + return Err(CheckClearColorImageError::MissingTransferUsage); + } + + if first_layer + num_layers > image.dimensions().array_layers() { + return Err(CheckClearColorImageError::OutOfRange); + } + + if first_mipmap + num_mipmaps > image.mipmap_levels() { + return Err(CheckClearColorImageError::OutOfRange); + } + + Ok(()) +} + +/// Error that can happen from `check_clear_color_image`. +#[derive(Debug, Copy, Clone)] +pub enum CheckClearColorImageError { + /// The image is missing the transfer destination usage. + MissingTransferUsage, + /// The array layers and mipmap levels are out of range. + OutOfRange, +} + +impl error::Error for CheckClearColorImageError {} + +impl fmt::Display for CheckClearColorImageError { + #[inline] + fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> { + write!( + fmt, + "{}", + match *self { + CheckClearColorImageError::MissingTransferUsage => { + "the image is missing the transfer destination usage" + } + CheckClearColorImageError::OutOfRange => { + "the array layers and mipmap levels are out of range" + } + } + ) + } +} |