{-# language CPP #-} -- | = Name -- -- VK_NV_geometry_shader_passthrough - device extension -- -- == VK_NV_geometry_shader_passthrough -- -- [__Name String__] -- @VK_NV_geometry_shader_passthrough@ -- -- [__Extension Type__] -- Device extension -- -- [__Registered Extension Number__] -- 96 -- -- [__Revision__] -- 1 -- -- [__Extension and Version Dependencies__] -- -- - Requires Vulkan 1.0 -- -- [__Contact__] -- -- - Daniel Koch -- > > -- -- == Other Extension Metadata -- -- [__Last Modified Date__] -- 2017-02-15 -- -- [__Interactions and External Dependencies__] -- -- - This extension requires -- -- -- - This extension provides API support for -- -- -- - This extension requires the @geometryShader@ feature. -- -- [__Contributors__] -- -- - Piers Daniell, NVIDIA -- -- - Jeff Bolz, NVIDIA -- -- == Description -- -- This extension adds support for the following SPIR-V extension in -- Vulkan: -- -- - @SPV_NV_geometry_shader_passthrough@ -- -- Geometry shaders provide the ability for applications to process each -- primitive sent through the graphics pipeline using a programmable -- shader. However, one common use case treats them largely as a -- “passthrough”. In this use case, the bulk of the geometry shader code -- simply copies inputs from each vertex of the input primitive to -- corresponding outputs in the vertices of the output primitive. Such -- shaders might also compute values for additional built-in or -- user-defined per-primitive attributes (e.g., @Layer@) to be assigned to -- all the vertices of the output primitive. -- -- This extension provides access to the @PassthroughNV@ decoration under -- the @GeometryShaderPassthroughNV@ capability. Adding this to a geometry -- shader input variable specifies that the values of this input are copied -- to the corresponding vertex of the output primitive. -- -- When using GLSL source-based shading languages, the @passthrough@ layout -- qualifier from @GL_NV_geometry_shader_passthrough@ maps to the -- @PassthroughNV@ decoration. To use the @passthrough@ layout, in GLSL the -- @GL_NV_geometry_shader_passthrough@ extension must be enabled. Behaviour -- is described in the @GL_NV_geometry_shader_passthrough@ extension -- specification. -- -- == New Enum Constants -- -- - 'NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME' -- -- - 'NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION' -- -- == New Variable Decoration -- -- - -- in -- -- -- == New SPIR-V Capabilities -- -- - -- -- == Issues -- -- 1) Should we require or allow a passthrough geometry shader to specify -- the output layout qualifiers for the output primitive type and maximum -- vertex count in the SPIR-V? -- -- __RESOLVED__: Yes they should be required in the SPIR-V. Per -- GL_NV_geometry_shader_passthrough they are not permitted in the GLSL -- source shader, but SPIR-V is lower-level. It is straightforward for the -- GLSL compiler to infer them from the input primitive type and to -- explicitly emit them in the SPIR-V according to the following table. -- -- +-----------------------------------+------------------------------------------+ -- | Input Layout | Implied Output Layout | -- +===================================+==========================================+ -- | points | @layout(points, max_vertices=1)@ | -- +-----------------------------------+------------------------------------------+ -- | lines | @layout(line_strip, max_vertices=2)@ | -- +-----------------------------------+------------------------------------------+ -- | triangles | @layout(triangle_strip, max_vertices=3)@ | -- +-----------------------------------+------------------------------------------+ -- -- 2) How does interface matching work with passthrough geometry shaders? -- -- __RESOLVED__: This is described in -- . -- In GL when using passthough geometry shaders in separable mode, all -- inputs must also be explicitly assigned location layout qualifiers. In -- Vulkan all SPIR-V shader inputs (except built-ins) must also have -- location decorations specified. Redeclarations of built-in varables that -- add the passthrough layout qualifier are exempted from the rule -- requiring location assignment because built-in variables do not have -- locations and are matched by @BuiltIn@ decoration. -- -- == Sample Code -- -- Consider the following simple geometry shader in unextended GLSL: -- -- > layout(triangles) in; -- > layout(triangle_strip) out; -- > layout(max_vertices=3) out; -- > -- > in Inputs { -- > vec2 texcoord; -- > vec4 baseColor; -- > } v_in[]; -- > out Outputs { -- > vec2 texcoord; -- > vec4 baseColor; -- > }; -- > -- > void main() -- > { -- > int layer = compute_layer(); -- > for (int i = 0; i < 3; i++) { -- > gl_Position = gl_in[i].gl_Position; -- > texcoord = v_in[i].texcoord; -- > baseColor = v_in[i].baseColor; -- > gl_Layer = layer; -- > EmitVertex(); -- > } -- > } -- -- In this shader, the inputs @gl_Position@, @Inputs.texcoord@, and -- @Inputs.baseColor@ are simply copied from the input vertex to the -- corresponding output vertex. The only “interesting” work done by the -- geometry shader is computing and emitting a @gl_Layer@ value for the -- primitive. -- -- The following geometry shader, using this extension, is equivalent: -- -- > #extension GL_NV_geometry_shader_passthrough : require -- > -- > layout(triangles) in; -- > // No output primitive layout qualifiers required. -- > -- > // Redeclare gl_PerVertex to pass through "gl_Position". -- > layout(passthrough) in gl_PerVertex { -- > vec4 gl_Position; -- > } gl_in[]; -- > -- > // Declare "Inputs" with "passthrough" to automatically copy members. -- > layout(passthrough) in Inputs { -- > vec2 texcoord; -- > vec4 baseColor; -- > } v_in[]; -- > -- > // No output block declaration required. -- > -- > void main() -- > { -- > // The shader simply computes and writes gl_Layer. We do not -- > // loop over three vertices or call EmitVertex(). -- > gl_Layer = compute_layer(); -- > } -- -- == Version History -- -- - Revision 1, 2017-02-15 (Daniel Koch) -- -- - Internal revisions -- -- == See Also -- -- No cross-references are available -- -- == Document Notes -- -- For more information, see the -- -- -- This page is a generated document. Fixes and changes should be made to -- the generator scripts, not directly. module Vulkan.Extensions.VK_NV_geometry_shader_passthrough ( NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION , pattern NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION , NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME , pattern NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME ) where import Data.String (IsString) type NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION = 1 -- No documentation found for TopLevel "VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION" pattern NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION :: forall a . Integral a => a pattern NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION = 1 type NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME = "VK_NV_geometry_shader_passthrough" -- No documentation found for TopLevel "VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME" pattern NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a pattern NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME = "VK_NV_geometry_shader_passthrough"