| Name | 
 |  | 
 |     ARB_ES2_compatibility | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_ARB_ES2_compatibility | 
 |  | 
 | Contact | 
 |  | 
 |     Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com) | 
 |  | 
 | Contributors | 
 |  | 
 |     Acorn Pooley, NVIDIA | 
 |     Bruce Merry, ARM | 
 |     Greg Roth, NVIDIA | 
 |     Pat Brown, NVIDIA | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2010-2013 The Khronos Group Inc. Copyright terms at | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Status | 
 |  | 
 |     Complete. Approved by the ARB on June 9, 2010. | 
 |     Approved by the Khronos Board of Promoters on July 23, 2010. | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date:         March 12, 2012 | 
 |     Revision:                   7 | 
 |  | 
 | Number | 
 |  | 
 |     ARB Extension #95 | 
 |  | 
 | Dependencies | 
 |  | 
 |     Written based on the wording of the OpenGL 4.0 Compatibility | 
 |     Profile (March 11, 2010) specification. | 
 |  | 
 |     This extension interacts with ARB_tessellation_shader or OpenGL 4.0. | 
 |  | 
 | Overview | 
 |  | 
 |     This extension adds support for features of OpenGL ES 2.0 that are | 
 |     missing from OpenGL 3.x. Enabling these features will ease the process | 
 |     of porting applications from OpenGL ES 2.0 to OpenGL. | 
 |  | 
 | IP Status | 
 |  | 
 |     No known IP claims. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     void ReleaseShaderCompiler(void); | 
 |     void ShaderBinary(sizei count, const uint *shaders, | 
 |                       enum binaryformat, const void *binary, sizei length); | 
 |     void GetShaderPrecisionFormat(enum shadertype, | 
 |                                   enum precisiontype, | 
 |                                   int *range, int *precision); | 
 |  | 
 |     void DepthRangef(clampf n, clampf f); | 
 |     void ClearDepthf(clampf d); | 
 |  | 
 | New Tokens | 
 |  | 
 |     Accepted by the <value> parameter of GetBooleanv, GetIntegerv, | 
 |     GetInteger64v, GetFloatv, and GetDoublev: | 
 |  | 
 |         SHADER_COMPILER                                 0x8DFA | 
 |         SHADER_BINARY_FORMATS                           0x8DF8 | 
 |         NUM_SHADER_BINARY_FORMATS                       0x8DF9 | 
 |         MAX_VERTEX_UNIFORM_VECTORS                      0x8DFB | 
 |         MAX_VARYING_VECTORS                             0x8DFC | 
 |         MAX_FRAGMENT_UNIFORM_VECTORS                    0x8DFD | 
 |         IMPLEMENTATION_COLOR_READ_TYPE                  0x8B9A | 
 |         IMPLEMENTATION_COLOR_READ_FORMAT                0x8B9B | 
 |  | 
 |     Accepted by the <type> parameter of VertexAttribPointer: | 
 |  | 
 |         FIXED                                           0x140C | 
 |  | 
 |     Accepted by the <precisiontype> parameter of | 
 |     GetShaderPrecisionFormat: | 
 |  | 
 |         LOW_FLOAT                                       0x8DF0 | 
 |         MEDIUM_FLOAT                                    0x8DF1 | 
 |         HIGH_FLOAT                                      0x8DF2 | 
 |         LOW_INT                                         0x8DF3 | 
 |         MEDIUM_INT                                      0x8DF4 | 
 |         HIGH_INT                                        0x8DF5 | 
 |  | 
 |     Accepted by the <format> parameter of most commands taking sized | 
 |     internal formats: | 
 |  | 
 |         RGB565                                           0x8D62 | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 4.0 Specification (OpenGL Operation) | 
 |  | 
 |     Add a new Section 2.1.5 (Fixed-Point Computation) and renumber later | 
 |     sections: | 
 |  | 
 |     Fixed-Point Computation | 
 |  | 
 |     Vertex attributes may be specified using a 32-bit two's-complement signed | 
 |     representation with 16 bits to the right of the binary point (fraction | 
 |     bits). | 
 |  | 
 |  | 
 |     Add to Table 2.2, p. 16 (GL data types) | 
 |  | 
 |         GL Type |  Minimum  | Description | 
 |                 | Bit Width | | 
 |         ----------------------------------- | 
 |         fixed   |    32     | Signed 2's complement 16.16 scaled integer | 
 |  | 
 |  | 
 |     Section 2.8, p.36 (Vertex Arrays) | 
 |  | 
 |     Adjust the sentence in the first paragraph on p. 37: | 
 |  | 
 |     For type the values BYTE, SHORT, INT, FLOAT, HALF_FLOAT, DOUBLE, and | 
 |     FIXED indicate types byte, short, int, float, half, double, and fixed | 
 |     respectively;... | 
 |  | 
 |  | 
 |     Modify the descripion of the pseudocode explaining | 
 |     ArrayElementInstanced as follows (p.42): | 
 |  | 
 |     ... VertexAttrib[size]N[type]v will be called. When a generic vertex | 
 |     attribute array contains fixed-point data, the generic vertex | 
 |     attribute values are specified using a fixed-point signed 2's | 
 |     complement 16.16 scaled integer format. | 
 |  | 
 |     Section 2.8.2, p.43 (Drawing Commands) | 
 |  | 
 |     Modify the paragraphs that begin with "with one exception" (page 44): | 
 |  | 
 |     with one exception: the current normal coordinate, color, secondary | 
 |     color, color index, edge flag, fog coordinate, texture coordinates, | 
 |     and generic attribute values are not modified by the execution of | 
 |     DrawArraysOneInstance. | 
 |  | 
 |     ... | 
 |  | 
 |     with one exception: the current normal coordinate, color, secondary | 
 |     color, color index, edge flag, fog coordinate, texture coordinates, and | 
 |     generic attribute values are not modified by the execution of | 
 |     DrawElements. | 
 |  | 
 |  | 
 |     Table 2.5, p. 39 (Vertex array sizes (values per vertex) and data types.) | 
 |  | 
 |     Add "fixed" as a legal type for VertexAttribPointer | 
 |  | 
 |  | 
 |     Section 2.14, p. 89 (Vertex Shaders) | 
 |  | 
 |     Modify the third paragraph: | 
 |  | 
 |     To use a vertex shader, shader source code is first loaded into a shader | 
 |     object and then compiled. Alternatively, pre-compiled shader binary code | 
 |     may be directly loaded into a shader object. An OpenGL implementation | 
 |     must support shader compilation (the boolean value SHADER_COMPILER must | 
 |     be TRUE). If the integer value NUM_SHADER_BINARY_FORMATS is greater than | 
 |     zero, then shader binary loading is supported. One or more vertex shader | 
 |     objects are then attached to a program object.... | 
 |  | 
 |  | 
 |     Section 2.14.1, p. 89 (Shader Objects) | 
 |  | 
 |     Add before the description of DeleteShader: | 
 |  | 
 |     Resources allocated by the shader compiler may be released with the | 
 |     command | 
 |  | 
 |         void ReleaseShaderCompiler(void); | 
 |  | 
 |     This is a hint from the application, and does not prevent later use | 
 |     of the shader compiler. If shader source is loaded and compiled after | 
 |     ReleaseShaderCompiler has been called, CompileShader must succeed | 
 |     provided there are no errors in the shader source. | 
 |  | 
 |     The range and precision for different numeric formats supported by the | 
 |     shader compiler may be determined with the command | 
 |     GetShaderPrecisionFormat (see section 6.1.16) | 
 |  | 
 |  | 
 |     Add a new Section 2.14.2 (Loading Shader Binaries) and shift other | 
 |     section numbers. | 
 |  | 
 |     Precompiled shader binaries may be loaded with the command | 
 |  | 
 |         void ShaderBinary(sizei count, const uint *shaders, | 
 |                           enum binaryformat, const void *binary, | 
 |                           sizei length); | 
 |  | 
 |     <shaders> contains a list of <count> shader object handles. Each | 
 |     handle refers to a unique shader type (vertex shader or fragment | 
 |     shader). <binary>  points to <length> bytes of pre-compiled binary | 
 |     shader code in client memory, and <binaryformat> denotes the format | 
 |     of the pre-compiled code. | 
 |  | 
 |     The binary image will be decoded according to the extension | 
 |     specification defining the specified <binaryformat>. OpenGL defines | 
 |     no specific binary formats, but does provide a mechanism to obtain | 
 |     token values for such formats provided by extensions. The number of | 
 |     shader binary formats supported can be obtained by querying the | 
 |     value of NUM_SHADER_BINARY_FORMATS. The list of specific binary | 
 |     formats supported can be obtained by querying the value of | 
 |     SHADER_BINARY_FORMATS. | 
 |  | 
 |     Depending on the types of the shader objects in <shaders>, | 
 |     ShaderBinary will individually load binary vertex or fragment | 
 |     shaders, or load an executable binary that contains an optimized | 
 |     pair of vertex and fragment shaders stored in the same binary. | 
 |  | 
 |     An INVALID_ENUM error is generated if <binaryformat> is not a | 
 |     supported format returned in SHADER_BINARY_FORMATS. An INVALID_VALUE | 
 |     error is generated if the data pointed to by binary does not match | 
 |     the specified <binaryformat>. Additional errors corresponding to | 
 |     specific binary formats may be generated as specified by the | 
 |     extensions defining those formats. An INVALID_OPERATION error is | 
 |     generated if more than one of the handles refers to the same type of | 
 |     shader (vertex or fragment shader.) | 
 |  | 
 |     If ShaderBinary fails, the old state of shader objects for which the | 
 |     binary was being loaded will not be restored. Note that if shader | 
 |     binary interfaces are supported, then an OpenGL implementation may | 
 |     require that an optimized pair of vertex and fragment shader binaries | 
 |     that were compiled together be specified to LinkProgram. Not | 
 |     specifying an optimized pair may cause LinkProgram to fail. | 
 |  | 
 |     Section 2.14.4, p. 97 (Uniform Variables) | 
 |  | 
 |     Add after the definition of MAX_VERTEX_UNIFORM_COMPONENTS: | 
 |  | 
 |     The implementation-dependent constant MAX_VERTEX_UNIFORM_VECTORS has | 
 |     a value equal to the value of MAX_VERTEX_UNIFORM_COMPONENTS divided | 
 |     by four. | 
 |  | 
 |  | 
 |     Section 2.14.7, p. 118 (Varying Variables) | 
 |  | 
 |     Add after the definition of MAX_VARYING_COMPONENTS: | 
 |  | 
 |     The implementation-dependent constant MAX_VARYING_VECTORS has a | 
 |     value equal to the value of MAX_VARYING_COMPONENTS divided by four. | 
 |  | 
 |  | 
 |     Section 2.16.1, p. 164 (Controlling the Viewport) | 
 |  | 
 |     Change the second paragraph: | 
 |  | 
 |     The factor and offset applied to zd encoded by n and f are set using | 
 |  | 
 |         void DepthRange(clampd n, clampd f); | 
 |         void DepthRangef(clampf n, clampf f); | 
 |  | 
 |     ... | 
 |  | 
 | Additions to Chapter 3 of the OpenGL 4.0 Specification (Rasterization) | 
 |  | 
 |     Section 3.9.3 (Texture Image Specification) | 
 |  | 
 |     Add to the list of required texture and renderbuffer color formats on | 
 |     page 262, on the same line as R11F_G11F_B10F: | 
 |  | 
 |     - RGB565 | 
 |  | 
 |     Add to Table 3.17 (Correspondance of sized ...) on page 265, following | 
 |     the row for format RGB5: | 
 |      | 
 |     Sized Internal Format  Base Internal Format  R bits  G bits  B bits  A bits  Shared bits | 
 |     ---------------------  --------------------  ------  ------  ------  ------  ----------- | 
 |     RGB565                 RGB                    5      6       5 | 
 |  | 
 |  | 
 |     Section 3.12.1, p. 323 (Shader Variables) | 
 |  | 
 |     Add after the definition of MAX_FRAGMENT_UNIFORM_COMPONENTS: | 
 |  | 
 |     The implementation-dependent constant MAX_FRAGMENT_UNIFORM_VECTORS | 
 |     has a value equal to the value of MAX_FRAGMENT_UNIFORM_COMPONENTS | 
 |     divided by four. | 
 |  | 
 |  | 
 | Additions to Chapter 4 of the OpenGL 4.0 Specification (Per-Fragment Operations | 
 | and the Frame Buffer) | 
 |  | 
 |     Section 4.2.1, p. 352 (Selecting a Buffer for Writing) | 
 |  | 
 |     Extend this paragraph: | 
 |  | 
 |     Indicating a buffer or buffers using DrawBuffer or DrawBuffers causes | 
 |     subsequent pixel color value writes to affect the indicated buffers. If | 
 |     the GL is bound to a framebuffer object and a draw buffer selects an | 
 |     attachment that has no image attached, then that fragment color is not | 
 |     written to any buffer. | 
 |  | 
 |  | 
 |     Section 4.2.3, p. 358 (Clearing the Buffers) | 
 |  | 
 |     Change the third paragraph | 
 |  | 
 |     The commands | 
 |  | 
 |         void ClearDepth(clampd d); | 
 |         void ClearDepthf(clampf d); | 
 |  | 
 |     set the depth value used when clearing the depth buffer. | 
 |  | 
 |  | 
 |     Section 4.3.2, p. 363 (Reading Pixels) | 
 |  | 
 |     Add after the description of ReadPixels: | 
 |  | 
 |     If the current read buffer is neither floating point nor integer, | 
 |     calling GetIntegerv with the symbolic constants | 
 |     IMPLEMENTATION_COLOR_READ_FORMAT and IMPLEMENTATION_COLOR_READ_TYPE will | 
 |     return RGBA and UNSIGNED_BYTE respectively; otherwise it will generate | 
 |     an INVALID_OPERATION error. | 
 |  | 
 |     Extend this sentence: | 
 |  | 
 |     ReadPixels generates an INVALID_OPERATION error if it attempts to | 
 |     select a color buffer while READ_BUFFER is NONE or if the GL is | 
 |     using a framebuffer object (i.e. READ_FRAMEBUFFER_BINDING is | 
 |     non-zero) and the read buffer selects an attachment that has no | 
 |     image attached. | 
 |  | 
 |  | 
 |     Section 4.4.4, p. 390 (Framebuffer Completeness) | 
 |  | 
 |     Remove all references to draw/read buffers affecting completeness. In | 
 |     particular, delete: | 
 |  | 
 |       - The value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE must not be NONE | 
 |         for any color attachment point(s) named by DRAW_BUFFERi. | 
 |  | 
 |             { FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER } | 
 |  | 
 |       - If READ_BUFFER is not NONE, then the value of | 
 |         FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE must not be NONE for the | 
 |         color attachment point named by READ_BUFFER. | 
 |  | 
 |             { FRAMEBUFFER_INCOMPLETE_READ_BUFFER } | 
 |  | 
 |       - Changing the read buffer or one of the draw buffers. | 
 |  | 
 |  | 
 | Additions to Chapter 5 of the OpenGL 4.0 Specification (Special Functions) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 6 of the OpenGL 4.0 Specification (State and | 
 | State Requests) | 
 |  | 
 |     Section 6.1.18 (Shader and Program Queries) | 
 |  | 
 |     Add after the description of GetShaderSource: | 
 |  | 
 |     The command | 
 |  | 
 |         void GetShaderPrecisionFormat(enum shadertype, | 
 |                                       enum precisiontype, | 
 |                                       int *range, int *precision); | 
 |  | 
 |     returns the range and precision for different numeric formats | 
 |     supported by the shader compiler. <shadertype> must be VERTEX_SHADER | 
 |     or FRAGMENT_SHADER. <precisiontype> must be one of LOW_FLOAT, | 
 |     MEDIUM_FLOAT, HIGH_FLOAT, LOW_INT, MEDIUM_INT or HIGH_INT. <range> | 
 |     points to an array of two integers in which encodings of the | 
 |     format's numeric range are returned. If min and max are the smallest | 
 |     and largest values representable in the format, then the values | 
 |     returned are defined to be | 
 |  | 
 |         <range>[0] = floor(log2(|min|)) | 
 |         <range>[1] = floor(log2(|max|)) | 
 |  | 
 |     <precision> points to an integer in which the log2 value of the | 
 |     number of bits of precision of the format is returned. If the | 
 |     smallest representable value greater than 1 is 1 + <eps>, then | 
 |     *<precision> will contain floor(-log2(eps)), and every value in the | 
 |     range | 
 |  | 
 |         [-2^<range>[0], 2^<range>[1]] | 
 |  | 
 |     can be represented to at least one part in 2^*<precision>. For | 
 |     example, an IEEE single-precision floating-point format would return | 
 |     <range>[0] = 127, <range>[1] = 127, and *<precision> = 23, while a | 
 |     32-bit two's-complement integer format would return <range>[0] = 31, | 
 |     <range>[1] = 30, and *<precision> = 0. | 
 |  | 
 |     The minimum required precision and range for formats corresponding | 
 |     to the different values of <precisiontype> are described in section | 
 |     4.5 of the OpenGL Shading Language specification. | 
 |  | 
 |  | 
 | Additions to the OpenGL Shading Language Specification, version 4.00.8 | 
 |  | 
 |     Section 3.3, p. 8 (Preprocessor) | 
 |  | 
 |     ...Version 1.10 of the language does not require shaders to include this | 
 |     directive, and shaders that do not include a #version directive will be | 
 |     treated as targeting version 1.10. Shaders that specify #version 100 will | 
 |     be treated as targeting version 1.00 of the OpenGL ES Shading Language, | 
 |     which is a strict subset of version 1.50. | 
 |  | 
 |  | 
 |     Section 7.3, p. 90 (Built-In Constants) | 
 |  | 
 |     Add the following constants: | 
 |  | 
 |     const int gl_MaxVertexUniformVectors = 256; | 
 |     const int gl_MaxFragmentUniformVectors = 256; | 
 |     const int gl_MaxVaryingVectors = 15; | 
 |  | 
 |  | 
 |     Add a new Section X.Y (Counting of Varyings and Uniforms) | 
 |  | 
 |     GLSL ES 1.00 specifies the storage available for varying variables in | 
 |     terms of an array of 4-vectors. Similarly for uniform variables. The | 
 |     assumption is that variables will be packed into these arrays without | 
 |     wasting space. This places significant burden on implementations since | 
 |     optimal packing is computationally intensive. Implementations may have | 
 |     more internal resources than exposed to the application and so avoid the | 
 |     need to perform packing but this is also considered an expensive | 
 |     solution. | 
 |  | 
 |     ES 2.0 therefore relaxes the requirements for packing by specifying a | 
 |     simpler algorithm that may be used. This algorithm specifies a minimum | 
 |     requirement for when a set of variables must be supported by an | 
 |     implementation. The implementation is allowed to support more than the | 
 |     minimum and so may use a more efficient algorithm and/or may support more | 
 |     registers than the virtual target machine. | 
 |  | 
 |     In all cases, failing resource allocation for variables must result in an | 
 |     error. | 
 |  | 
 |     The resource allocation of variables must succeed for all cases where the | 
 |     following packing algorithm succeeds: | 
 |  | 
 |     - The target architecture consists of a grid of registers, | 
 |       gl_MaxVaryingVectors rows by 4 columns for varying variables and | 
 |       gl_Max{Vertex,Fragment}UniformVectors rows by 4 columns for uniform | 
 |       variables. Each register can contain a float value. | 
 |  | 
 |     - Variables are packed into the registers one at a time so that they each | 
 |       occupy a contiguous subrectangle. No splitting of variables is | 
 |       permitted. | 
 |  | 
 |     - The orientation of variables is fixed. Vectors always occupy registers | 
 |       in a single row. Elements of an array must be in different rows. E.g. | 
 |       vec4 will always occupy one row; float[8] will occupy one column. Since | 
 |       it is not permitted to split a variable, large arrays e.g.. for | 
 |       varyings, float[17] will always fail with this algorithm. | 
 |  | 
 |     - Variables consume only the minimum space required with the exception | 
 |       that mat2 occupies 2 complete rows. This is to allow implementations | 
 |       more flexibility in how variables are stored. | 
 |  | 
 |     - Arrays of size N are assumed to take N times the size of the base type. | 
 |  | 
 |     - Variables are packed in the following order: | 
 |  | 
 |       1. Arrays of mat4 and mat4 | 
 |       2. Arrays of mat2 and mat2 (since they occupy full rows) | 
 |       3. Arrays of vec4 and vec4 | 
 |       4. Arrays of mat3 and mat3 | 
 |       5. Arrays of vec3 and vec3 | 
 |       6. Arrays of vec2 and vec2 | 
 |       7. Arrays of float and float | 
 |  | 
 |     - For each of the above types, the arrays are processed in order of size, | 
 |       largest first. Arrays of size 1 and the base type are considered | 
 |       equivalent. In the case of varyings, the first type to be packed | 
 |       (successfully) is mat4[2] followed by mat4, mat2[2], mat2, vec4[8], | 
 |       vec4[7],...vec4[1], vec4, mat3[2], mat3 and so on. The last variables | 
 |       to be packed will be float (and float[1]). | 
 |  | 
 |     - For 2,3 and 4 component variables packing is started using the 1st | 
 |       column of the 1st row. Variables are then allocated to successive rows, | 
 |       aligning them to the 1st column. | 
 |  | 
 |     - For 2 component variables, when there are no spare rows, the strategy | 
 |       is switched to using the highest numbered row and the lowest numbered | 
 |       column where the variable will fit. (In practice, this means they will | 
 |       be aligned to the x or z component.) Packing of any further 3 or 4 | 
 |       component variables will fail at this point. | 
 |  | 
 |     - 1 component variables (i.e. floats and arrays of floats) have their own | 
 |       packing rule. They are packed in order of size, largest first. Each | 
 |       variable is placed in the column that leaves the least amount of space | 
 |       in the column and aligned to the lowest available rows within that | 
 |       column. During this phase of packing, space will be available in up to | 
 |       4 columns. The space within each column is always contiguous. | 
 |  | 
 |     - If at any time the packing of a variable fails, the compiler or linker | 
 |       must report an error. | 
 |  | 
 |     Example: pack the following types, if gl_MaxVaryingVectors were equal to | 
 |     eight: | 
 |  | 
 |         varying vec4 a;         // top left | 
 |         varying mat3 b;         // align to left, lowest numbered rows | 
 |         varying vec2 c[3];      // align to left, lowest numbered rows | 
 |         varying vec2 d[2];      // Cannot align to left so align to z column, | 
 |                                 // highest numbered rows | 
 |         varying vec2 e;         // Align to left, lowest numbered rows. | 
 |         varying float f[3]      // Column with minimum space | 
 |         varying float g[2];     // Column with minimum space (choice of 2, | 
 |                                 // either one can be used) | 
 |         varying float h;        // Column with minimum space | 
 |  | 
 |     In this example, the varyings happen to be listed in the order in which | 
 |     they are packed. Packing is independent of the order of declaration. | 
 |  | 
 |           x y z w | 
 |         0 a a a a | 
 |         1 b b b f | 
 |         2 b b b f | 
 |         3 b b b f | 
 |         4 c c g h | 
 |         5 c c g | 
 |         6 c c d d | 
 |         7 e e d d | 
 |  | 
 |     Some varyings e.g. mat4[8] will be too large to fit. These always fail | 
 |     with this algorithm. | 
 |  | 
 |     If referenced in the fragment shader (after preprocessing), the built-in | 
 |     special variables (gl_FragCoord, gl_FrontFacing and gl_PointCoord) are | 
 |     included when calculating the storage requirements of varyings. | 
 |  | 
 |     Only varyings statically used in both shaders are counted. | 
 |  | 
 |     When calculating the number of uniform variables used, any literal | 
 |     constants present in the shader source after preprocessing are included | 
 |     when calculating the storage requirements. Multiple instances of | 
 |     identical constants should count multiple times. | 
 |  | 
 |     Part of the storage may be reserved by an implementation for its own use | 
 |     e.g. for computation of transcendental functions. This reduces the number | 
 |     of uniforms available to the shader. The size of this reduction is | 
 |     undefined but should be minimized. | 
 |  | 
 |  | 
 | Additions to the AGL/GLX/WGL Specifications | 
 |  | 
 |     None | 
 |  | 
 | Errors | 
 |  | 
 |     ShaderBinary generates an INVALID_ENUM error if <binaryformat> is | 
 |     not a supported format returned in SHADER_BINARY_FORMATS. | 
 |  | 
 |     ShaderBinary generates an INVALID_VALUE error if the data pointed to | 
 |     by binary does not match the specified <binaryformat>. | 
 |  | 
 |     ShaderBinary generates an INVALID_OPERATION error if more than one | 
 |     of the handles refers to the same type of shader (vertex or fragment | 
 |     shader.) | 
 |  | 
 |     GetIntegerv, GetBooleanv, and GetFloatv generate an INVALID_OPERATION | 
 |     error if <pname> is IMPLEMENTATION_COLOR_READ_TYPE or | 
 |     IMPLEMENTATION_COLOR_READ_FORMAT and the current read buffer is floating | 
 |     point or integer format. | 
 |  | 
 |     ReadPixels generates an INVALID_OPERATION error if it attempts to | 
 |     select a color buffer while READ_BUFFER is NONE or if the GL is | 
 |     using a framebuffer object (i.e. READ_FRAMEBUFFER_BINDING is | 
 |     non-zero) and the read buffer selects an attachment that has no | 
 |     image attached. | 
 |  | 
 | New State | 
 |  | 
 |     None | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |                                                        Minimum | 
 |     Get Value                        Type    Get Command  Value  Description                  Sec. | 
 |     -------------------------        ------- ------------ ------- ------------------------   ------ | 
 |     SHADER_BINARY_FORMATS             0* x Z GetIntegerv    -    Enumerated shader binary    2.14.2 | 
 |                                                                  formats | 
 |     NUM_SHADER_BINARY_FORMATS         Z+     GetIntegerv    0    Number of shader binary     2.14.2 | 
 |                                                                  formats | 
 |     SHADER_COMPILER                   B      GetBooleanv    -    Shader compiler supported   2.14 | 
 |  | 
 |     MAX_VERTEX_UNIFORM_VECTORS        Z+     GetIntegerv   256   Number of vectors for       2.14.4 | 
 |                                                                  vertex shader uniform | 
 |                                                                  variables | 
 |     MAX_VARYING_VECTORS               Z+     GetIntegerv   15    Number of vectors for       2.14.6 | 
 |                                                                  varying variables | 
 |     MAX_FRAGMENT_UNIFORM_VECTORS      Z+     GetIntegerv   256   Number of vectors for       3.12.1 | 
 |                                                                  fragment shader uniform | 
 |                                                                  variables | 
 |     IMPLEMENTATION_COLOR_READ_TYPE    Z+     GetIntegerv    -    Implementation preferred    4.3.2 | 
 |                                                                  pixel type | 
 |     IMPLEMENTATION_COLOR_READ_FORMAT  Z+     GetIntegerv    -    Implementation preferred    4.3.2 | 
 |                                                                  pixel format | 
 |  | 
 |  | 
 | Issues | 
 |  | 
 |     (1) Should the uniform/varying limits MAX_*_COMPONENTS vs MAX_*_VECTORS | 
 |     constants be allowed to take independent values, or are they tied | 
 |     together? | 
 |  | 
 |     UNRESOLVED: Currently MAX_*_VECTORS = MAX_*_COMPONENTS / 4. | 
 |  | 
 |     (2) What should IMPLEMENTATION_COLOR_READ_FORMAT and | 
 |     IMPLEMENTATION_COLOR_READ_TYPE do? OpenGL does not have the same | 
 |     limitations of allowed format/type for ReadPixels that ES has. | 
 |  | 
 |     RESOLVED: Always return RGBA/UNSIGNED_BYTE. | 
 |  | 
 |     This query is in the weird situation where the application needs to know | 
 |     how to compute a size based on the format/type combination that is | 
 |     returned as well as how to interpret the data. So if the GL attempts to | 
 |     return "something useful", it may cause an application to have | 
 |     unpredictable behavior if it doesn't understand the values that are | 
 |     returned. Given the wide variety of format/type conversions supported by | 
 |     GL, this feature is not particularly useful - the app can simply use the | 
 |     format it wants. | 
 |  | 
 |     What's really required of this for compatibility is to return a valid | 
 |     format for any legal renderable format in GL ES2.0. RGBA/UNSIGNED_BYTE | 
 |     should be sufficient to accomplish that. Having these queries return | 
 |     an error for float and integer formats discourages their use in the | 
 |     future. | 
 |  | 
 |     (3) The current GLSL ES packing rules hardcode 8 and 128 rather than | 
 |     scaling with the limits exposed by the implementation. Should these | 
 |     scale? | 
 |  | 
 |     RESOLVED: Yes, replace references to 8 and 128 with gl_Max*Vectors. | 
 |  | 
 |     (4) How can we deal with the conflicting behavior of current vertex | 
 |     attribute state being made indeterminate by DrawArrays/DrawElements? | 
 |  | 
 |     UNRESOLVED: GL behavior is currently undefined, so make it defined to | 
 |     match ES behavior. Are there any performance concerns with this? | 
 |  | 
 |     (5) Should the varying/uniform packing rules apply to double-precision | 
 |     types in GL SM5? | 
 |  | 
 |     UNRESOLVED: Yes. Need to insert these into the ordered list of types. | 
 |  | 
 |     (6) What should we do about conflicting #version values? | 
 |  | 
 |     RESOLVED: The original GLSL 1.00 spec did not include #version, it was | 
 |     added in GLSL 1.10 and the first accepted value was "110". GLSL ES has | 
 |     only one version and it is "100", so there is currently no overlap and | 
 |     ambiguity. So GLSL can be extended to accept "100" and always interpret | 
 |     it to mean "GLSL ES 1.00 functionality". | 
 |  | 
 |     Future versions of the shading language specs should be modified to | 
 |     require something in the shader text to indicate which type of GLSL is | 
 |     being used. In GLSL 1.50, the #version command accepts | 
 |  | 
 |         #version <number> <profile_opt> | 
 |  | 
 |     where <profile_opt> can be either "core" or "compatibility". We could | 
 |     require "es" for GLSL ES shaders and make the profile be required in | 
 |     both GLSL and GLSL ES. | 
 |  | 
 |     (7) Are there any existing packing rules that the ES packing rules may | 
 |     conflict with? | 
 |  | 
 |     UNRESOLVED: Named uniform blocks have extensive packing rules, but the ES | 
 |     rules only apply to the default uniform block so those aren't in | 
 |     conflict. The only mention of how things may be packed in the default | 
 |     uniform block is that matrices consume no more than 4*min(r,c) | 
 |     components. For both uniforms and varyings, the spec does not explicitly | 
 |     guarantee that if a program is within the limit then linking will | 
 |     succeed, but that guarantee may be reasonably inferred. | 
 |  | 
 |     The ES rules guarantee that under certain circumstances linking is | 
 |     guaranteed to succeed. Adopting these rules as *the* minimum guarantee | 
 |     will weaken the desktop rules. However, it is likely that some vec4- | 
 |     centric implementations may not be able to satisfy the inferred desktop | 
 |     guarantee. For example, any time a single variable has more array | 
 |     elements than MAX_*_UNIFORM_COMPONENTS/4 and is dynamically indexed. | 
 |  | 
 |     Proposed resolution is to adopt the ES rules as the minimum guarnatee | 
 |     for the default uniform block and for varyings. | 
 |  | 
 |     (8) How should we handle draw buffer completeness? | 
 |  | 
 |     RESOLVED: Remove draw/readbuffer completeness checks, and treat | 
 |     drawbuffers referring to missing attachments as if they were NONE. | 
 |  | 
 |     GL ES does not support MRT and the notions of DrawBuffers and ReadBuffer | 
 |     were removed, including the FRAMEBUFFER_INCOMPLETE_{DRAW,READ}_BUFFER | 
 |     checks. One consequence of this is that a GL ES application can render to | 
 |     a depth-only FBO without calling DrawBuffer, whereas in Desktop GL an | 
 |     application must call DrawBuffer(NONE). To make Desktop GL a superset, we | 
 |     must remove the need to call DrawBuffer(NONE), and the most | 
 |     straightforward way to do that is to remove these completeness checks. | 
 |  | 
 |     (9) What divergent behaviors should this spec leave unaltered? | 
 |  | 
 |     RESOLVED: There are various differing features that cannot be | 
 |     resolved without breaking backward compatibility with desktop | 
 |     applications. | 
 |  | 
 |     * Framebuffer Objects are shared on desktop, but not in ES. | 
 |     * Some textures are incomplete in ES that would be considered | 
 |       complete on desktop. | 
 |     * ES requires different version string formats for API and shading | 
 |       language version queries. | 
 |  | 
 |  | 
 |     (10) Which changes should be made to both the core and compatibility | 
 |     profiles and which should be restricted to the core profile? | 
 |  | 
 |     UNRESOLVED: We should probably decide what needs to go into core and | 
 |     what into compatibility. In the cases that core has removed the | 
 |     features being expanded, this decision is clear. Even where this is | 
 |     not the case, it may make sense to limit certain features to | 
 |     compatibility rather than clutter up core with features only present | 
 |     for ES compatibility. | 
 |  | 
 |     Bruce Merry's suggested division: | 
 |  | 
 |     Core + compatibility: | 
 |     ReleaseShaderCompiler | 
 |     Relaxation of framebuffer completeness rules | 
 |     Preserving current attributes after Draw* | 
 |  | 
 |     Compatibility only: | 
 |     Fixed-point vertex attributes | 
 |     Float versions of DepthRange and ClearDepth | 
 |     Binary shaders | 
 |     #version 100 | 
 |     ES2 packing model | 
 |     implementation read color format | 
 |     vector-based resource-limits | 
 |     GetShaderPrecisionFormat | 
 |  | 
 |     (11) Are immediate mode vertex attrib calls that take fixed point | 
 |     parameters required? | 
 |  | 
 |     RESOLVED: No. The purpose of this extension is limited to | 
 |     facilitating the porting of ES2 applications to the desktop. Adding | 
 |     immediate mode VertexAttrib calls to promote internal consistency | 
 |     with other desktop features is less important. | 
 |  | 
 |     (12) Should RGB565 be added to the extension? | 
 |  | 
 |     RESOLVED: Yes. The initial version of this extension did not include it, | 
 |     as did OpenGL 4.1, which included functionality from this extension. | 
 |     This was an oversight. RGB565 was added to the required format list in | 
 |     the initial release of the OpenGL 4.2 spec, but it was not added to the | 
 |     table of sized internal color formats. However, RGB565 | 
 |     compatibility is important to ES2 compatibility. | 
 |  | 
 |     The ARB discussed this situation in February 2012 and agreed to revise | 
 |     the extension spec and OpenGL 4.2 spec to fully support RGB565. While | 
 |     some drivers may not support RGB565, we believe they will add support | 
 |     quickly. | 
 |  | 
 |     (13) OpenGL ES 2.0 may have some unavoidable differences from an OpenGL | 
 |     context supporting ES2_compatibility, since this extension can't change | 
 |     default GL state values or prevent behavior defined to work by the GL | 
 |     specification. How do we deal with these differences? | 
 |         | 
 |     RESOLVED: If the application needs a strict OpenGL ES 2.0 | 
 |     implementation, it should not attempt to use a desktop GL context | 
 |     with the ES2_compatibility extension supported. Instead, use the | 
 |     {GLX|WGL}_EXT_create_context_es_profile extensions to request an | 
 |     actual OpenGL ES 2.0 context, which will not have these caveats. | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.    Date      Author    Changes | 
 |     ----  ----------  --------- ----------------------------------------- | 
 |     7     03/12/2013  Jon Leech Add issue 13 and copy resolution from | 
 |                                 ES3_compatibility spec. | 
 |     6     04/13/2012  Jon Leech Add RGB565 to required texture & renderbuffer | 
 |                                 formats and to the table of sized internal | 
 |                                 formats (Bug 8530). | 
 |     5     08/04/2010  Jon Leech Add SHADER_BINARY_FORMATS to new tokens | 
 |                                 section. | 
 |     4     05/26/2010  Jon Leech Add missing tokens, make language more | 
 |                                 consistent with GL core spec in some places, | 
 |                                 and reflow paragraphs. | 
 |     3     05/21/2010  groth     limit features to the minimum for portability | 
 |                                 purge VertexAttrib*. limit shaderbinary to V&F | 
 |                                 adjust page/section numbers and text to 4.0 | 
 |     2     05/19/2010  groth     respond to bmerry's feedback | 
 |     1     12/28/2009  jbolz     Internal revisions. |