Name

    OES_shader_multisample_interpolation

Name Strings

    GL_OES_shader_multisample_interpolation

Contact

    Daniel Koch, NVIDIA Corporation (dkoch 'at' nvidia.com)

Contributors

    Pat Brown, NVIDIA
    Eric Werness, NVIDIA
    Graeme Leese, Broadcom
    Contributors to ARB_gpu_shader5
    Members of the OpenGL ES working group

Notice

    Copyright (c) 2010-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete. 
    Ratified by the Khronos Board of Promoters on 2014/03/14.

Version

    Last Modified Date:         February 11, 2014
    Revision:                   10

Number

    OpenGL ES Extension #172

Dependencies

    OpenGL ES 3.0 and GLSL ES 3.00 required.

    This extension is written against the OpenGL ES 3.0.2 (April 8, 2013)
    and the OpenGL ES Shading Language Specification Revision 4
    (March 6, 2013) specifications.

    This extension requires OES_sample_variables.

    This extension interacts with OES_sample_shading.

Overview

    In standard multisample rendering, an implementation is allowed to
    assign the same sets of fragment shader input values to each sample.
    This can cause aliasing where the fragment shader input values are
    used to generate a result that doesn't antialias itself, for example
    with alpha-tested transparency.

    This extension adds the "sample" qualifier that can be used on vertex
    outputs and fragment inputs. When the "sample" qualifier is used, the
    fragment shader is invoked separately for each covered sample and
    all such qualified interpolants must be evaluated at the corresponding
    sample point.

    This extension provides built-in fragment shader functions to provide
    fine-grained control over interpolation, including interpolating a
    fragment shader input at a programmable offset relative to the pixel
    center, a specific sample number, or at the centroid.

IP Status

    No known IP claims.

New Procedures and Functions

    None

New Tokens

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

        MIN_FRAGMENT_INTERPOLATION_OFFSET_OES           0x8E5B
        MAX_FRAGMENT_INTERPOLATION_OFFSET_OES           0x8E5C
        FRAGMENT_INTERPOLATION_OFFSET_BITS_OES          0x8E5D

Additions to Chapter 2 of the OpenGL ES 3.0 Specification
(OpenGL Operation)

    None

Additions to Chapter 3 of the OpenGL ES 3.0 Specification
(Rasterization)

    Modify Section 3.3, Multisampling, p. 95

    (add new paragraph as the second-last paragraph, at the end of the
    section, p. 96)

    If the value of SAMPLE_BUFFERS is one and the current program object
    includes a fragment shader with one or more input variables qualified with
    "sample in", the data associated with those variables will be assigned
    independently.  The values for each sample must be evaluated at the
    location of the sample.  The data associated with any other variables not
    qualified with "sample in" need not be evaluated independently for each
    sample.


    Modify Section 3.9.1, Shader Variables, p. 161

    (modify the second last paragraph of the section to be as follows, p. 161)

    When interpolating input variables, the default
    screen-space location at which these variables are sampled is defined in
    previous rasterization sections.  The default location may be overriden by
    interpolation qualifiers.  When interpolating variables declared using
    "centroid in", the variable is sampled at a location within the pixel
    covered by the primitive generating the fragment.  When interpolating
    variables declared using "sample in" when the value of SAMPLE_BUFFERS is
    one, the fragment shader will be invoked separately for each covered sample
    and the variable will be sampled at the corresponding sample point.

    (add the following paragraph immediately after the above, p. 161)

    Additionally, built-in fragment shader functions provide further
    fine-grained control over interpolation.  The built-in functions
    interpolateAtCentroid() and interpolateAtSample() will sample variables as
    though they were declared with the "centroid" or "sample" qualifiers,
    respectively.  The built-in function interpolateAtOffset() will sample
    variables at a specified (x,y) offset relative to the center of the pixel.
    The range and granularity of offsets supported by this function is
    implementation-dependent.  If either component of the specified offset is
    less than MIN_FRAGMENT_INTERPOLATION_OFFSET_OES or greater than
    MAX_FRAGMENT_INTERPOLATION_OFFSET_OES, the position used to interpolate the
    variable is undefined.  Not all values of <offset> may be supported; x and
    y offsets may be rounded to fixed-point values with the number of fraction
    bits given by the implementation-dependent constant
    FRAGMENT_INTERPOLATION_OFFSET_BITS_OES.

