Name

    ARB_post_depth_coverage

Name Strings

    GL_ARB_post_depth_coverage

Contact

    Piers Daniell, NVIDIA Corporation (pdaniell 'at' nvidia.com)

Contributors

    Jeff Bolz, NVIDIA
    Pat Brown, NVIDIA
    James Helferty, NVIDIA
    Eric Werness, NVIDIA

Notice

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

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Complete. Approved by the ARB on June 26, 2015.
    Ratified by the Khronos Board of Promoters on August 7, 2015.

Version

    Last Modified Date:         June 25, 2015
    Revision:                   3

Number

    ARB Extension #180

Dependencies

    This extension is written against the OpenGL 4.5 specification
    (Compatibility Profile).

    This extension is written against version 4.50 of the OpenGL
    Shading Language Specification.

    This extension interacts with NV_fragment_program4.

    This extension interacts with EXT_post_depth_coverage.

Overview

    This extension allows the fragment shader to control whether values in
    gl_SampleMaskIn[] reflect the coverage after application of the early
    depth and stencil tests.  This feature can be enabled with the following
    layout qualifier in the fragment shader:

        layout(post_depth_coverage) in;

    Use of this feature implicitly enables early fragment tests.

New Procedures and Functions

    None.

New Tokens

    None.

Additions to Chapter 15 of the OpenGL 4.5 (Compatibility Profile) Specification
(Rasterization)

    Modify Section 15.1 Fragment Shader Variables, p. 558

    (modify the third paragraph on p. 559)

    ...When interpolating variables declared using "centroid in", the variable
    is sampled at a location within the pixel covered by the primitive
    generating the fragment. The fragment shader layout qualifier
    "post_depth_coverage" (Section 15.2.2) does not affect the determination of the
    centroid location.

    Modify Section 15.2.2 Shader Inputs, p. 560

    (modify the fourth paragraph on p. 562)

    ...Bit <n> of element <w> in the array is set if and only if the sample
    numbered <32w + n> is considered covered for this fragment shader
    invocation. If the fragment shader specifies the "early_fragment_tests" and
    "post_depth_coverage" layout qualifiers, then the sample is considered covered
    if and only if the sample is covered by the primitive and the sample passes
    the early fragment tests (as described in Section 15.2.4). If these layout
    qualifiers are not specified, then the sample is considered covered if the
    sample is covered by the primitive, regardless of the result of the
    fragment tests. ...


New Implementation Dependent State

    None.

New State

    None.

Additions to the AGL/GLX/WGL Specifications

    None.

GLX Protocol

    None.

Modifications to the OpenGL Shading Language Specification, Version 4.50

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

      #extension GL_ARB_post_depth_coverage : <behavior>

    where <behavior> is as specified in section 3.3.

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

      #define GL_ARB_post_depth_coverage                1


    Modify Section 4.4.1.3 Fragment Shader Inputs (p. 63)

    (replace the discussion of early_fragment_tests on p. 64)

    Fragment shaders also allow the following layout qualifiers on "in" only (not
    with variable declarations)

        layout-qualifier-id
            early_fragment_tests
            post_depth_coverage

    For example,

        layout(early_fragment_tests) in;
        layout(post_depth_coverage) in;

    "early_fragment_tests" requests that fragment tests be performed before
    fragment shader execution, as described in section 15.2.4 "Early Fragment
    Tests" of the OpenGL Specification. If neither this nor post_depth_coverage
    are declared, per-fragment tests will be performed after fragment shader
    execution.

    "post_depth_coverage" requests that the built-in "gl_SampleMaskIn[]" will
    reflect the result of the early fragment tests, as described in section
    15.2.2 "Shader Inputs" of the OpenGL Specification.

    Only one fragment shader (compilation unit) need declare these, though
    more than one can. If at least one fragment shader declares one of these,
    then it is enabled.


Dependencies on NV_fragment_program4

    Modify Section 2.X.6.Y of the NV_fragment_program4 specification

    (add new option section)

    + Post-depth Coverage (ARB_post_depth_coverage)

    If a fragment program specifies the "ARB_post_depth_coverage" option, the
    sample mask will reflect the result of the early fragment tests, as
    described in Section 15.2.2 "Shader Inputs". If a fragment program
    specifies the ARB_post_depth_coverage option and not the
    NV_early_fragment_tests option, it will fail to compile.

Dependencies on EXT_post_depth_coverage

    If a shader enables both EXT_post_depth_coverage and ARB_post_depth_coverage
    the behavior of layout(post_depth_coverage) will match
    ARB_post_depth_coverage.

Errors

    None.

Issues

    (1) Should the determination of a fragment's centroid use the pre-depth or
    post-depth coverage?

    RESOLVED: In this extension, it uses the pre-depth coverage. This way the
    centroid location (and hence the result of shading) does not depend on the
    rendering order, which is almost certainly the desired result for 3D
    rendering.

    For path rendering, it would be desirable to use post-depth centroid since
    the stencil test really determines whether samples are inside the primitive
    rather than whether samples are "occluded," and guaranteeing attributes
    are sampled inside the path would be nice.

    (2) What happens if you write gl_FragDepth? What about side-effects?

    RESOLVED: Because the post_depth_coverage option implies
    early_fragment_tests, the behavior for these cases is inhereted from the
    basic early_fragment_tests behavior, so writes to gl_FragDepth are ignored
    and side effects are only executed on shaders that are executed which have
    already passed the early fragment operations.

Revision History

    Revision 3, June 25, 2015

      Add interaction between ARB_post_depth_coverage and
      EXT_post_depth_coverage behaviors

    Revision 2, April 29, 2015

      Implicitly enable early_fragment_tests when post_depth_coverage
      is enabled. Add a clarification issue.

    Revision 1, April 20, 2015

      Initial ARB spec branched from EXT_post_depth_coverage
