| // Copyright (c) 2018-2020 NVIDIA Corporation |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_NV_mesh_shader.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2018-07-19 |
| *Interactions and External Dependencies*:: |
| - This extension requires |
| {spirv}/NV/SPV_NV_mesh_shader.html[`SPV_NV_mesh_shader`] |
| - This extension provides API support for |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_mesh_shader.txt[`GLSL_NV_mesh_shader`] |
| *Contributors*:: |
| - Pat Brown, NVIDIA |
| - Jeff Bolz, NVIDIA |
| - Daniel Koch, NVIDIA |
| - Piers Daniell, NVIDIA |
| - Pierre Boudier, NVIDIA |
| |
| === Description |
| |
| This extension provides a new mechanism allowing applications to generate |
| collections of geometric primitives via programmable mesh shading. |
| It is an alternative to the existing programmable primitive shading |
| pipeline, which relied on generating input primitives by a fixed function |
| assembler as well as fixed function vertex fetch. |
| |
| There are new programmable shader types -- the task and mesh shader -- to |
| generate these collections to be processed by fixed-function primitive |
| assembly and rasterization logic. |
| When task and mesh shaders are dispatched, they replace the core |
| <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization stages>>, |
| including vertex array attribute fetching, vertex shader processing, |
| tessellation, and geometry shader processing. |
| |
| This extension also adds support for the following SPIR-V extension in |
| Vulkan: |
| |
| * {spirv}/NV/SPV_NV_mesh_shader.html[`SPV_NV_mesh_shader`] |
| |
| include::{generated}/interfaces/VK_NV_mesh_shader.txt[] |
| |
| === New or Modified Built-In Variables |
| |
| * <<interfaces-builtin-variables-taskcount,TaskCountNV>> |
| * <<interfaces-builtin-variables-primitivecount,PrimitiveCountNV>> |
| * <<interfaces-builtin-variables-primitiveindices,PrimitiveIndicesNV>> |
| * <<interfaces-builtin-variables-clipdistancepv,ClipDistancePerViewNV>> |
| * <<interfaces-builtin-variables-culldistancepv,CullDistancePerViewNV>> |
| * <<interfaces-builtin-variables-layerpv,LayerPerViewNV>> |
| * <<interfaces-builtin-variables-meshviewcount,MeshViewCountNV>> |
| * <<interfaces-builtin-variables-meshviewindices,MeshViewIndicesNV>> |
| * (modified)code:Position |
| * (modified)code:PointSize |
| * (modified)code:ClipDistance |
| * (modified)code:CullDistance |
| * (modified)code:PrimitiveId |
| * (modified)code:Layer |
| * (modified)code:ViewportIndex |
| * (modified)code:WorkgroupSize |
| * (modified)code:WorkgroupId |
| * (modified)code:LocalInvocationId |
| * (modified)code:GlobalInvocationId |
| * (modified)code:LocalInvocationIndex |
| * (modified)code:DrawIndex |
| * (modified)code:ViewportMaskNV |
| * (modified)code:PositionPerViewNV |
| * (modified)code:ViewportMaskPerViewNV |
| |
| === New SPIR-V Capability |
| |
| * <<spirvenv-capabilities-table-MeshShadingNV,MeshShadingNV>> |
| |
| === Issues |
| |
| . How to name this extension? |
| + |
| -- |
| *RESOLVED*: VK_NV_mesh_shader |
| |
| Other options considered: |
| |
| * VK_NV_mesh_shading |
| * VK_NV_programmable_mesh_shading |
| * VK_NV_primitive_group_shading |
| * VK_NV_grouped_drawing |
| -- |
| |
| . Do we need a new VkPrimitiveTopology? |
| + |
| -- |
| *RESOLVED*: No. |
| We skip the InputAssembler stage. |
| -- |
| |
| . Should we allow Instancing? |
| + |
| -- |
| *RESOLVED*: No. |
| There is no fixed function input, other than the IDs. |
| However, allow offsetting with a "`first`" value. |
| -- |
| |
| . Should we use existing vkCmdDraw or introduce new functions? |
| + |
| -- |
| *RESOLVED*: Introduce new functions. |
| |
| New functions make it easier to separate from "`programmable primitive |
| shading`" chapter, less "`dual use`" language about existing functions |
| having alternative behavior. |
| The text around the existing "`draws`" is heavily based around emitting |
| vertices. |
| -- |
| |
| . If new functions, how to name? |
| + |
| -- |
| *RESOLVED*: CmdDrawMeshTasks* |
| |
| Other options considered: |
| |
| * CmdDrawMeshed |
| * CmdDrawTasked |
| * CmdDrawGrouped |
| -- |
| |
| . Should VK_SHADER_STAGE_ALL_GRAPHICS be updated to include the new stages? |
| + |
| -- |
| *RESOLVED*: No. |
| If an application were to be recompiled with headers that include additional |
| shader stage bits in VK_SHADER_STAGE_ALL_GRAPHICS, then the previously valid |
| application would no longer be valid on implementations that do not support |
| mesh or task shaders. |
| This means the change would not be backwards compatible. |
| It is too bad VkShaderStageFlagBits does not have a dedicated "`all |
| supported graphics stages`" bit like VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, |
| which would have avoided this problem. |
| -- |
| |
| === Version History |
| |
| * Revision 1, 2018-07-19 (Christoph Kubisch, Daniel Koch) |
| - Internal revisions |