Top Description Fields Constructors Methods
org.lwjgl.vulkan

public final Class NVGeometryShaderPassthrough

extends Object
Class Inheritance

This extension adds support for the following SPIR-V extension in Vulkan:

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.

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();
}
VK_NV_geometry_shader_passthrough
Name String
VK_NV_geometry_shader_passthrough
Extension Type
Device extension
Registered Extension Number
96
Revision
1
Contact
Other Extension Metadata
Last Modified Date
2017-02-15
Interactions and External Dependencies
Contributors
  • Piers Daniell, NVIDIA
  • Jeff Bolz, NVIDIA

Field Summary

Modifier and TypeField and Description
public static final String
public static final int
VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION

The extension specification version.

Constructor Summary

AccessConstructor and Description
private

Method Summary

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAMEback to summary
public static final String VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME

The extension name.

VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSIONback to summary
public static final int VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION

The extension specification version.

Constructor Detail

NVGeometryShaderPassthroughback to summary
private NVGeometryShaderPassthrough()