Add BufferViewRef

This commit is contained in:
Pierre Krieger 2016-10-02 21:39:49 +02:00
parent a8d2b6a774
commit 4d2f365527
3 changed files with 49 additions and 10 deletions

View File

@ -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;

View File

@ -193,6 +193,43 @@ impl<F, B> Drop for BufferView<F, B> where B: Buffer {
}
}
pub unsafe trait BufferViewRef {
type Buffer: Buffer;
type Format;
fn view(&self) -> &BufferView<Self::Format, Self::Buffer>;
}
unsafe impl<F, B> BufferViewRef for BufferView<F, B> where B: Buffer {
type Buffer = B;
type Format = F;
#[inline]
fn view(&self) -> &BufferView<F, B> {
self
}
}
unsafe impl<F, B> BufferViewRef for Arc<BufferView<F, B>> where B: Buffer {
type Buffer = B;
type Format = F;
#[inline]
fn view(&self) -> &BufferView<F, B> {
&**self
}
}
unsafe impl<'a, F, B> BufferViewRef for &'a BufferView<F, B> where B: Buffer {
type Buffer = B;
type Format = F;
#[inline]
fn view(&self) -> &BufferView<F, B> {
*self
}
}
/// Error that can happen when creating a buffer view.
#[derive(Debug, Copy, Clone)]
pub enum BufferViewCreationError {

View File

@ -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<F, B> where B: Buffer {
pub view: Arc<BufferView<F, B>>,
pub struct StdDescriptorSetBufView<V> where V: BufferViewRef {
pub view: V,
pub ty: StdDescriptorSetBufViewTy,
pub write: bool,
pub stage: PipelineStages,
pub access: AccessFlagBits,
}
unsafe impl<F, B, S> StdDescriptorSetResourcesCollection<S> for StdDescriptorSetBufView<F, B>
where B: TrackedBuffer<S>
unsafe impl<V, S> StdDescriptorSetResourcesCollection<S> for StdDescriptorSetBufView<V>
where V: BufferViewRef, V::Buffer: TrackedBuffer<S>
{
#[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<F, B, S> StdDescriptorSetResourcesCollection<S> 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()