aboutsummaryrefslogtreecommitdiff
path: root/src/command_buffer/validity/indirect_buffer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/command_buffer/validity/indirect_buffer.rs')
-rw-r--r--src/command_buffer/validity/indirect_buffer.rs72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/command_buffer/validity/indirect_buffer.rs b/src/command_buffer/validity/indirect_buffer.rs
new file mode 100644
index 0000000..3acd4b2
--- /dev/null
+++ b/src/command_buffer/validity/indirect_buffer.rs
@@ -0,0 +1,72 @@
+// Copyright (c) 2021 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 crate::buffer::BufferAccess;
+use crate::device::Device;
+use crate::device::DeviceOwned;
+use crate::VulkanObject;
+use std::error;
+use std::fmt;
+
+/// Checks whether an indirect buffer can be bound.
+pub fn check_indirect_buffer<Inb>(
+ device: &Device,
+ buffer: &Inb,
+) -> Result<(), CheckIndirectBufferError>
+where
+ Inb: BufferAccess + Send + Sync + 'static,
+{
+ assert_eq!(
+ buffer.inner().buffer.device().internal_object(),
+ device.internal_object()
+ );
+
+ if !buffer.inner().buffer.usage().indirect_buffer {
+ return Err(CheckIndirectBufferError::BufferMissingUsage);
+ }
+
+ Ok(())
+}
+
+/// Error that can happen when checking whether binding an indirect buffer is valid.
+#[derive(Debug, Copy, Clone)]
+pub enum CheckIndirectBufferError {
+ /// The "indirect buffer" usage must be enabled on the indirect buffer.
+ BufferMissingUsage,
+ /// The maximum number of indirect draws has been exceeded.
+ MaxDrawIndirectCountLimitExceeded {
+ /// The limit that must be fulfilled.
+ limit: u32,
+ /// What was requested.
+ requested: u32,
+ },
+}
+
+impl error::Error for CheckIndirectBufferError {}
+
+impl fmt::Display for CheckIndirectBufferError {
+ #[inline]
+ fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> {
+ write!(
+ fmt,
+ "{}",
+ match *self {
+ CheckIndirectBufferError::BufferMissingUsage => {
+ "the indirect buffer usage must be enabled on the indirect buffer"
+ }
+ CheckIndirectBufferError::MaxDrawIndirectCountLimitExceeded {
+ limit,
+ requested,
+ } => {
+ "the maximum number of indirect draws has been exceeded"
+ }
+ }
+ )
+ }
+}