Name

    NV_geometry_shader4

Name String

    GL_NV_geometry_shader4

Contact

    Pat Brown, NVIDIA (pbrown 'at' nvidia.com)
    Barthold Lichtenbelt, NVIDIA (blichtenbelt 'at' nvidia.com)

Status

    Shipping for GeForce 8 Series (November 2006)

Version

    Last Modified Date:         11/09/2009
    Author revision:            17

Number

    338

Dependencies

    OpenGL 1.1 is required.

    EXT_geometry_shader4 is required.

    This extension is written against the EXT_geometry_shader4 and OpenGL 2.0
    specifications.

Overview

    This extension builds upon the EXT_geometry_shader4 specification to
    provide two additional capabilities:

        * Support for QUADS, QUAD_STRIP, and POLYGON primitive types when
          geometry shaders are enabled.  Such primitives will be tessellated
          into individual triangles.

        * Setting the value of GEOMETRY_VERTICES_OUT_EXT will take effect
          immediately.  It is not necessary to link the program object in
          order for this change to take effect, as is the case in the EXT
          version of this extension.

New Procedures and Functions

    None

New Tokens

    None

Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)

    Modify Section 2.15.2 Program Objects, p. 73

    Change the language below the LinkProgram command on p. 74 as follows:

    ... Linking can fail for a variety of reasons as specified in the OpenGL
    Shading Language Specification. Linking will also fail if one or more of
    the shader objects, attached to <program> are not compiled successfully,
    or if more active uniform or active sampler variables are used in
    <program> than allowed (see sections 2.15.3 and 2.16.3). Linking will also
    fail if the program object contains objects to form a geometry shader (see
    section 2.16), but no objects to form a vertex shader. If LinkProgram
    failed, ...

    Modify Section 2.16.1, Geometry shader Input Primitives, of the
    EXT_geometry_shader4 specification as follows:

    Triangles (TRIANGLES)

    Geometry shaders that operate on triangles are valid for the TRIANGLES,
    TRIANGLE_STRIP, TRIANGLE_FAN, QUADS, QUAD_STRIP, and POLYGON primitive
    types.

    When used with a geometry shader that operates on triangles, QUADS,
    QUAD_STRIP, and POLYGON primitives are decomposed into triangles in an
    unspecified, implementation-dependent manner. This decomposition satisfies
    three properties:

       1. the collection of triangles fully covers the area of the original
          primitive, 
       2. no two triangles in the decomposition overlap, and
       3. the orientation of each triangle is consistent with the orientation
          of the original primitive.

    For such primitives, the shader is executed once for each triangle in the
    decomposition.

    There are three vertices available for each program invocation. The first,
    second and third vertices refer to attributes of the first, second and
    third vertex of the triangle, respectively. ...

    Modify Section 2.16.4, Geometry Shader Execution Environment, of the
    EXT_geometry_shader4 specification as follows:

    Geometry shader inputs

    (modify the spec language for primitive ID, describing its interaction
    with QUADS, QUAD_STRIP, and POLYGON topologies) The built-in special
    variable gl_PrimitiveIDIn is not an array and has no vertex shader
    equivalent. It is filled with the number of primitives processed since the
    last time Begin was called (directly or indirectly via vertex array
    functions).  The first primitive generated after a Begin is numbered zero,
    and the primitive ID counter is incremented after every individual point,
    line, or polygon primitive is processed.  For polygons drawn in point or
    line mode, the primitive ID counter is incremented only once, even though
    multiple points or lines may be drawn.  For QUADS and QUAD_STRIP
    primitives that are decomposed into triangles, the primitive ID is
    incremented after each complete quad is processed.  For POLYGON
    primitives, the primitive ID counter is undefined.  Restarting a primitive
    topology using the primitive restart index has no effect on the primitive
    ID counter.

    Geometry Shader outputs

    (modify the vertex output limit language to allow changes to take effect
    immediately) A geometry shader is limited in the number of vertices it may
    emit per invocation. The maximum number of vertices a geometry shader can
    possibly emit needs to be set as a parameter of the program object that
    contains the geometry shader.  To do so, call ProgramParameteriEXT with
    <pname> set to GEOMETRY_VERTICES_OUT_EXT and <value> set to the maximum
    number of vertices the geometry shader will emit in one invocation.
    Setting this limit will take effect immediately.  If a geometry shader, in
    one invocation, emits more vertices than the value
    GEOMETRY_VERTICES_OUT_EXT, these emits may have no effect.

    (modify the error checking language for values that are too large) There
    are two implementation-dependent limits on the value of
    GEOMETRY_VERTICES_OUT_EXT.  First, the error INVALID_VALUE will be
    generated by ProgramParameteriEXT if the number of vertices specified
    exceeds the value of MAX_GEOMETRY_OUTPUT_VERTICES_EXT.  Second, the
    product of the total number of vertices and the sum of all components of
    all active varying variables may not exceed the value of
    MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT.  If <program> has already been
    successfully linked, the error INVALID_VALUE will be generated by
    ProgramParameteriEXT if the specified value causes this limit to be
    exceeded.  Additionally, LinkProgram will fail if it determines that the
    total component limit would be violated.

Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)

    None

Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)

    None

Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)

    None

