| Name |
| |
| EXT_shader_non_constant_global_initializers |
| |
| Name Strings |
| |
| GL_EXT_shader_non_constant_global_initializers |
| |
| Contact |
| |
| Daniel Koch, NVIDIA (dkoch 'at' nvidia.com) |
| |
| Contributors |
| |
| Sahil Parmar, NVIDIA |
| Weiwan Liu, NVIDIA |
| John Kessenich, Google |
| Jeff Leger, Qualcomm |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Last Modified Date: July 4, 2016 |
| Revision: 2 |
| |
| Number |
| |
| OpenGL ES Extension #264 |
| |
| Dependencies |
| |
| OpenGL ES Shading Language 1.00 is required. |
| |
| This extension is written against the OpenGL ES 3.20 |
| Shading Language (August 6, 2015) specification, but |
| can apply to earlier versions. |
| |
| Overview |
| |
| This extension adds the ability to use non-constant initializers for |
| global variables in the OpenGL ES Shading Language specifications. |
| This functionality is already present in the OpenGL Shading language |
| specification. |
| |
| New Procedures and Functions |
| |
| None. |
| |
| New Tokens |
| |
| None. |
| |
| Additions to the OpenGL ES 3.2 Specification |
| |
| None |
| |
| Additions to the OpenGL ES Shading Language 3.20 Specification |
| |
| Including the following line in a shader can be used to control the |
| language features described in this extension: |
| |
| #extension GL_EXT_shader_non_constant_global_initializers : <behavior> |
| |
| where <behavior> is as specified in section 3.4. |
| |
| A new preprocessor #define is added to the OpenGL ES Shading Language: |
| |
| #define GL_EXT_shader_non_constant_global_initializers 1 |
| |
| Modifications to Section 4.3 (Storage Qualifiers): |
| |
| Replace the last paragraph: |
| |
| "In declarations of global variables with no storage qualifier or |
| with a const qualifier, any initializer must be a constant expression. |
| Declarations of global variables with other storage qualifiers may not |
| contain initializers. Global variables without storage qualifiers that |
| are not initialized in their declaration or by the application will not |
| be initialized by OpenGL ES, but rather will enter main() with undefined |
| values." |
| |
| with the following paragraph: |
| |
| "Initializers in global declarations may only be used in declarations |
| of global variables with either no storage qualifier, or a "const" |
| qualifier. All such initializers will have been executed before, or |
| on entry to, main(). Global variables without storage qualifiers that |
| are not initialized in their declaration or by the application will not |
| be initialized by OpenGL ES, but rather will enter main() with undefined |
| values." |
| |
| Issues |
| |
| (1) How does this differ from OpenGL Shader Language support? |
| |
| RESOLVED. This is based on the language from the OpenGL Shading |
| Language 4.50 specification. The only difference is that GLSL |
| allows initializers on uniform variables, whereas ESSL does not. |
| Also have added the statement clarifying that "All such initializers |
| will have been executed before, or on entry to, main()". |
| |
| (2) How should these global non-constant initializers be implemented? |
| |
| RESOLVED. They operate as if they are executed at the beginning of |
| the main() block before any other statements. That is: |
| |
| vec4 v = ...; // "..." is a valid non-const initializer at this point |
| |
| void main() |
| { |
| statement1; |
| statement2; |
| } |
| |
| means |
| |
| vec4 v; |
| |
| void main() |
| { |
| v = ...; |
| statement1; |
| statement2; |
| } |
| |
| For a more complex example: |
| |
| uniform int i; |
| int a = i; |
| |
| void foo(); |
| void main() { foo(); } |
| |
| int b = 2 * a; |
| |
| void foo() { /* what's b? */ } |
| |
| the same rule applies. The point in time 'b' gets it's value |
| is at the beginning of main(). There is no problem like "b isn't |
| visible in main()". Rather, 'b' exists and is initialized on entry |
| to main(), but is just not visible (per normal language rules). |
| The full semantics of this are implemented in the glslang reference |
| compiler. |
| |
| Revision History |
| Rev. Date Author Changes |
| ---- ----------- ------------ --------------------------------- |
| 1 10-Jun-2016 dkoch Initial draft based on GLSL 4.50 |
| 2 04-Jul-2016 dkoch Final edits before publishing |
| |