aboutsummaryrefslogtreecommitdiff
path: root/src/command_buffer/validity/clear_color_image.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/command_buffer/validity/clear_color_image.rs')
-rw-r--r--src/command_buffer/validity/clear_color_image.rs81
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"
+ }
+ }
+ )
+ }
+}