Name ARB_ES3_compatibility Name Strings GL_ARB_ES3_compatibility Contact Piers Daniell, NVIDIA Corporation (pdaniell 'at' nvidia.com) Contributors Bruce Merry Jeff Bolz, NVIDIA John Kessenich Jon Leech Pat Brown, NVIDIA Notice Copyright (c) 2012-2013 The Khronos Group Inc. Copyright terms at http://www.khronos.org/registry/speccopyright.html Specification Update Policy Khronos-approved extension specifications are updated in response to issues and bugs prioritized by the Khronos OpenGL Working Group. For extensions which have been promoted to a core Specification, fixes will first appear in the latest version of that core Specification, and will eventually be backported to the extension document. This policy is described in more detail at https://www.khronos.org/registry/OpenGL/docs/update_policy.php Status Complete. Approved by the ARB on 2012/06/12. Version Last Modified Date: October 18, 2013 Revision: 10 Number ARB Extension #127 Dependencies OpenGL 3.3, ARB_ES2_compatibility, ARB_invalidate_subdata, and ARB_texture_storage are required. The ETC2 and EAC texture compression formats added to OpenGL-ES 3.0 OES_compressed_ETC2_RGB8_texture, OES_compressed_ETC2_sRGB8_texture, OES_compressed_ETC2_punchthroughA_RGBA8_texture, OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture, OES_compressed_ETC2_RGBA8_texture, OES_compressed_ETC2_sRGB8_alpha8_texture, OES_compressed_EAC_R11_unsigned_texture, OES_compressed_EAC_R11_signed_texture, OES_compressed_EAC_RG11_unsigned_texture and OES_compressed_EAC_RG11_signed_texture are required. This extension is written against The OpenGL 4.2 (Compatibility Profile) specification. Overview This extension adds support for features of OpenGL ES 3.0 that are missing from OpenGL 3.x. Enabling these features will ease the process of porting applications from OpenGL ES 3.0 to OpenGL. These features include conservative boolean occlusion queries, primitive restart with a fixed index, the OpenGL ES Shading Language 3.00 specification, and the dependencies stated above. New Procedures and Functions None New Tokens Accepted by the parameter of CompressedTexImage2D COMPRESSED_RGB8_ETC2 0x9274 COMPRESSED_SRGB8_ETC2 0x9275 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 COMPRESSED_RGBA8_ETC2_EAC 0x9278 COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 COMPRESSED_R11_EAC 0x9270 COMPRESSED_SIGNED_R11_EAC 0x9271 COMPRESSED_RG11_EAC 0x9272 COMPRESSED_SIGNED_RG11_EAC 0x9273 Accepted by the parameter of Enable and Disable: PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 Accepted by the parameter of BeginQuery, EndQuery, GetQueryIndexediv and GetQueryiv: ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A Accepted by the parameter of the GetInteger* functions: MAX_ELEMENT_INDEX 0x8D6B Accepted by the parameters of GetTexParameterfv and GetTexParameteriv: TEXTURE_IMMUTABLE_LEVELS 0x82DF Additions to Chapter 2 of the OpenGL 4.2 (Compatibility Profile) Specification (OpenGL Operation) Modify Section 1.7.1 (OpenGL Shading Language) to require the OpenGL ES Shading Language specifications: "This specification should be read together with a companion documents titled The OpenGL Shading Language and The OpenGL ES Shading Language. ..." And later in this section: "OpenGL 4.2 implementations are guaranteed to support version 4.20 of the OpenGL Shading Language, version 1.00 of the OpenGL ES Shading Language and version 3.00 of the OpenGL ES Shading Language, and the version required by the application is specified in the shader source. ..." Modify Section 2.8 (Vertex Arrays) on page 45 before the start of Section 2.8.1: "Primitive restart can also be enabled or disabled with a of PRIMITIVE_RESTART_FIXED_INDEX. In this case, the primitive restart index is equal to 2^N-1, where N is 8, 16 or 32 if the type is UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT, respectively, and the value specified by PrimitiveRestartIndex is ignored. If both PRIMITIVE_RESTART and PRIMITIVE_RESTART_FIXED_INDEX are enabled, the value determined by PRIMITIVE_RESTART_FIXED_INDEX is used. If PRIMITIVE_RESTART_FIXED_INDEX is enabled, primitive restart is not performed for array elements transferred by any drawing command not taking a parameter, including ArrayElement or any of the Draw* commands other than *DrawElements*." Modify Section 2.18 (Asynchronous Queries) on page 195 to add ANY_SAMPLES_PASSED_CONSERVATIVE as another option: "BeginQuery sets the active query object name for the query type given by to . If BeginQuery is called with an id of zero, if the active query object name for target is non-zero (for the targets SAMPLES_PASSED, ANY_SAMPLES_PASSED, and ANY_SAMPLES_PASSED_CONSERVATIVE if the active query for either target is non-zero), if is the name of an existing query object whose type does not match target, if is the active query object name for any query type, or if id is the active query object for condtional rendering (see section 2.19), the error INVALID_OPERATION is generated." Modify Section 2.19 (Conditional Rendering) on page 197 to add ANY_SAMPLES_PASSED_CONSERVATIVE as another option: "If the result (SAMPLES_PASSED) of the query is zero, or if the result (ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE) is false, all rendering comands between BeginConditionalRender and the corresponding EndConditionalRender are discarded. ..." And later in this paragraph: "... If the result (SAMPLES_PASSED) of the query is non-zero, or if the result (ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE) is true, such commands are not discarded." Again at the end of Section 2.19 (Conditional Rendering) on page 198: "If is the name of a query object with a target other than SAMPLES_PASSED, ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE, or if is the name of a query currently in progress, the error INVALID_OPERATION is generated." Modify subsection 3.10.15 (Texture State and Proxy State): Modify the end of the first paragraph on page 345 "... The value of TEXTURE_IMMUTABLE_FORMAT is FALSE. The value of TEXTURE_IMMUTABLE_LEVELS is 0. The values of DEPTH_TEXTURE_MODE, TEXTURE_COMPARE_MODE, and TEXTURE_COMPARE_FUNC are LUMINANCE, NONE, and LEQUAL respectively. ..." Modify subsection 3.10.16 (Immutable-Format Texture Images): Modify the second to last bullet on page 347 "If the command is successful, TEXTURE_IMMUTABLE_FORMAT becomes TRUE and TEXTURE_IMMUTABLE_LEVELS becomes ." Modify Section 4.1.7 (Occlusion Queries) to add ANY_SAMPLES_PASSED_CONSERVATIVE as another option: "Occlusion queries use query objects to track the number of fragments or samples that pass the depth test. An occlusion query can be started and finished by calling BeginQuery and EndQuery, respectively, with a target of SAMPLES_PASSED, ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE." Modify last paragraph in Section 4.1.7: "When an occlusion query is started with the target ANY_SAMPLES_PASSED, the samples-boolean state maintained by the GL is set to FALSE. While that occlusion query is active, the samples-boolean state is set to TRUE if any fragment or sample passes the depth test. If the target of the query is ANY_SAMPLES_PASSED_CONSERVATIVE, an implementation may choose to use a less precise version of the test which can additionally set the samples-boolean state to TRUE in some other implementation-dependent cases. This may offer better performance on some implementations at the expense of false positives. When the occlusion query finishes, the samples-boolean state of FALSE or TRUE is written to the corresponding query object as the query result value, and the query result for that object is marked as available." Modify the list of allowed parameters to GetTexParameter* in section 6.1.3 on page 478: " must be IMAGE_FORMAT_COMPATIBILITY_TYPE, TEXTURE_IMMUTABLE_FORMAT, TEXTURE_IMMUTABLE_LEVELS, TEXTURE_RESIDENT, or one of the symbolic values in table 3.22" Modify the first paragraph of Section 6.1.13 (Asynchronous Queries) as follows: "... identifies the query target, and must be one of SAMPLES_PASSED, ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE for occlusion queries, ..." Modify the first paragraph of page 488 in Section 6.1.13: "For occlusion queries with target ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE, if the number of bits is non-zero, the minimum number of bits is 1. ..." Additions to Chapter 3 of the OpenGL 4.2 (Compatibility Profile) Specification (Rasterization) Add to Table 3.20: Generic and specific compressed internal formats on page 303: Compressed Internal Format Base Internal Format Type ------------------------------------------ -------------------- ---------- COMPRESSED_RGB8_ETC2 RGB Specific COMPRESSED_SRGB8_ETC2 RGBA Specific COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 RGB Specific COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 RGB Specific COMPRESSED_RGBA8_ETC2_EAC RGBA Specific COMPRESSED_SRGB8_ALPHA8_ETC2_EAC RGBA Specific COMPRESSED_R11_EAC RED Specific COMPRESSED_SIGNED_R11_EAC RED Specific COMPRESSED_RG11_EAC RG Specific COMPRESSED_SIGNED_RG11_EAC RG Specific Add the following text to the Table 3.20 key: "The specific RGTC, BPTC, ETC2 and EAC formats are described in Appendix C." Additions to Chapter 4 of the OpenGL 4.2 (Compatibility Profile) Specification (Per-Fragment Operations and the Framebuffer) Add to section 4.4.2 in the unnumbered "Required Renderbuffer Formats" subsection, following the paragraph starting "Implementations are required to support..." "Implementations are also required to support STENCIL_INDEX8." Modify section 4.4.2 in the unnumbered "Required Framebuffer Formats" subsection, changing the third sentence to read "The depth attachment may be in any of the required depth or combined depth+stencil formats described in those sections, and the stencil attachment may be in any of the required stencil or combined depth+stencil formats." Additions to Appendix C of the OpenGL 4.20.6 Specification (Compressed Texture Image Formats) Add a new section to Appendix C: "C.3 ETC2/EAC Compressed Texture Image Formats The following sub-sections describe the texture compression format for the ETC2/EAC family of compression formats. It is not necessary for the GL to implement these compression formats in hardware and is acceptable for the decode to occur in software and be represented internally as uncompressed images." Then copy in the body of the OpenGL ES 3.0 Specification, Appendix C.1 "ETC Compressed Texture Image Formats", which describes the details of the ETC2 and EAC formats required by this extension. Change "OpenGL ES implementations" to "OpenGL implementations" when performing this copying. Additions to Chapter 3 of the OpenGL Shading Language 4.20.6 Specification (Basics) Modify the paragraph at the bottom of page 12 in Section 3.3 (Preprocessor) as follows: "... Shaders that specify #version 100 will be treated as targeting version 1.00 of the OpenGL ES Shading Language. Shaders that specify #version 300 will be treated as targeting version 3.00 of the OpenGL ES Shading Language. Shaders declaring 1.40, 1.50, ..." Modify the second paragraph at the of page 13 in Section 3.3 (Preprocessor) as follows: "If the optional argument is provided, it must be the name of an OpenGL profile. Currently there are three choices: core compatibility es A argument can only be used with version 150 or greater. If no profile argument is provided and the version is 150 or greater, the default is . If #version 300 is specified, the profile argument is not optional and must be , or a compile-time error results. The Language Specification for the profile is specified in The OpenGL ES Shading Language specification. Unless otherwise specified, this ..." Additions to the AGL/GLX/WGL Specifications None Interactions with the OpenGL 4.2 Core Profile In the core profile, remove ArrayElement from the list of drawing commands for which primitive restart is not performed when PRIMITIVE_RESTART_FIXED_INDEX is enabled. Errors None New State (add to table 6.13, p. 520 (Vertex Array Data (not in Vertex Array Objects))) Initial Get Value Type Get Command Value Description Sec. Attribute ------------------------ ---- --------------- ------- ---------------------- ----- ------------ PRIMITIVE_RESTART_FIXED_INDEX B IsEnabled FALSE Primitive restart with 2.8 vertex-array fixed index enable (add to table 6.24, p. 531 (Textures (state per texture object))) Initial Get Value Type Get Command Value Description Sec. Attribute ------------------------ ---- --------------- ------- ------------------------ ------- --------- TEXTURE_IMMUTABLE_LEVELS Z+ GetTexParameter 0 storage number of levels 3.10.15 texture New Implementation Dependent State Get Value Type Get Command Value Description Sec. ----------------- ---- ------------- -------- --------------------- ---- MAX_ELEMENT_INDEX Z+ GetInteger64v 2^32 - 1 Maximum element index 2.6 Issues 1) OpenGL-ES 3.0 contains several features that have been deprecated from the latest OpenGL Core specification. These were retained in OpenGL-ES 3.0 in order to provide backwards compatibility with OpenGL-ES 2.0. Those features are: * Wide lines - LineWidth values greater than 1.0 will generate an INVALID_- VALUE error. The value ALIASED_LINE_WIDTH_RANGE is the max width supported. * Global component limit query - the implementation-dependent values MAX_VARYING_COMPONENTS and MAX_VARYING_FLOATS. * Application-generated object names - the names of all object types, such as buffer, query, and texture objects, must be generated using the corresponding Gen* commands. Trying to bind an object name not returned by a Gen* command will result in an INVALID_OPERATION error. This behavior is already the case for framebuffer, renderbuffer, and vertex array objects. Object types which have default objects (objects named zero), such as vertex array, framebuffer, and texture objects, may also bind the default object, even though it is not returned by Gen*. * Client vertex and index arrays - all vertex array attribute and element array index pointers must refer to buffer objects. The default vertex array object (the name zero) is also deprecated. Calling VertexAttribPointer when no buffer object or no vertex array object is bound will generate an INVALID_- OPERATION error, as will calling any array drawing command when no vertex array object is bound. * Legacy pixel formats - all ALPHA, LUMINANCE, LUMINANCE_ALPHA * Hints - GENERATE_MIPMAP_HINT targets to Hint (section 5.4). * Unified extension string - EXTENSIONS target to GetString. Should we bring these features back into the OpenGL 4.x Core specification so that it is a complete super-set of OpenGL-ES 3.0? RESOLVED: No, these will not be brought back into OpenGL 4.x Core. Apps written for OpenGL-ES 3.0 that want to also be compatible with OpenGL should make sure they don't use these features. 2) OpenGL ES 3.0 has some differences to OpenGL that may affect how the application operates. For example, in OpenGL ES 3.0 cubemaps are always seamless but with OpenGL this needs to be explicitly enabled. Also sRGB is handled differently. In OpenGL ES 3.0 a surface is either sRGB or not sRGB and this cannot be changed. With OpenGL a surface can be sRGB capable and the mode can be toggled. How do we deal with these differences? RESOLVED: If the application needs a strict OpenGL ES 3.0 implementation, it should not attempt to use a desktop GL context with the ES3_compatibility extension supported. Instead, use the {GLX|WGL}_EXT_create_context_es_profile extensions to request an actual OpenGL ES 3.0 context, which will not have these caveats. Revision History Rev. Date Author Changes ---- -------- -------- ----------------------------------------------- 10 10/18/13 Jon Leech Refer to OpenGL ES 3.0 specification appendix C.1 for ETC2/EAC formats, instead of to OES extensions (Bug 7522). 9 03/12/13 Jon Leech Update issue 2 resolution and fix typo. 8 11/10/12 pdaniell Add the missing token TEXTURE_IMMUTABLE_LEVELS from ARB_texture_view, which is in ES 3.0, and add language describing its behavior; add PRIMITIVE_RESTART_FIXED_INDEX to state tables (Bug 9559). 7 09/16/12 Jon Leech Add language to chapter 4 requiring STENCIL_INDEX8 support (Bug 9418). 6 05/30/12 Jon Leech Add language specifying how the two types of primitive restart enable interact and that the fixed index form only applies to *DrawElements* commands taking a parameter. Reorder ETC2/EAC formats to match Halti appendix. 5 04/27/12 pdaniell Updates based on feedback from John Kessenich. 4 04/20/12 pdaniell Resolve issue 2. 3 03/19/12 pdaniell Remove references to RGB565, which are now fixed in ARB_ES2_compatibility and an updated OpenGL 4.2 core spec. Make the ETC2/EAC compression formats compulsory and bring in the tokens. 2 01/31/12 pdaniell Incorporated feedback from Bruce. 1 01/23/12 pdaniell Initial version.