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 : where 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