169 lines
4.6 KiB
Plaintext
169 lines
4.6 KiB
Plaintext
|
include::meta/VK_NV_mesh_shader.txt[]
|
||
|
|
||
|
*Last Modified Date*::
|
||
|
2018-07-19
|
||
|
|
||
|
*Contributors*::
|
||
|
- Pat Brown, NVIDIA
|
||
|
- Jeff Bolz, NVIDIA
|
||
|
- Daniel Koch, NVIDIA
|
||
|
- Piers Daniell, NVIDIA
|
||
|
- Pierre Boudier, NVIDIA
|
||
|
|
||
|
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 the task and mesh shaders are dispatched, they replace the standard
|
||
|
programmable vertex processing pipeline, including vertex array attribute
|
||
|
fetching, vertex shader processing, tessellation, and the geometry shader
|
||
|
processing.
|
||
|
|
||
|
This extension also adds support for the following SPIR-V extension in
|
||
|
Vulkan:
|
||
|
* SPV_NV_mesh_shader
|
||
|
|
||
|
=== New Object Types
|
||
|
|
||
|
None.
|
||
|
|
||
|
=== New Enum Constants
|
||
|
|
||
|
* Extending elink:VkStructureType:
|
||
|
|
||
|
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV
|
||
|
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV
|
||
|
|
||
|
* Extending elink:VkShaderStageFlagBits
|
||
|
|
||
|
** ename:VK_SHADER_STAGE_TASK_BIT_NV
|
||
|
** ename:VK_SHADER_STAGE_MESH_BIT_NV
|
||
|
|
||
|
* Extending elink:VkPipelineStageFlagBits
|
||
|
|
||
|
** ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
|
||
|
** ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
|
||
|
|
||
|
=== New Enums
|
||
|
|
||
|
None.
|
||
|
|
||
|
=== New Structures
|
||
|
|
||
|
* slink:VkPhysicalDeviceMeshShaderFeaturesNV
|
||
|
* slink:VkPhysicalDeviceMeshShaderPropertiesNV
|
||
|
* slink:VkDrawMeshTasksIndirectCommandNV
|
||
|
|
||
|
=== New Functions
|
||
|
|
||
|
* flink:vkCmdDrawMeshTasksNV
|
||
|
* flink:vkCmdDrawMeshTasksIndirectNV
|
||
|
* flink:vkCmdDrawMeshTasksIndirectCountNV
|
||
|
|
||
|
=== 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-meshshading,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 don't support
|
||
|
mesh or task shaders.
|
||
|
This means the change would not be backwards compatible.
|
||
|
It's too bad VkShaderStageFlagBits doesn't 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
|