blob: 414fcf04c80d2bd287432ea2439889f540d943ac [file] [log] [blame]
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.