| Name | |
| EXT_conservative_depth | |
| Name String | |
| GL_EXT_conservative_depth | |
| Contact | |
| Tobias Hector, Imagination Technologies (tobias.hector 'at' imgtec.com) | |
| Contributors | |
| Contributors to the original ARB_conservative_depth | |
| Ian Romanick | |
| Daniel Koch | |
| Status | |
| Final | |
| Version | |
| Last Modified Date: 14/09/2016 | |
| Author Revision: 3 | |
| Number | |
| OpenGL ES Extension #268 | |
| Dependencies | |
| OpenGL ES 3.0 is required. | |
| This extension is written against the OpenGL ES Shading Language Version 3.00.6 | |
| Overview | |
| There is a common optimization for hardware accelerated implementation of | |
| OpenGL ES which relies on an early depth test to be run before the fragment | |
| shader so that the shader evaluation can be skipped if the fragment ends | |
| up being discarded because it is occluded. | |
| This optimization does not affect the final rendering, and is typically | |
| possible when the fragment does not change the depth programmatically. | |
| (i.e.: it does not write to the built-in gl_FragDepth output). There are, | |
| however a class of operations on the depth in the shader which could | |
| still be performed while allowing the early depth test to operate. | |
| This extension allows the application to pass enough information to the | |
| GL implementation to activate such optimizations safely. | |
| New Procedures and Functions | |
| None. | |
| New Tokens | |
| None. | |
| Additions to Chapter 3 of the OpenGL ES Shading Language 3.00.06 Specification (Basics) | |
| Add a new Section 3.5.x, GL_EXT_conservative_depth Extension | |
| Including the following line in a shader can be used to control the language | |
| features described in this extension: | |
| #extension GL_EXT_conservative_depth: <behavior> | |
| where <behavior> is as described in section 3.5. | |
| A new preprocessor #define is added to the OpenGL Shading Language: | |
| #define GL_EXT_conservative_depth 1 | |
| Additions to Chapter 4 of the OpenGL Shading Language 3.00.06 Specification (Variables and Types) | |
| Modify Section 4.3.8.2 (Output Layout Qualifiers) page 47 | |
| Modify the paragraph beginning: "Fragment shaders allow output layout | |
| qualifiers only..." | |
| Fragment shaders allow output layout qualifiers only on the interface | |
| out, or for the purposes of redeclaring the built-in variable | |
| gl_FragDepth (see Section 7.2, Fragment Shader Special Variables). | |
| Insert the following at the end of the section: | |
| The built-in fragment shader variable gl_FragDepth may be redeclared using | |
| one of the following layout qualifiers. | |
| layout-qualifier-id | |
| depth_any | |
| depth_greater | |
| depth_less | |
| depth_unchanged | |
| For example: | |
| layout (depth_greater) out float gl_FragDepth; | |
| The layout qualifier for gl_FragDepth specifies constraints on the final | |
| value of gl_FragDepth written by any shader invocation. GL implementations | |
| may perform optimizations assuming that the depth test fails (or passes) | |
| for a given fragment if all values of gl_FragDepth consistent with the layout | |
| qualifier would fail (or pass). If the final value of gl_FragDepth | |
| is inconsistent with its layout qualifier, the result of the depth test for | |
| the corresponding fragment is undefined. However, no error will be | |
| generated in this case. When the depth test passes and depth writes are | |
| enabled, the value written to the depth buffer is always the value of | |
| gl_FragDepth, whether or not it is consistent with the layout qualifier. | |
| By default, gl_FragDepth assumes the <depth_any> layout qualifier. When | |
| the layout qualifier for gl_FragDepth is <depth_any>, the shader compiler | |
| will note any assignment to gl_FragDepth modifying it in an unknown way, | |
| and depth testing will always be performed after the shader has executed. | |
| When the layout qualifier is "depth_greater", the GL will assume that the | |
| final value of gl_FragDepth is greater than or equal to the fragment's | |
| interpolated depth value, as given by the <z> component of gl_FragCoord. | |
| When the layout qualifier is <depth_less>, the GL will assume that any | |
| modification of gl_FragDepth will only decrease its value. When the | |
| layout qualifier is <depth_unchanged>, the shader compiler will honor | |
| any modification to gl_FragDepth, but the rest of the GL assume that | |
| gl_FragDepth is not assigned a new value. | |
| Redeclarations of gl_FragDepth are performed as follows: | |
| // redeclaration that changes nothing is allowed | |
| out float gl_FragDepth; | |
| // assume it may be modified in any way | |
| layout (depth_any) out float gl_FragDepth; | |
| // assume it may be modified such that its value will only increase | |
| layout (depth_greater) out float gl_FragDepth; | |
| // assume it may be modified such that its value will only decrease | |
| layout (depth_less) out float gl_FragDepth; | |
| // assume it will not be modified | |
| layout (depth_unchanged) out float gl_FragDepth; | |
| Within any shader, the first redeclarations of gl_FragDepth must appear | |
| before any use of gl_FragDepth. The built-in gl_FragDepth is only | |
| predeclared in fragment shaders, so redeclaring it in any other shader | |
| language will be illegal. | |
| Revision History | |
| Rev. Date Author Changes | |
| ---- ---------- ------- ------------------------------------------------- | |
| 1 08/09/2016 thector Initial draft based on ARB_conservative_depth | |
| 2 12/09/2016 thector Converted to EXT as per feedback from Ian Romanick | |
| 3 14/09/2016 thector Removed reference to multiple fragment shaders as per Daniel Koch's feedback |