The tessellation control shader is used to read an input patch provided by
the application and to produce an output patch. Each tessellation control
shader invocation operates on an input patch (after all control points in
the patch are processed by a vertex shader) and its associated data, and
outputs a single control point of the output patch and its associated data,
and can also output additional per-patch data. The input patch is sized
according to the patchControlPoints
member of
VkPipelineTessellationStateCreateInfo
, as part of input assembly. The
size of the output patch is controlled by the OpExecutionMode
OutputVertices
specified in the tessellation control or tessellation
evaluation shaders, which must be specified in at least one of the shaders.
The size of the input and output patches must each be greater than zero and
less than or equal to
VkPhysicalDeviceLimits
::maxTessellationPatchSize
.
A tessellation control shader is invoked at least once for each output vertex in a patch.
Inputs to the tessellation control shader are generated by the vertex
shader. Each invocation of the tessellation control shader can read the
attributes of any incoming vertices and their associated data. The
invocations corresponding to a given patch execute logically in parallel,
with undefined relative execution order. However, the OpControlBarrier
instruction can be used to provide limited control of the execution order
by synchronizing invocations within a patch, effectively dividing
tessellation control shader execution into a set of phases. Tessellation
control shaders will read undefined values if one invocation reads a
per-vertex or per-patch attribute written by another invocation at any point
during the same phase, or if two invocations attempt to write different
values to the same per-patch output in a single phase.