From 4d2f3655274023c9b2b6d199a08e74cea65fe9d5 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Sun, 2 Oct 2016 21:39:49 +0200 Subject: [PATCH] Add BufferViewRef --- vulkano/src/buffer/mod.rs | 1 + vulkano/src/buffer/view.rs | 37 ++++++++++++++++++++ vulkano/src/descriptor/descriptor_set/std.rs | 21 +++++------ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/vulkano/src/buffer/mod.rs b/vulkano/src/buffer/mod.rs index fc884733e..5ea0da1f3 100644 --- a/vulkano/src/buffer/mod.rs +++ b/vulkano/src/buffer/mod.rs @@ -76,6 +76,7 @@ pub use self::traits::TrackedBufferPipelineBarrierRequest; pub use self::traits::TrackedBufferPipelineMemoryBarrierRequest; pub use self::traits::TrackedBufferSubmitInfos; pub use self::view::BufferView; +pub use self::view::BufferViewRef; pub mod cpu_access; pub mod device_local; diff --git a/vulkano/src/buffer/view.rs b/vulkano/src/buffer/view.rs index 7328ae1d5..3fae50cd2 100644 --- a/vulkano/src/buffer/view.rs +++ b/vulkano/src/buffer/view.rs @@ -193,6 +193,43 @@ impl Drop for BufferView where B: Buffer { } } +pub unsafe trait BufferViewRef { + type Buffer: Buffer; + type Format; + + fn view(&self) -> &BufferView; +} + +unsafe impl BufferViewRef for BufferView where B: Buffer { + type Buffer = B; + type Format = F; + + #[inline] + fn view(&self) -> &BufferView { + self + } +} + +unsafe impl BufferViewRef for Arc> where B: Buffer { + type Buffer = B; + type Format = F; + + #[inline] + fn view(&self) -> &BufferView { + &**self + } +} + +unsafe impl<'a, F, B> BufferViewRef for &'a BufferView where B: Buffer { + type Buffer = B; + type Format = F; + + #[inline] + fn view(&self) -> &BufferView { + *self + } +} + /// Error that can happen when creating a buffer view. #[derive(Debug, Copy, Clone)] pub enum BufferViewCreationError { diff --git a/vulkano/src/descriptor/descriptor_set/std.rs b/vulkano/src/descriptor/descriptor_set/std.rs index 783015971..1da1feea2 100644 --- a/vulkano/src/descriptor/descriptor_set/std.rs +++ b/vulkano/src/descriptor/descriptor_set/std.rs @@ -11,7 +11,7 @@ use std::cmp; use std::sync::Arc; use buffer::Buffer; -use buffer::BufferView; +use buffer::BufferViewRef; use buffer::TrackedBuffer; use command_buffer::submit::SubmitInfo; use command_buffer::sys::PipelineBarrierBuilder; @@ -167,28 +167,29 @@ pub enum StdDescriptorSetBufTy { DynamicUniformBuffer, } -pub struct StdDescriptorSetBufView where B: Buffer { - pub view: Arc>, +pub struct StdDescriptorSetBufView where V: BufferViewRef { + pub view: V, pub ty: StdDescriptorSetBufViewTy, pub write: bool, pub stage: PipelineStages, pub access: AccessFlagBits, } -unsafe impl StdDescriptorSetResourcesCollection for StdDescriptorSetBufView - where B: TrackedBuffer +unsafe impl StdDescriptorSetResourcesCollection for StdDescriptorSetBufView + where V: BufferViewRef, V::Buffer: TrackedBuffer { #[inline] unsafe fn transition(&self, states: &mut S, num_command: usize) -> (usize, PipelineBarrierBuilder) { - let trans = self.view.buffer().transition(states, num_command, 0, self.view.buffer().size(), - self.write, self.stage, self.access); + let trans = self.view.view().buffer() + .transition(states, num_command, 0, self.view.view().buffer().size(), + self.write, self.stage, self.access); if let Some(trans) = trans { let n = trans.after_command_num; let mut b = PipelineBarrierBuilder::new(); - b.add_buffer_barrier_request(&self.view.buffer(), trans); + b.add_buffer_barrier_request(&self.view.view().buffer(), trans); (n, b) } else { (0, PipelineBarrierBuilder::new()) @@ -197,9 +198,9 @@ unsafe impl StdDescriptorSetResourcesCollection for StdDescriptorSet #[inline] unsafe fn finish(&self, in_s: &mut S, out: &mut S) -> PipelineBarrierBuilder { - if let Some(trans) = self.view.buffer().finish(in_s, out) { + if let Some(trans) = self.view.view().buffer().finish(in_s, out) { let mut b = PipelineBarrierBuilder::new(); - b.add_buffer_barrier_request(&self.view.buffer(), trans); + b.add_buffer_barrier_request(&self.view.view().buffer(), trans); b } else { PipelineBarrierBuilder::new()