Bufferless vertex definition (#819)

* Bufferless vertex definition

* Define `BufferlessVertices` to enable bufferless instanced drawing

* Cleanup
This commit is contained in:
Benjamin Saunders 2017-09-13 10:29:53 -07:00 committed by tomaka
parent de25bb2906
commit 24496cc725
3 changed files with 57 additions and 0 deletions

View File

@ -5,6 +5,8 @@
- Changed `CpuBufferPool::next()` and `chunk()` to return a `Result` in case of an error when - Changed `CpuBufferPool::next()` and `chunk()` to return a `Result` in case of an error when
allocating or mapping memory. allocating or mapping memory.
- Fixed `layers` argument validation in `Swapchain::new_inner`. - Fixed `layers` argument validation in `Swapchain::new_inner`.
- Added `vulkano::pipeline::vertex::BufferlessDefinition` and `BufferlessVertices` to enable
bufferless drawing.
- Provide 32-bit word constructor for `ShaderModule` (`ShaderModule::from_words`). - Provide 32-bit word constructor for `ShaderModule` (`ShaderModule::from_words`).
# Version 0.6.2 (2017-09-06) # Version 0.6.2 (2017-09-06)

View File

@ -0,0 +1,52 @@
// Copyright (c) 2017 The vulkano developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT
// license <LICENSE-MIT or http://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 std::iter;
use pipeline::vertex::AttributeInfo;
use pipeline::vertex::IncompatibleVertexDefinitionError;
use pipeline::vertex::InputRate;
use pipeline::vertex::VertexDefinition;
use pipeline::vertex::VertexSource;
use buffer::BufferAccess;
/// Implementation of `VertexDefinition` for drawing with no buffers at all.
///
/// This is only useful if your shaders come up with vertex data on their own, e.g. by inspecting
/// `gl_VertexIndex`
pub struct BufferlessDefinition;
/// Value to be passed as the vertex source for bufferless draw commands.
///
/// Note that the concrete type of the graphics pipeline using `BufferlessDefinition` must be
/// visible to the command buffer builder for this to be usable.
pub struct BufferlessVertices {
pub vertices: usize,
pub instances: usize,
}
unsafe impl VertexSource<BufferlessVertices> for BufferlessDefinition {
fn decode(&self, n: BufferlessVertices) -> (Vec<Box<BufferAccess + Sync + Send + 'static>>, usize, usize) {
(Vec::new(), n.vertices, n.instances)
}
}
unsafe impl<T> VertexSource<Vec<T>> for BufferlessDefinition {
fn decode<'l>(&self, _: Vec<T>) -> (Vec<Box<BufferAccess + Sync + Send + 'static>>, usize, usize) {
panic!("bufferless drawing should not be supplied with buffers")
}
}
unsafe impl<I> VertexDefinition<I> for BufferlessDefinition {
type BuffersIter = iter::Empty<(u32, usize, InputRate)>;
type AttribsIter = iter::Empty<(u32, u32, AttributeInfo)>;
fn definition(&self, _: &I) -> Result<(Self::BuffersIter, Self::AttribsIter), IncompatibleVertexDefinitionError> {
Ok((iter::empty(), iter::empty()))
}
}

View File

@ -75,6 +75,8 @@ pub use self::two::TwoBuffersDefinition;
pub use self::vertex::Vertex; pub use self::vertex::Vertex;
pub use self::vertex::VertexMemberInfo; pub use self::vertex::VertexMemberInfo;
pub use self::vertex::VertexMemberTy; pub use self::vertex::VertexMemberTy;
pub use self::bufferless::BufferlessDefinition;
pub use self::bufferless::BufferlessVertices;
mod definition; mod definition;
mod impl_vertex; mod impl_vertex;
@ -82,3 +84,4 @@ mod one_one;
mod single; mod single;
mod two; mod two;
mod vertex; mod vertex;
mod bufferless;