Name

    NV_conservative_raster

Name Strings

    GL_NV_conservative_raster

Contact

    Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com)

Contributors

    Michael Chock, NVIDIA Corporation

Status

    Shipping.

Version

    Last Modified Date:         March 27, 2015
    Revision:                   3

Number

    OpenGL Extension #465
    OpenGL ES Extension #228

Dependencies

    This extension is written against the OpenGL 4.3 specification
    (Compatibility Profile) but may be used with the Core profile or
    OpenGL ES 2.0 or later.

    When this extension is used with the Core profile or an OpenGL ES
    context, references to functionality specific to the Compatibility
    Profile can be ignored.
    
Overview

    This extension adds a "conservative" rasterization mode where any pixel
    that is partially covered, even if no sample location is covered, is 
    treated as fully covered and a corresponding fragment will be shaded.

    A new control is also added to modify window coordinate snapping 
    precision.

    These controls can be used to implement "binning" to a low-resolution
    render target, for example to determine which tiles of a sparse texture
    need to be populated. An app can construct a framebuffer where there is
    one pixel per tile in the sparse texture, and adjust the number of
    subpixel bits such that snapping occurs to the same effective grid as when
    rendering to the sparse texture. Then triangles should cover (at least)
    the same pixels in the low-res framebuffer as they do tiles in the sparse
    texture.


New Procedures and Functions

    void SubpixelPrecisionBiasNV(uint xbits, uint ybits);

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, IsEnabled:

        CONSERVATIVE_RASTERIZATION_NV                   0x9346

    Accepted by the <pname> parameter of GetBooleanv, GetDoublev,
    GetIntegerv, and GetFloatv:

        SUBPIXEL_PRECISION_BIAS_X_BITS_NV               0x9347
        SUBPIXEL_PRECISION_BIAS_Y_BITS_NV               0x9348
        MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV             0x9349
    
Additions to Chapter 13 of the OpenGL 4.3 (Compatibility Profile) Specification
(Fixed-Function Vertex Post-Processing)

    Modify subsection 13.6.1 "Controlling the Viewport", p. 469

    Add after the formula for the vertex's window coordinates:

    The vertex's window x and y coordinates may be optionally converted 
    to fixed-point values with <N> fractional bits. If CONSERVATIVE_-
    RASTERIZATION_NV is disabled (see section 14.6.X), then <N> is the 
    implementation-dependent value of SUBPIXEL_BITS. If CONSERVATIVE_-
    RASTERIZATION_NV is enabled, <N> is computed as the sum of the value of 
    SUBPIXEL_BITS and programmable values of SUBPIXEL_PRECISION_BIAS_{X,Y}-
    _BITS_NV. These values may be set with the command

        void SubpixelPrecisionBiasNV(uint xbits, uint ybits);

    When these values are non-zero, the invariance requirement of section 14.2 
    may not apply because the subpixel precision may not be the same at all 
    window coordinates. The initial values of SUBPIXEL_PRECISION_BIAS_{X,Y}-
    _BITS_NV are zero. If <xbits> or <ybits> are greater than the value of 
    MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV, the error INVALID_VALUE is generated.


Additions to Chapter 14 of the OpenGL 4.3 (Compatibility Profile) Specification
(Fixed-Function Primitive Assembly and Rasterization)

    Add a new subsection at the end of 14.6, 14.6.X "Conservative Rasterization"

    Point, line, and polygon rasterization may optionally be made conservative
    by calling Enable and Disable with a <pname> of CONSERVATIVE_-
    RASTERIZATION_NV. When conservative rasterization is enabled, rather than 
    evaluating coverage at individual sample locations, a determination is made 
    of whether any portion of the pixel (including its edges and corners) is 
    covered by the primitive. If any portion of the pixel is covered, then a 
    fragment is generated with all coverage samples turned on. Conservative 
    rasterization may also generate fragments for pixels near the edges of 
    rasterized point or line primitives, even if those pixels are not covered 
    by the primitive. The set of such pixels is implementation-dependent, but 
    implementations are encouraged to evaluate coverage as precisely as 
    possible.

    If CONSERVATIVE_RASTERIZATION_NV is enabled, points are rasterized 
    according to multisample rasterization rules (section 14.4.3), except that 
    a fragment will be generated for a framebuffer pixel if the circle 
    (POINT_SPRITE disabled) or square (POINT_SPRITE enabled) covers any portion 
    of the pixel, including its edges or corners.  When performing conservative 
    rasterization of points, the POINT_SMOOTH enable is ignored and treated as
    disabled.

    If CONSERVATIVE_RASTERIZATION_NV is enabled, lines are rasterized according 
    to multisample rasterization rules (section 14.5.4), except that the 
    LINE_STIPPLE and LINE_SMOOTH enables are ignored and treated as disabled.

    If CONSERVATIVE_RASTERIZATION_NV is enabled, polygons are rasterized 
    according to multisample rasterization rules (section 14.6.6), except that 
    the POLYGON_SMOOTH enable is ignored and treated as disabled. Polygons with 
    an area of zero generate no fragments, even for pixels that contain a 
    vertex or edge of the zero-area polygon.

    Modify the new Subsection "Drawing Textures" from the NV_draw_texture 
    extension:

    In either case, the set of fragments generated is not affected by the 
    CULL_FACE, POLYGON_SMOOTH, POLYGON_OFFSET_FILL enables, or PolygonMode 
    state. The CONVSERVATIVE_RASTERIZATION_NV enable does apply, and fragments
    will be generated for all pixels which have any portion covered by the 
    rectangle. All fragments generated for the rectangle will have a Z window
    coordinate of <z>.


