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 fragment's 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 fragment's 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.