Additions to Chapter 4 of the OpenGL ES 3.0 Specification
(Per-Fragment Operations and the Framebuffer)

    None.

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

    None.

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

    None.

Additions to Appendix A of the OpenGL ES 3.0 (Compatibility Profile)
Specification (Invariance)

    None.

Additions to the EGL Specifications

    None.

Modifications to The OpenGL ES Shading Language Specification, Version 3.00.04

    Including the following line in a shader can be used to control the
    language features described in this extension:

      #extension GL_OES_shader_multisample_interpolation : <behavior>

    where <behavior> is as specified in section 3.3.

    New preprocessor #defines are added to the OpenGL ES Shading Language:

      #define GL_OES_shader_multisample_interpolation  1


    Modify Section 3.7, Keywords, p. 15

    (add to the keyword list)

      sample

    (remove from the reserved keywords list)

      sample

    Modify Section 4.3, Storage Qualifiers, p. 33

    (add to first table on the page)

      Qualifier         Meaning
      --------------    ----------------------------------------
      sample in         linkage with per-sample interpolation
      sample out        linkage with per-sample interpolation

    (modify third paragraph, p. 33) These interpolation qualifiers may only
    precede the qualifiers in, centroid in, sample in, out, centroid out, or
    sample out in a declaration.  ...


    Modify Section 4.3.4, Input Variables, p. 35

    (modify first paragraph of section) Shader input variables are declared
    with the in, centroid in, or sample in storage qualifiers. ... Variables
    declared as in, centroid in, or sample in may not be written to during
    shader execution. ...

    (modify the last paragraph, p. 35) ... It is an error to use "centroid in",
    "sample in" or the interpolation qualifiers in a vertex shader input. ...

    (modify third paragraph, p. 36) ...  Fragment shader inputs get
    per-fragment values, typically interpolated from a previous stage's
    outputs.  They are declared in fragment shaders with the in, centroid in,
    or sample in storage qualifiers. ...

    (add to examples immediately below)

      sample in vec4 perSampleColor;

    (replace the last paragraph of section, specifying that "sample" only need
     be used in the fragment shader) The output of the vertex shader and the
     input of the fragment shader form an interface.  For this interface,
     vertex shader output variables and fragment shader input variables of the
     same name must match in type and qualification, with a few exceptions:
     The storage qualifiers must, of course, differ (one is in and one is
     out). Also, the "sample" qualifier may differ.  When the "sample"
     qualifier does not match, the qualifier declared (if any) in the vertex
     shader is ignored.

    Modify Section 4.3.6, Output Variables, p. 37

    (modify first paragraph of section) Shader output variables are declared
    with the out, centroid out, or sample out storage qualifiers. ...

    (modify third paragraph of section) Vertex output variables
    output per-vertex data and are declared using the out, centroid out, or
    sample out storage qualifiers. ...

    (add to examples immediately below)

      sample out vec4 perSampleColor;

    (modify last paragraph, p. 37) Fragment outputs output per-fragment data
    and are declared using the out storage qualifier. It is an error to use
    "centroid out" or "sample out" in a fragment shader. ...


    Modify Section 4.3.9, Interpolation, p. 44

    (modify first paragraph of section, add reference to sample in/out) The
    presence of and type of interpolation is controlled by the storage
    qualifiers centroid in, sample in, centroid out, and sample out, by the
    optional interpolation qualifiers smooth, and flat. When no interpolation
    qualifier is present, smooth interpolation is used. ...

    (modify second paragraph) ... A variable may be qualified as flat centroid
    or flat sample, which will mean the same thing as qualifying it only as
    flat.

    (replace last paragraph, p. 44)

    When single-sampling, or for fragment shader input
    variables qualified with neither "centroid in" nor "sample in", the value
    is interpolated to the pixel's center and
    a single value may be assigned to each sample within the pixel, to the
    extent permitted by the OpenGL ES Specification.

    When multisampling, "centroid" and "sample" may be
    used to control the location and frequency of the sampling of the
    qualified fragment shader input.  If a fragment shader input is qualified
    with "centroid", a single value may be assigned to that variable for all
    samples in the pixel, but that value must be interpolated at a location
    that lies in both the pixel and in the primitive being rendered, including
    any of the pixel's samples covered by the primitive.  Because the location
    at which the variable is interpolated may be different in neighboring pixels,
    and derivatives may be computed by computing differences in neighboring pixels,
    derivatives of centroid-sampled inputs may be less accurate than those for
    non-centroid interpolated variables.  If a fragment shader input is
    qualified with "sample", a separate value must be assigned to that
    variable for each covered sample in the pixel, and that value must be
    sampled at the location of the individual sample.


    Modify Section 8.9, Fragment Processing Functions, p. 99

    (add new functions to the end of section, p. 101)

    Built-in interpolation functions are available to compute an interpolated
    value of a fragment shader input variable at a shader-specified (x,y)
    location.  A separate (x,y) location may be used for each invocation of
    the built-in function, and those locations may differ from the default
    (x,y) location used to produce the default value of the input.
    For the interpolateAt* functions, the call will return a precision
    qualification matching the precision of the "interpolant" argument to
    the function call.

      float interpolateAtCentroid(float interpolant);
      vec2 interpolateAtCentroid(vec2 interpolant);
      vec3 interpolateAtCentroid(vec3 interpolant);
      vec4 interpolateAtCentroid(vec4 interpolant);

      float interpolateAtSample(float interpolant, int sample);
      vec2 interpolateAtSample(vec2 interpolant, int sample);
      vec3 interpolateAtSample(vec3 interpolant, int sample);
      vec4 interpolateAtSample(vec4 interpolant, int sample);

      float interpolateAtOffset(float interpolant, vec2 offset);
      vec2 interpolateAtOffset(vec2 interpolant, vec2 offset);
      vec3 interpolateAtOffset(vec3 interpolant, vec2 offset);
      vec4 interpolateAtOffset(vec4 interpolant, vec2 offset);

    The function interpolateAtCentroid() will return the value of the input
    <interpolant> sampled at a location inside the both the pixel and
    the primitive being processed.  The value obtained would be the same value
    assigned to the input variable if declared with the "centroid" qualifier.

    The function interpolateAtSample() will return the value of the input
    <interpolant> variable at the location of the sample numbered <sample>.  If
    multisample buffers are not available, the input varying will be evaluated
    at the center of the pixel.  If sample <sample> does
    not exist, the position used to interpolate the input varying is
    undefined.

    The function interpolateAtOffset() will return the value of the input
    <interpolant> variable sampled at an offset from the center of the pixel
    specified by <offset>.  The two floating-point components of <offset>
    give the offset in pixels in the x and y directions, respectively.
    An offset of (0,0) identifies the center of the pixel.  The range and
    granularity of offsets supported by this function is
    implementation-dependent.

    For all of the interpolation functions, <interpolant> must be an input
    variable or an element of an input variable declared as an array.
    Component selection operators (e.g., ".xy") may not be used when
    specifying <interpolant>.  If <interpolant> is declared with a "flat"
    qualifier, the interpolated value will have the same value everywhere for
    a single primitive, so the location used for the interpolation has no
    effect and the functions just return that same value.  If <interpolant>
    is declared with the "centroid" qualifier, the value returned by
    interpolateAtSample() and interpolateAtOffset() will be evaluated
    at the specified location, ignoring the location normally used with the
    "centroid" qualifier.


    Modify Section 9, Shading Language Grammar, p. 92

    !!! TBD !!!

