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.