Interactions with OpenGL ES and Core Profiles

    If using OpenGL ES or a Core profile, references to LINE_SMOOTH,
    LINE_STIPPLE, POINT_SMOOTH, and POLYGON_SMOOTH are ignored and treated as
    disabled. POINT_SPRITE is ignored and treated as enabled. For OpenGL ES,
    references to PolygonMode are ignored.


New Implementation Dependent State

                                                      Minimum
    Get Value                    Type    Get Command  Value   Description                   Sec.
    ---------                    ------- -----------  ------- ------------------------      ------
    MAX_SUBPIXEL_PRECISION_-     Z+      GetIntegerv   1      Max number of extra bits      13.6.1
        BIAS_BITS_NV


New State

    Get Value                           Get Command    Type    Initial Value    Description                 Sec.    Attribute
    ---------                           -----------    ----    -------------    -----------                 ----    ---------
    CONSERVATIVE_RASTERIZATION_NV       IsEnabled      B       FALSE            Enable conservative         14.6.X  enable
                                                                                rasterization rules
    SUBPIXEL_PRECISION_BIAS_X_BITS_NV   GetIntegerv    Z+      0                Additional window x         13.6.1  viewport
                                                                                coordinate precision
    SUBPIXEL_PRECISION_BIAS_Y_BITS_NV   GetIntegerv    Z+      0                Additional window y         13.6.1  viewport
                                                                                coordinate precision

Additions to the AGL/GLX/WGL Specifications

    None.

GLX Protocol

    None.
    
Modifications to the OpenGL Shading Language Specification, Version 4.30

    None.

Errors

    INVALID_VALUE is generated by SubpixelPrecisionBiasNV if <xbits> or
    <ybits> are greater than the value of MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV.

Issues

    (1) How is invariance affected by the precision bias?

    RESOLVED: Invariance may be broken for large enough values of the bias. It 
    is expected that an implementation has enough precision to support 
    SUBPIXEL_BITS for a MAX_VIEWPORT_DIMS size viewport, but if the combination 
    of viewport size and total subpixel precision exceed that then less 
    precision may be used for large x,y coordinates.

    (2) Do zero area primitives generate fragments in conservative raster?

    RESOLVED: No, although in some cases that may not be the desired behavior.
    If a primitive is truly zero area (e.g. two vertices of a triangle have 
    identical positions), then drawing nothing is probably fine. If the 
    primitive happens to be zero area due to subpixel precision then generating
    fragments may be desirable, but this spec does define that behavior.

    The primary reason to discard zero area primitives is that attribute 
    interpolation is not well-defined when the area is zero.

    (3) How does centroid interpolation work for a conservative primitive?

    RESOLVED: Since a fragment generated by a conservative primitive is 
    considered "fully covered", any location within the pixel may be used for
    interpolation. This implies that the interpolation may occur outside of the
    original primitive, causing attribute extrapolation. 
    
    (4) How is depth coordinate evaluation handled for conservative 
    rasterization?
    
    RESOLVED: The "extrapolation" issue for attributes also applies to depth
    evaluation.

    (5) How does NV_draw_texture interact with this extension?

    RESOLVED: The DrawTextureNV command rasterizes conservatively.

Revision History

    Revision 3, 2015/03/27
      - Add ES interactions

    Revision 2, 2014/09/26 (Jon Leech)
      - Add missing return type to function 

    Revision 1
      - Internal revisions.
