aboutsummaryrefslogtreecommitdiff
path: root/src/render_pass/attachments_list.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/render_pass/attachments_list.rs')
-rw-r--r--src/render_pass/attachments_list.rs82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/render_pass/attachments_list.rs b/src/render_pass/attachments_list.rs
new file mode 100644
index 0000000..2b1fe23
--- /dev/null
+++ b/src/render_pass/attachments_list.rs
@@ -0,0 +1,82 @@
+// 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 crate::image::view::ImageViewAbstract;
+use crate::SafeDeref;
+use std::sync::Arc;
+//use sync::AccessFlags;
+//use sync::PipelineStages;
+
+/// A list of attachments.
+// TODO: rework this trait
+pub unsafe trait AttachmentsList {
+ fn num_attachments(&self) -> usize;
+
+ fn as_image_view_access(&self, index: usize) -> Option<&dyn ImageViewAbstract>;
+}
+
+unsafe impl<T> AttachmentsList for T
+where
+ T: SafeDeref,
+ T::Target: AttachmentsList,
+{
+ #[inline]
+ fn num_attachments(&self) -> usize {
+ (**self).num_attachments()
+ }
+
+ #[inline]
+ fn as_image_view_access(&self, index: usize) -> Option<&dyn ImageViewAbstract> {
+ (**self).as_image_view_access(index)
+ }
+}
+
+unsafe impl AttachmentsList for () {
+ #[inline]
+ fn num_attachments(&self) -> usize {
+ 0
+ }
+
+ #[inline]
+ fn as_image_view_access(&self, _: usize) -> Option<&dyn ImageViewAbstract> {
+ None
+ }
+}
+
+unsafe impl AttachmentsList for Vec<Arc<dyn ImageViewAbstract + Send + Sync>> {
+ #[inline]
+ fn num_attachments(&self) -> usize {
+ self.len()
+ }
+
+ #[inline]
+ fn as_image_view_access(&self, index: usize) -> Option<&dyn ImageViewAbstract> {
+ self.get(index).map(|v| &**v as &_)
+ }
+}
+
+unsafe impl<A, B> AttachmentsList for (A, B)
+where
+ A: AttachmentsList,
+ B: ImageViewAbstract,
+{
+ #[inline]
+ fn num_attachments(&self) -> usize {
+ self.0.num_attachments() + 1
+ }
+
+ #[inline]
+ fn as_image_view_access(&self, index: usize) -> Option<&dyn ImageViewAbstract> {
+ if index == self.0.num_attachments() {
+ Some(&self.1)
+ } else {
+ self.0.as_image_view_access(index)
+ }
+ }
+}