Name

    EXT_frag_depth

Name Strings

    GL_EXT_frag_depth

Contributors

    Maurice Ribble
    Robert Simpson
    Jeff Leger
    Bruce Merry
    Acorn Pooley

Contact

    Maurice Ribble (mribble 'at' qualcomm.com)

Notice

    None

Status

    Draft

Version

    Date: July 21, 2010

Number

    OpenGL ES Extension #86

Dependencies

    OpenGL ES 2.0 is required.
    
    This extension is written against the OpenGL ES 2.0 specification, and
    the OpenGL ES Shading Language 1.0.17 specification.
    
    OES_fragment_precision_high affects the definitions of this extension.

Overview

    This extension adds the ability to set the depth value of a fragment from
    within the fragment shader.  Then this per-fragment depth value is used
    for depth testing.  This extension adds a built-in GLSL fragment shader 
    special varible to set the depth value.
    
    Much graphics hardware has the ability to do early depth testing before the
    fragment shader.  On such hardware there may be a performance penality for
    using this feature so use this feature only when needed.

Issues

    (1) Should the GLSL keyword be gl_FragDepth or gl_FragDepthEXT?
    
    RESOLVED: OpenGL has discussed this in the past and the agreement was that
    we should use gl_FragDepthEXT.
    
    (2) What should the precission qualifier be for gl_FragDepthEXT?
    
    RESOLVED: If the OES_fragment_precision_high is supported then highp is
    used, but if OES_fragment_precision_high not supported then mediump is 
    used.

New Procedures and Functions

    None

New Tokens

    None

New Keywords

    gl_FragDepthEXT

New Built-in Functions

    None

New Macro Definitions

    #define GL_EXT_frag_depth 1

Additions to Appendix A.3 Invariance Rules

    Rule 4: All fragment shaders that either conditionally or unconditionally
    assign gl_FragCoord.z to gl_FragDepthEXT are depth-invariant with respect
    to each other, for those fragments where the assignment to gl_FragDepthEXT
    actually is done.

Additions to Chapter 7 of the OpenGL ES Shading Language specification:

    Make the following changes to section 7.2 (Fragment Shader Special 
    Varibles).

    Replace the last sentence in the first paragraph with this:

    "Fragment shaders output values to the OpenGL ES pipeline using the 
    built-in variables gl_FragColor, gl_FragData, and gl_FragDepthEXT, unless the
    discard keyword is executed."
    
    Add this between the first and second paragraphs:
    
    "The built-in varible gl_FragDepthEXT is optional, and must be enabled by

    #extension GL_EXT_frag_depth : enable

    before being used."
   
    Replace the first sentence in the second paragraph with this:
    
    "It is not a requirement for the fragment shader to write to gl_FragColor,
    gl_FragData, or gl_FragDepthEXT."

    Add this paragraph after the paragraph that starts with "Writing to 
    gl_FragColor":

    "Writing to gl_FragDepthEXT will establish the depth value for the fragment 
    being processed. If MSAA is enabled, the depth value is copied to all
    samples corresponding to the fragment. If depth buffering is enabled, and
    no shader writes gl_FragDepthEXT, then the fixed function value for depth 
    will be used as the fragments depth value. If a shader statically assigns
    a value to gl_FragDepthEXT, and there is an execution path through the 
    shader that does not set gl_FragDepthEXT, then the value of the fragments 
    depth may be undefined for executions of the shader that take that path. 
    That is, if the set of linked fragment shaders statically contain a write 
    to gl_FragDepthEXT, then it is responsible for always writing it."

    Replace the paragraph that starts with "If a shader executes the discard" 
    with this:
    
    "If a shader executes the discard keyword, the fragment is discarded, and
    the values of any user-defined fragment outputs, gl_FragDepthEXT, 
    gl_FragColor, and gl_FragData become irrelevant."

    Replace the last sentence of the 9th paragraph with the following:

    The z component is the depth value that would be used for the fragment's
    depth if the shader contained no writes to gl_FragDepthEXT.  This is useful
    for invariance if a shader conditionally computes gl_FragDepthEXT but 
    otherwise wants the fixed functionality fragment depth.
    
    Add this to the list of built-in varibles:
    
    If OES_fragment_precision_high is supported add this:
      "highp float gl_FragDepthEXT;"
    otherwise add this:
      "mediump float gl_FragDepthEXT;"

New State

    None

Revision History

    6/14/2010  Created.
    6/14/2010  Added language to cover MSAA.
    6/15/2010  Fixed some typos.
    7/2/2010   Fixed issues from Bruce.
                Added wording to Appendix A.3.
                Added issues 1 and 2.
    7/8/2010   Changed from OES to EXT.
               Various updates from NV version of this extension.
    7/21/2010  Resolved issues 1 and 2.
                
