| 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. |