blob: dc0bb42ba62671555a7f01dc66aff15cc4f7be1e [file] [log] [blame]
Name
NV_primitive_shading_rate
Name Strings
GL_NV_primitive_shading_rate
Contact
Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com)
Contributors
Jeff Bolz, NVIDIA
Status
Shipping
Version
Last Modified: October 30, 2020
Revision: 1
Number
OpenGL Extension #554
OpenGL ES Extension #332
Dependencies
This extension is written against the OpenGL 4.6 Specification
(Compatibility Profile), dated February 2, 2019.
OpenGL 4.5 or OpenGL ES 3.2 is required.
NV_shading_rate_image is required.
This extension requires support from the OpenGL Shading Language (GLSL)
extension "NV_primitive_shading_rate", which can be found at the Khronos
Group Github site here:
https://github.com/KhronosGroup/GLSL
This extension interacts with NV_mesh_shader.
Overview
This extension builds on top of the NV_shading_rate_image extension to
provide OpenGL API support for using a per-primitive shading rate value to
control the computation of the rate used to process each fragment.
In the NV_shading_rate_image extension, the shading rate for each fragment
produced by a primitive is determined by looking up a texel in the bound
shading rate image and using that value as an index into a shading rate
palette. That extension provides a separate shading rate image lookup
enable and palette for each viewport. When a primitive is rasterized, the
implementation uses the enable and palette associated with the primitive's
viewport to determine the shading rate.
This extension decouples the shading rate image enables and palettes from
viewports. The number of enables/palettes now comes from the
implementation-dependent constant SHADING_RATE_IMAGE_PALETTE_COUNT_NV. When
SHADING_RATE_IMAGE_PER_PRIMITIVE_NV (added here) is enabled, the value of
the new gl_ShadingRateNV built-in output is used to select an enable and
palette to determine the shading rate. Otherwise, the viewport number for
the primitive is used, as in NV_shading_rate_image.
New Procedures and Functions
None.
New Tokens
Accepted by the <cap> parameter of Enable, Disable, and IsEnabled and by the
<pname> parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv,
GetDoublev:
SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1
Accepted by the <pname> parameter of GetBooleanv, GetDoublev,
GetIntegerv, and GetFloatv:
SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2
Modifications to the OpenGL 4.6 Specification (Compatibility Profile)
Modify Section 14.3.1, Multisampling, as modified by the
NV_shading_rate_image extension.
(modify the introduction of the shading rate image functionality to decouple
shading rate image enables and viewports)
When using a shading rate image (Section 14.4.1), rasterization may produce
fragments covering multiple pixels, where each pixel is treated as a sample.
If any of the SHADING_RATE_IMAGE_NV enables is enabled, primitives will be
processed with multisample rasterization rules, regardless of the
MULTISAMPLE enable or the value of SAMPLE_BUFFERS. ...
Modify Section 14.4.1, Shading Rate Image, as added by the
NV_shading_rate_image extension.
(rework the introduction of the shading rate image functionality to decouple
shading rate image enables and viewports)
Applications can specify the use of a shading rate that varies by (x,y)
location using a _shading rate image_. For each primitive, the shading rate
image is enabled or disabled by selecting a single enable in an array of
enables whose size is given by the implementation-dependent constant
SHADING_RATE_IMAGE_PALETTE_COUNT_NV. Use of a shading rate image is enabled
or disabled globally by using Enable or Disable with target
SHADING_RATE_IMAGE_NV. A single shading rate image enable can be modified
by calling Enablei or Disablei with the constant SHADING_RATE_IMAGE_NV and
the index of the selected enable. The shading rate image may only be used
with a framebuffer object. When rendering to the default framebuffer, the
shading rate image enables are ignored and operations in this section are
disabled. In the initial state, all shading rate image enables are
disabled.
The method used to select a single shading rate image enable used to process
each primitive is controlled by calling Enable or Disable with the target
SHADING_RATE_IMAGE_PER_PRIMITIVE_NV. When enabled, a shading rate enable
used for a primitive is selected using an index taken from the value of the
built-in output gl_ShadingRateNV for the primitive's provoking vertex. If
the value of gl_ShadingRateNV is negative or greater than or equal to the
number of shading rate enables, the shading rate used for a primitive is
undefined. When SHADING_RATE_IMAGE_PER_PRIMITIVE_NV is disabled, a shading
rate enable is selected using the index of the viewport used for processing
the primitive. In the initial state, SHADING_RATE_IMAGE_PER_PRIMITIVE_NV is
disabled.
(rework the introduction of the shading rate image functionality to decouple
shading rate image palettes and viewports)
A shading rate index is mapped to a _base shading rate_ using a lookup table
called the shading rate image palette. There is a separate palette
associated with each shading rate image enable. As with the shading rate
image enables, a single palette is selected for a primitive according to the
enable SHADING_RATE_IMAGE_PER_PRIMITIVE_NV. The number of palettes and the
number of entries in each palette are given by the implementation-dependent
constants SHADING_RATE_IMAGE_PALETTE_COUNT_NV and
SHADING_RATE_IMAGE_PALETTE_SIZE_NV, respectively. The base shading rate for
an (x,y) coordinate with a shading rate index of <i> will be given by entry
<i> of the selected palette. If the shading rate index is greater than or
equal to the palette size, the results of the palette lookup are undefined.
(rework the introduction of ShadingRateImagePaletteNV to decouple shading
rate image palettes and viewports)
Shading rate image palettes are updated using the command
void ShadingRateImagePaletteNV(uint viewport, uint first, sizei count,
const enum *rates);
<viewport> specifies the number of the palette that should be updated.
[[ Note: The formal parameter name <viewport> is a remnant of the
original NV_shading_rate_image extension, where palettes were tightly
coupled with viewports. ]] <rates> is an array ...
(modify the discussion of ShadingRateImagePaletteNV errors to decouple
shading rate image palettes and viewports)
INVALID_VALUE is generated if <viewport> is greater than or equal to
SHADING_RATE_IMAGE_PALETTE_COUNT_NV.
INVALID_VALUE is generated if <first> plus <count> is greater than
SHADING_RATE_IMAGE_PALETTE_SIZE_NV.
(modify the discussion of GetShadingRateImagePaletteNV to decouple shading
rate image palettes and viewports)
Individual entries in the shading rate palette can be queried using the
command:
void GetShadingRateImagePaletteNV(uint viewport, uint entry,
enum *rate);
where <viewport> specifies the number of the palette to query and...
<entry> specifies the palette entry number. [[ Note: The formal
parameter name <viewport> is a remnant of the original
NV_shading_rate_image extension, where palettes were tightly coupled
with viewports. ]] A single enum from Table X.1 is returned in <rate>.
Errors
INVALID_VALUE is generated if <viewport> is greater than or equal to
SHADING_RATE_IMAGE_PALETTE_COUNT_NV.
INVALID_VALUE is generated if <first> plus <count> is greater than
SHADING_RATE_IMAGE_PALETTE_SIZE_NV.
Modify Section 14.9.3, Multisample Fragment Operations, as edited by
NV_shading_rate_image.
(modify the discussion of the shading rate image multisample functionality
to decouple shading rate image enables and viewports)
... This step is skipped if MULTISAMPLE is disabled or if the value of
SAMPLE_BUFFERS is not one, unless one or more of the SHADING_RATE_IMAGE_NV
enables are enabled.
Dependencies on NV_mesh_shader
When NV_mesh_shader is supported, the "NV_primitive_shading_rate" GLSL
extension allows multi-view mesh shaders to write separate per-primitive
shading rates for each view using the built-in gl_ShadingRatePerViewNV[].
When gl_ShadingRatePerViewNV[] is used with
SHADING_RATE_IMAGE_PER_PRIMITIVE_NV enabled, a separate shading rate image
enable and palette will be used for each view.
Additions to the AGL/GLX/WGL Specifications
None
Errors
See the "Errors" sections for individual commands above.
New State
Get Value Get Command Type Initial Value Description Sec. Attribute
--------- --------------- ---- ------------- ----------- ---- ---------
SHADING_RATE_IMAGE_ IsEnabled B FALSE Use per-primitive shading 14.4.1 enable
PER_PRIMITIVE_NV rate to select shading
rate images/palettes
New Implementation Dependent State
Minimum
Get Value Type Get Command Value Description Sec.
--------- ----- --------------- ------- ------------------------ ------
SHADING_RATE_IMAGE_ Z+ GetIntegerv 16 Number of shading rate image 14.4.1
PALETTE_COUNT_NV enables/palettes supported
Issues
(1) How should we name this extension?
RESOLVED: We are calling this extension "NV_primitive_shading_rate"
because it adds a new per-primitive shading rate to the variable-rate
shading functionality added by NV_shading_rate_image.
(2) Do we need to add queries like LAYER_PROVOKING_VERTEX and
VIEWPORT_INDEX_PROVOKING_VERTEX to determine the vertex used to obtain
the per-primitive shading rate for each primitive?
RESOLVED: No -- we will always use the provoking vertex. In the event
that this extension is standardized in the future with behavior that
diverges between implementations, such a query could be added as part of
that effort.
Revision History
Revision 1 (pbrown)
- Internal revisions.