From 24496cc725f25fd5d36c7beba0fcb618eba49615 Mon Sep 17 00:00:00 2001 From: Benjamin Saunders Date: Wed, 13 Sep 2017 10:29:53 -0700 Subject: [PATCH] Bufferless vertex definition (#819) * Bufferless vertex definition * Define `BufferlessVertices` to enable bufferless instanced drawing * Cleanup --- CHANGELOG.md | 2 + vulkano/src/pipeline/vertex/bufferless.rs | 52 +++++++++++++++++++++++ vulkano/src/pipeline/vertex/mod.rs | 3 ++ 3 files changed, 57 insertions(+) create mode 100644 vulkano/src/pipeline/vertex/bufferless.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 1df1c370..0d65c21f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - Changed `CpuBufferPool::next()` and `chunk()` to return a `Result` in case of an error when allocating or mapping memory. - 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`). # Version 0.6.2 (2017-09-06) diff --git a/vulkano/src/pipeline/vertex/bufferless.rs b/vulkano/src/pipeline/vertex/bufferless.rs new file mode 100644 index 00000000..d068c652 --- /dev/null +++ b/vulkano/src/pipeline/vertex/bufferless.rs @@ -0,0 +1,52 @@ +// Copyright (c) 2017 The vulkano developers +// Licensed under the Apache License, Version 2.0 +// or the MIT +// license , +// 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 for BufferlessDefinition { + fn decode(&self, n: BufferlessVertices) -> (Vec>, usize, usize) { + (Vec::new(), n.vertices, n.instances) + } +} + +unsafe impl VertexSource> for BufferlessDefinition { + fn decode<'l>(&self, _: Vec) -> (Vec>, usize, usize) { + panic!("bufferless drawing should not be supplied with buffers") + } +} + +unsafe impl VertexDefinition 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())) + } +} diff --git a/vulkano/src/pipeline/vertex/mod.rs b/vulkano/src/pipeline/vertex/mod.rs index 349910a3..ab854594 100644 --- a/vulkano/src/pipeline/vertex/mod.rs +++ b/vulkano/src/pipeline/vertex/mod.rs @@ -75,6 +75,8 @@ pub use self::two::TwoBuffersDefinition; pub use self::vertex::Vertex; pub use self::vertex::VertexMemberInfo; pub use self::vertex::VertexMemberTy; +pub use self::bufferless::BufferlessDefinition; +pub use self::bufferless::BufferlessVertices; mod definition; mod impl_vertex; @@ -82,3 +84,4 @@ mod one_one; mod single; mod two; mod vertex; +mod bufferless;