// Copyright (c) 2016 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. //! 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 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 for ash::vk::IndexType { #[inline] fn from(val: IndexType) -> Self { Self::from_raw(val as i32) } }