mirror of
https://github.com/vulkano-rs/vulkano.git
synced 2025-02-20 19:12:37 +00:00
Add BufferViewRef
This commit is contained in:
parent
a8d2b6a774
commit
4d2f365527
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user