| Name |
| |
| AMD_conservative_depth |
| |
| Name String |
| |
| GL_AMD_conservative_depth |
| |
| Contact |
| |
| Graham Sellers, AMD (graham.sellers 'at' amd.com) |
| |
| Contributors |
| |
| Pierre Boudier, AMD |
| Graham Sellers, AMD |
| |
| Status |
| |
| In Progress |
| |
| Version |
| |
| Last Modified Date: 10/25/2010 |
| Author Revision: 4 |
| |
| Number |
| |
| 385 |
| |
| Dependencies |
| |
| OpenGL 3.0 is required. |
| |
| This extension is written against the OpenGL Shading Language Version 4.00. |
| |
| Overview |
| |
| There is a common optimization for hardware accelerated implementation of |
| OpenGL 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 the AGL/GLX/WGL Specifications |
| |
| None. |
| |
| Modifications to the OpenGL Shading Language Specification version 1.50.9 |
| |
| Additions to Chapter 1 of the OpenGL Shading Language 4.00.08 Specification (Introduction) |
| |
| None. |
| |
| Additions to Chapter 2 of the OpenGL Shading Language 4.00.08 Specification (Overview of OpenGL Shading) |
| |
| None. |
| |
| Additions to Chapter 3 of the OpenGL Shading Language 4.00.08 Specification (Basics) |
| |
| Add a new Section 3.3.x, GL_AMD_conservative_depth Extension |
| |
| Including the following line in a shader can be used to control the language |
| features described in this extension: |
| |
| #extension GL_AMD_conservative_depth: <behavior> |
| |
| where <behavior> is as described in section 3.3. |
| |
| A new preprocessor #define is added to the OpenGL Shading Language: |
| |
| #define GL_AMD_conservative_depth 1 |
| |
| Additions to Chapter 4 of the OpenGL Shading Language 4.00.08 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.1, Built-In Language Variables). |
| |
| Insert the following before the paragraph beginning: "Geometry shaders can |
| have three types of output layout qualifiers..." |
| |
| 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 controls how the GL will interpret |
| assignments to the gl_FragDepth out variable for the purpose of depth |
| testing. Any assignment to gl_FragDepth will be honored by the shader |
| and the updated value of gl_FragDepth will still be written to the |
| depth buffer if it is determined that the depth write should occur. |
| However, depending on the layout qualifier of gl_FragDepth and the |
| current state of depth testing, the GL may perform optimizations or |
| reordering of operations to depth test and writes to improve performance. |
| |
| 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 |
| any modification of gl_FragDepth will only increase its value. 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. |
| |
| If a shader redeclares gl_FragDepth using the <depth_greater>, |
| <depth_less> or <depth_unchanged> and then violates this contract, the |
| results of the depth test may be inaccurate and any resulting rendering |
| will produce undefined results. However, no error is generated. |
| |
| Redeclarations are performed as follows: |
| |
| out float gl_FragDepth; // Redeclaration that changes nothing is allowed |
| |
| layout (depth_any) out float gl_FragDepth; // Assume that gl_FragDepth may be modified in any way |
| layout (depth_greater) out float gl_FragDepth; // Assume that gl_FragDepth may be modified such that its value will only increase |
| layout (depth_less) out float gl_FragDepth; // Assume that gl_FragDepth may be modified such that its value will only decrease |
| layout (depth_unchanged) out float gl_FragDepth; // Assume that gl_FragDepth will not be modified |
| |
| If gl_FragDepth is redeclared in any fragment shader in a program, it must |
| be redeclared in all fragment shaders in that program that have static |
| assignments to gl_FragDepth. All redeclarations of gl_FragDepth in all |
| fragment shaders in a single program must have the same set of qualifiers. |
| 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 |
| ---- -------- -------- ----------------------------------------- |
| |
| 4 25/10/2010 gsellers Apply patch from idr. |
| 3 04/01/2010 gsellers Minor cleanup. Update to GLSL 4.00. |
| 2 12/01/2009 gsellers Internal updates |
| 1 11/03/2009 pboudier Initial draft |