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
Status
Complete.
Approved by the ARB on 2012/06/12.
Version
Last Modified Date: March 12, 2013
Revision: 9
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.
C.3.1 Format COMPRESSED_RGB8_ETC2
See OES_texture_compression_rgb8_etc2
C.3.2 Format COMPRESSED_SRGB8_ETC2
See OES_texture_compression_srgb8_etc2
C.3.3 Format COMPRESSED_RGBA8_ETC2_EAC
See OES_texture_compression_rgba8_etc2_eac
C.3.4 Format COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
See OES_texture_compression_srgb8_alpha8_etc2_eac
C.3.5 Format COMPRESSED_R11_EAC
See OES_texture_compression_r11_eac
C.3.6 Format COMPRESSED_RG11_EAC
See OES_texture_compression_rg11_eac
C.3.7 Format COMPRESSED_SIGNED_R11_EAC
See OES_texture_compression_signed_r11_eac
C.3.8 Format COMPRESSED_SIGNED_RG11_EAC
See OES_texture_compression_signed_rg11_eac
C.3.9 Format COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
See OES_texture_compression_rgb8_punchthrough_alpha1_etc2
C.3.10 Format COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
See OES_texture_compression_srgb8_punchthrough_alpha1_etc2
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
---- -------- -------- -----------------------------------------------
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.