Dependencies on OES_sample_shading

    This extension builds upon the per-sample shading support provided by
    OES_sample_shading to provide a new "sample" qualifier on a fragment
    shader input that forces per-sample shading, and specifies that the value
    of the input be evaluated per-sample.

    There is no interaction between the extensions, except that shaders using
    the features of this extension seem likely to use features from
    OES_sample_shading as well.

Errors

    None.

New State

    None.

New Implementation Dependent State

    Add to table 6.28 (Implementation Dependent Values)

                                               Min.
    Get Value               Type  Get Command  Value  Description                  Sec.
    ----------------------  ----  -----------  -----  --------------------------   -----
    MIN_FRAGMENT_INTERP-     R    GetFloatv    -0.5   furthest negative offset     3.9.1
      OLATION_OFFSET_OES                               for interpolateAtOffset()
    MAX_FRAGMENT_INTERP-     R    GetFloatv    +0.5   furthest positive offset     3.9.1
      OLATION_OFFSET_OES                               for interpolateAtOffset()
    FRAGMENT_INTERPOLATION_  Z+   GetIntegerv    4    subpixel bits for            3.9.1
      OFFSET_BITS_OES                                  interpolateAtOffset()

Issues

    (0) This extension is based on parts of ARB_gpu_shader5.  What are the
        major differences?

        1- rebased to ES 3.0
        2- edits for consistency with GL 4.4/GLSL 440 specs
        3- removed mention of 'noperspective' interpolation qualifier
        4- removed mention of multisample enable
        5- retained tighter interpolation requirements from ES3.0
        6- moved gl_SampleMaskIn to OES_sample_variables
        7- added precision statement for the interpolateAt* functions.

        For historical issues, please see Issues 1, 2, 9, 11, and 12 in
        ARB_gpu_shader5.

    (1) What should we call this extension?

        RESOLVED: It will be called OES_shader_multisample_interpolation
        since it allows the shader to explicitly control the interpolation
        used for multisample interpolation.

    (2) "sample" and "centroid" have been split out as "Auxiliary Storage
        Qualifiers" in GLSL 4.xx specs.  Should we follow the way the
        extension spec was written, or modify it to be more like GLSL 4.40?

        RESOLVED. Leave it as the original extension was written. The changes
        in the core spec are related to spec re-ordering which it makes no
        sense to try to replicate via an extension.

    (3) For Section 4.9.3 when multisample is disabled the ES 300 spec says
        "the value is interpolated at the pixel's center", however GLSL 440
        says "the value may be interpolated anywhere within the pixel.  Which
        behaviour do we want to incorporate?

        RESOLVED. We retain the tighter ES 300 requirement which specifies
        that the pixel's center must be used.

    (4) What to do with the MULTISAMPLE enable language?

        RESOLVED. OpenGL ES does not support MULTISAMPLE enable. This is
        determined by the buffer properties, aka the value of SAMPLE_BUFFERS.

    (5) Do we need precision qualifiers on the interpolatAt* functions?

        RESOLVED. Yes. A statement was added for the interpolateAt* functions
        to clarify that the the precision is taken to from the 'interpolant'
        argument to the functions.

    (6) Should the shading language built-ins have OES suffixes?

        RESOLVED: No. Per Bug 11637, the WG made a policy decision
        that GLSL ES identifiers imported without semantic change
        or subsetting as OES extensions from core GLSL do not carry
        suffixes. The #extension mechanism must still be used to
        enable the appropriate extension before the functionality can
        be used.

Revision History

    Rev.    Date      Author    Changes
    ----  ----------  --------  -----------------------------------------
    10    2014-02-12  dkoch     remove GLSL suffixes per Issue 6.
    9     2014-01-31  pbrown    Add language explicitly not requiring that
                                "sample" qualifier match between stages (bug
                                11189), where the fragment qualifier wins.
    8     2014-01-30  dkoch     rename to OES, clean editing notes
    7     2013-10-03  dkoch     rewrote overview and dependecies
    6     2013-09-16  dkoch     renamed to shader_multisample_interpolation
    5     2013-09-10  dkoch     Mark issue 5 as resolved.
    4     2013-09-09  dkoch     Require OES_sample_variables
                                Move gl_SampleMaskIn interaction base extension.
                                Add precision statement for interpolateAt fn's.
                                Add a couple new edits for ESSL spec.
    3     2013-09-03  gleese    Moved sample variables to OES_sample_variables
    2     2013-08-26  dkoch     resolved issues 2-4 & supporting edits.
    1     2013-08-13  dkoch     port to ES 3.0
    0     2013-08-07  dkoch     reduced ARB_gpu_shader5 to sample-related features
