aboutsummaryrefslogtreecommitdiff
path: root/src/pipeline/input_assembly.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/pipeline/input_assembly.rs')
-rw-r--r--src/pipeline/input_assembly.rs136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/pipeline/input_assembly.rs b/src/pipeline/input_assembly.rs
new file mode 100644
index 0000000..d797d0d
--- /dev/null
+++ b/src/pipeline/input_assembly.rs
@@ -0,0 +1,136 @@
+// Copyright (c) 2016 The vulkano developers
+// Licensed under the Apache License, Version 2.0
+// <LICENSE-APACHE or
+// https://www.apache.org/licenses/LICENSE-2.0> or the MIT
+// license <LICENSE-MIT or https://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.
+
+//! Assembling vertices into primitives.
+//!
+//! The input assembly is the stage where lists of vertices are turned into primitives.
+//!
+
+/// How the input assembly stage should behave.
+#[derive(Copy, Clone, Debug)]
+#[deprecated]
+pub struct InputAssembly {
+ /// The type of primitives.
+ ///
+ /// Note that some topologies don't support primitive restart.
+ pub topology: PrimitiveTopology,
+
+ /// If true, then the special index value `0xffff` or `0xffffffff` will tell the GPU that it is
+ /// the end of the current primitive. A new primitive will restart at the next index.
+ ///
+ /// Note that some topologies don't support primitive restart.
+ pub primitive_restart_enable: bool,
+}
+
+impl InputAssembly {
+ /// Builds an `InputAssembly` struct with the `TriangleList` topology.
+ #[inline]
+ pub fn triangle_list() -> InputAssembly {
+ InputAssembly {
+ topology: PrimitiveTopology::TriangleList,
+ primitive_restart_enable: false,
+ }
+ }
+}
+
+/// Describes how vertices must be grouped together to form primitives.
+///
+/// Note that some topologies don't support primitive restart.
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+pub enum PrimitiveTopology {
+ PointList,
+ LineList,
+ LineStrip,
+ TriangleList,
+ TriangleStrip,
+ TriangleFan,
+ LineListWithAdjacency,
+ LineStripWithAdjacency,
+ TriangleListWithAdjacency,
+ TriangleStripWithAdjacency,
+ PatchList { vertices_per_patch: u32 },
+}
+
+impl From<PrimitiveTopology> for ash::vk::PrimitiveTopology {
+ #[inline]
+ fn from(val: PrimitiveTopology) -> ash::vk::PrimitiveTopology {
+ match val {
+ PrimitiveTopology::PointList => ash::vk::PrimitiveTopology::POINT_LIST,
+ PrimitiveTopology::LineList => ash::vk::PrimitiveTopology::LINE_LIST,
+ PrimitiveTopology::LineStrip => ash::vk::PrimitiveTopology::LINE_STRIP,
+ PrimitiveTopology::TriangleList => ash::vk::PrimitiveTopology::TRIANGLE_LIST,
+ PrimitiveTopology::TriangleStrip => ash::vk::PrimitiveTopology::TRIANGLE_STRIP,
+ PrimitiveTopology::TriangleFan => ash::vk::PrimitiveTopology::TRIANGLE_FAN,
+ PrimitiveTopology::LineListWithAdjacency => {
+ ash::vk::PrimitiveTopology::LINE_LIST_WITH_ADJACENCY
+ }
+ PrimitiveTopology::LineStripWithAdjacency => {
+ ash::vk::PrimitiveTopology::LINE_STRIP_WITH_ADJACENCY
+ }
+ PrimitiveTopology::TriangleListWithAdjacency => {
+ ash::vk::PrimitiveTopology::TRIANGLE_LIST_WITH_ADJACENCY
+ }
+ PrimitiveTopology::TriangleStripWithAdjacency => {
+ ash::vk::PrimitiveTopology::TRIANGLE_STRIP_WITH_ADJACENCY
+ }
+ PrimitiveTopology::PatchList { .. } => ash::vk::PrimitiveTopology::PATCH_LIST,
+ }
+ }
+}
+
+impl PrimitiveTopology {
+ /// Returns true if this primitive topology supports using primitives restart.
+ #[inline]
+ pub fn supports_primitive_restart(&self) -> bool {
+ match *self {
+ PrimitiveTopology::LineStrip => true,
+ PrimitiveTopology::TriangleStrip => true,
+ PrimitiveTopology::TriangleFan => true,
+ PrimitiveTopology::LineStripWithAdjacency => true,
+ PrimitiveTopology::TriangleStripWithAdjacency => true,
+ _ => false,
+ }
+ }
+}
+
+/// Trait for types that can be used as indices by the GPU.
+pub unsafe trait Index {
+ /// Returns the type of data.
+ fn ty() -> IndexType;
+}
+
+unsafe impl Index for u16 {
+ #[inline(always)]
+ fn ty() -> IndexType {
+ IndexType::U16
+ }
+}
+
+unsafe impl Index for u32 {
+ #[inline(always)]
+ fn ty() -> IndexType {
+ IndexType::U32
+ }
+}
+
+/// An enumeration of all valid index types.
+#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+#[allow(missing_docs)]
+#[repr(i32)]
+pub enum IndexType {
+ U16 = ash::vk::IndexType::UINT16.as_raw(),
+ U32 = ash::vk::IndexType::UINT32.as_raw(),
+}
+
+impl From<IndexType> for ash::vk::IndexType {
+ #[inline]
+ fn from(val: IndexType) -> Self {
+ Self::from_raw(val as i32)
+ }
+}