Additions to Chapter 6 of the OpenGL 2.0 Specification (State and State
Requests)

    None

Additions to Appendix A of the OpenGL 2.0 Specification (Invariance)

    None

Additions to the AGL/GLX/WGL Specifications

    None

Interactions with NV_transform_feedback

    If GL_NV_transform_feedback is not supported, the function
    GetActiveVaryingNV() needs to be added to this extension. This function
    can be used to count the number of varying components output by a geometry
    shader, and from that data the maximum value for GEOMETRY_VERTICES_OUT_EXT
    computed by the application.

GLX protocol

    None required

Errors

    The error INVALID_OPERATION is generated if Begin, or any command that
    implicitly calls Begin, is called when a geometry shader is active and:

        * the input primitive type of the current geometry shader is POINTS
        and <mode> is not POINTS,
    
        * the input primitive type of the current geometry shader is LINES and
        <mode> is not LINES, LINE_STRIP, or LINE_LOOP,
    
        * the input primitive type of the current geometry shader is TRIANGLES
        and <mode> is not TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN, QUADS,
        QUAD_STRIP, or POLYGON,

        * the input primitive type of the current geometry shader is
        LINES_ADJACENCY_EXT and <mode> is not LINES_ADJACENCY_EXT or
        LINE_STRIP_ADJACENCY_EXT, or

        * the input primitive type of the current geometry shader is
        TRIANGLES_ADJACENCY_EXT and <mode> is not TRIANGLES_ADJACENCY_EXT or
        TRIANGLE_STRIP_ADJACENCY_EXT.

        * GEOMETRY_VERTICES_OUT_EXT is zero for the currently active program
        object.

New State

    None

Issues

   1. Why is there a GL_NV_geometry_shader4 and a GL_EXT_geometry_shader4
      extension?

      RESOLVED:  NVIDIA initially wrote the geometry shader extension, and
      worked with other vendors on a common extension.  Most of the
      functionality of the original specification was retained, but a few
      functional changes were made, resulting in the GL_EXT_geometry_shader4
      specification.  

      Some of the functionality removed in this process may be useful to
      developers, so we chose to provide an NVIDIA extension to expose this
      extra functionality.

   2. Should it be possible to change the limit on the number of vertices
      emitted by a geometry shader after the program object, containing the
      shader, is linked?

      RESOLVED:  Yes.  Applications may want to tweak a piece of data that
      affects the number of vertices emitted, but wouldn't otherwise require
      re-linking the entire program object.  One simple example might be a
      "circular point sprite" shader, that reads a single point, and draws a
      circle centered at that point with <N> vertices, where <N> is provided
      as a uniform.  An application could change the value <N> at run time,
      which would require a change in the vertex limit.  Another example might
      be a geometry shader that does some fancy subdivision, where the
      relevant parameter might be a limit on how far the primitive is
      subdivided.  This limit can be changed using the function
      ProgramParameteriEXT with <pname> set to GEOMETRY_VERTICES_OUT_EXT.

   3. How are QUADS, QUAD_STRIP, and POLYGON primitives decomposed into
      triangles in the initial implementation?

      RESOLVED: The specification leaves the decomposition undefined, subject
      to a small number of rules.  Assume that four vertices are specified in
      the order V0, V1, V2, V3.

      For QUADS primitives, the quad V0->V1->V2->V3 is decomposed into the
      triangles V0->V1->V2, and V0->V2->V3.  The provoking vertex of the quad
      (V3) is only found in the second triangle.  If it's necessary to flat
      shade over an entire quad, take the attributes from V0, which will be
      the first vertex for both triangles in the decomposition.

      For QUAD_STRIP primitives, the quad V0->V1->V3->V2 is decomposed into
      the triangles V0->V1->V3 and V2->V0->V3.  This has the property of
      leaving the provoking vertex for the polygon (V3) as the third vertex
      for each triangle of the decomposition.

      For POLYGON primitives, the polygon V0->V1->V2->V3 is decomposed into
      the triangles V1->V2->V0 and V2->V3->V0.  This has the property of
      leaving the provoking vertex for the polygon (V0) as the third vertex
      for each triangle of the decomposition.

      The triangulation described here is not guaranteed to be used on all
      implementations of this extension, and subsequent implementations may
      use a more natural decomposition for QUAD_STRIP and POLYGON primitives.
      (For example, the triangulation of 4-vertex polygons might match that
      used for QUADS.)

   4. Should this extension maintain the link error when GEOMETRY_VERTICES_OUT
      is zero at link time stipulated by EXT/ARB_geometry_shader?

      RESOLVED: No. While a link error is helpful to indicate the problem
      earlier and with additional information, the way this extension is meant
      to be used is more consistent with allowing the vertices out to remain
      unspecified until render time rather than demanding a potentially bogus
      value for it just to satisfy the linker.


Revision History


      Rev.    Date      Author    Changes
      ----  ----------  --------  -------------------------------------------
       17   10/09/2009  groth     Added explicit language excluding error for
                                  linking with zero GEOMETRY_VERTICES_OUT.
       16   01/10/2007  pbrown    Initial public revision.
