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