22. Geometry Shading
The geometry shader operates on a group of vertices and their associated data assembled from a single input primitive, and emits zero or more output primitives and the group of vertices and their associated data required for each output primitive. Geometry shading is enabled when a geometry shader is included in the pipeline.
22.1. Geometry Shader Input Primitives
Each geometry shader invocation has access to all vertices in the primitive
(and their associated data), which are presented to the shader as an array
of inputs.
The input primitive type expected by the geometry shader is specified with
an OpExecutionMode
instruction in the geometry shader, and must be
compatible with the primitive topology used by primitive assembly (if
tessellation is not in use) or must match the type of primitive generated
by the tessellation primitive generator (if tessellation is in use).
Compatibility is defined below, with each input primitive type.
The input primitive types accepted by a geometry shader are:
 Points

Geometry shaders that operate on points use an
OpExecutionMode
instruction specifying theInputPoints
input mode. Such a shader is valid only when the pipeline primitive topology isVK_PRIMITIVE_TOPOLOGY_POINT_LIST
(if tessellation is not in use) or if tessellation is in use and the tessellation evaluation shader usesPointMode
. There is only a single input vertex available for each geometry shader invocation. However, inputs to the geometry shader are still presented as an array, but this array has a length of one.  Lines

Geometry shaders that operate on line segments are generated by including an
OpExecutionMode
instruction with theInputLines
mode. Such a shader is valid only for theVK_PRIMITIVE_TOPOLOGY_LINE_LIST
, andVK_PRIMITIVE_TOPOLOGY_LINE_STRIP
primitive topologies (if tessellation is not in use) or if tessellation is in use and the tessellation mode isIsolines
. There are two input vertices available for each geometry shader invocation. The first vertex refers to the vertex at the beginning of the line segment and the second vertex refers to the vertex at the end of the line segment.  Lines with Adjacency

Geometry shaders that operate on line segments with adjacent vertices are generated by including an
OpExecutionMode
instruction with theInputLinesAdjacency
mode. Such a shader is valid only for theVK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY
andVK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY
primitive topologies and must not be used when tessellation is in use.In this mode, there are four vertices available for each geometry shader invocation. The second vertex refers to attributes of the vertex at the beginning of the line segment and the third vertex refers to the vertex at the end of the line segment. The first and fourth vertices refer to the vertices adjacent to the beginning and end of the line segment, respectively.
 Triangles

Geometry shaders that operate on triangles are created by including an
OpExecutionMode
instruction with theTriangles
mode. Such a shader is valid when the pipeline topology isVK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
,VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
, orVK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN
(if tessellation is not in use) or when tessellation is in use and the tessellation mode isTriangles
orQuads
.In this mode, there are three vertices available for each geometry shader invocation. The first, second, and third vertices refer to attributes of the first, second, and third vertex of the triangle, respectively.
 Triangles with Adjacency

Geometry shaders that operate on triangles with adjacent vertices are created by including an
OpExecutionMode
instruction with theInputTrianglesAdjacency
mode. Such a shader is valid when the pipeline topology isVK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY
orVK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY
, and must not be used when tessellation is in use.In this mode, there are six vertices available for each geometry shader invocation. The first, third and fifth vertices refer to attributes of the first, second and third vertex of the triangle, respectively. The second, fourth and sixth vertices refer to attributes of the vertices adjacent to the edges from the first to the second vertex, from the second to the third vertex, and from the third to the first vertex, respectively.
22.2. Geometry Shader Output Primitives
A geometry shader generates primitives in one of three output modes: points,
line strips, or triangle strips.
The primitive mode is specified in the shader using an OpExecutionMode
instruction with the OutputPoints
, OutputLineStrip
or
OutputTriangleStrip
modes, respectively.
Each geometry shader must include exactly one output primitive mode.
The vertices output by the geometry shader are assembled into points, lines, or triangles based on the output primitive type and the resulting primitives are then further processed as described in Rasterization. If the number of vertices emitted by the geometry shader is not sufficient to produce a single primitive, vertices corresponding to incomplete primitives are not processed by subsequent pipeline stages. The number of vertices output by the geometry shader is limited to a maximum count specified in the shader.
The maximum output vertex count is specified in the shader using an
OpExecutionMode
instruction with the mode set to OutputVertices
and the maximum number of vertices that will be produced by the geometry
shader specified as a literal.
Each geometry shader must specify a maximum output vertex count.
22.3. Multiple Invocations of Geometry Shaders
Geometry shaders can be invoked more than one time for each input
primitive.
This is known as geometry shader instancing and is requested by including
an OpExecutionMode
instruction with mode
specified as
Invocations
and the number of invocations specified as an integer
literal.
In this mode, the geometry shader will execute at least n times for
each input primitive, where n is the number of invocations specified
in the OpExecutionMode
instruction.
The instance number is available to each invocation as a builtin input
using InvocationId
.
22.4. Geometry Shader Primitive Ordering
Limited guarantees are provided for the relative ordering of primitives produced by a geometry shader, as they pertain to primitive order.

For instanced geometry shaders, the output primitives generated from each input primitive are passed to subsequent pipeline stages using the invocation number to order the primitives, from least to greatest.

All output primitives generated from a given input primitive are passed to subsequent pipeline stages before any output primitives generated from subsequent input primitives.