| Name | 
 |  | 
 |     OES_required_internalformat | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_OES_required_internalformat | 
 |  | 
 | Contributors | 
 |  | 
 |     Aaftab Munshi | 
 |     Jeremy Sandmel | 
 |     Members of the Khronos OpenGL ES working group | 
 |  | 
 | Contact | 
 |  | 
 |     Benj Lipchak, Apple, Inc. (lipchak 'at' apple.com) | 
 |      | 
 | Notice | 
 |  | 
 |     Copyright (c) 2007-2013 The Khronos Group Inc. Copyright terms at | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Status | 
 |  | 
 |     Complete. | 
 |     Approved by the Khronos Promoters on April 26, 2012. | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date: January 29, 2010 | 
 |     Author Revision: 0.19 | 
 |  | 
 | Number | 
 |  | 
 |     XXX TBD | 
 |  | 
 | Dependencies | 
 |  | 
 |     OpenGL ES 1.0 is required. | 
 |  | 
 |     This extension is written against the OpenGL ES 1.1 specification. | 
 |  | 
 |     OpenGL ES 2.0 affects the definition of this extension. | 
 |      | 
 |     OES_framebuffer_object affects the definition of this extension. | 
 |  | 
 |     OES_depth_texture affects the definition of this extension. | 
 |      | 
 |     OES_depth24 and OES_depth32 affect the definition of this extension. | 
 |      | 
 |     OES_packed_depth_stencil affects the definition of this extension. | 
 |  | 
 |     OES_rgb8_rgba8 affects the definition of this extension. | 
 |  | 
 |     OES_stencil1, OES_stencil4, and OES_stencil8 affect the definition of this | 
 |     extension. | 
 |      | 
 |     OES_texture_3D affects the definition of this extension. | 
 |      | 
 |     EXT_texture_type_2_10_10_10_REV affects the definition of this extension. | 
 |  | 
 | Overview | 
 |  | 
 |     The ES 1.1 API allows an implementation to store texture data internally | 
 |     with arbitrary precision, regardless of the format and type of the data | 
 |     supplied by the application.  Similarly, ES allows an implementation to | 
 |     choose an arbitrary precision for the internal storage of image data | 
 |     allocated by glRenderbufferStorageOES. | 
 |  | 
 |     While this allows flexibility for implementations, it does mean that an  | 
 |     application does not have a reliable means to request the implementation  | 
 |     maintain a specific precision or to find out what precision the  | 
 |     implementation will maintain for a given texture or renderbuffer image. | 
 |  | 
 |     For reference, "Desktop" OpenGL uses the <internalformat> argument to  | 
 |     glTexImage*, glCopyTexImage* and glRenderbufferStorageEXT as a hint,  | 
 |     defining the particular base format and precision that the application wants  | 
 |     the implementation to maintain when storing the image data.  Further, the  | 
 |     application can choose an <internalformat> with a different base internal  | 
 |     format than the source format specified by <format>.  The implementation is | 
 |     not required to exactly match the precision specified by <internalformat> | 
 |     when choosing an internal storage precision, but it is required to match the  | 
 |     base internal format of <internalformat>. | 
 |  | 
 |     In addition, ES 1.1 does not allow an implementation to fail a request to | 
 |     glTexImage2D for any of the legal <format> and <type> combinations listed in | 
 |     Table 3.4, even if the implementation does not natively support data stored | 
 |     in that external <format> and <type>.  However, there are no additional | 
 |     requirements placed on the implementation.  The ES implementation is free to | 
 |     store the texture data with lower precision than originally specified, for | 
 |     instance.  Further, since ES removes the ability to query the texture object | 
 |     to find out what internal format it chose, there is no way for the | 
 |     application to find out that this has happened. | 
 |  | 
 |     This extension addresses the situation in two ways: | 
 |      | 
 |         1) This extension introduces the ability for an application to specify | 
 |         the desired "sized" internal formats for texture image allocation. | 
 |      | 
 |         2) This extension guarantees to maintain at least the specified | 
 |         precision of all available sized internal formats. | 
 |          | 
 |     An implementation that exports this extension is committing to support all | 
 |     of the legal values for <internalformat> in Tables 3.4, 3.4.x, and 3.4.y, | 
 |     subject to the extension dependencies described herein.  That is to say, the  | 
 |     implementation is guaranteeing that choosing an <internalformat> argument | 
 |     with a value from these tables will not cause an image allocation request to | 
 |     fail.  Furthermore, it is guaranteeing that for any sized internal format, | 
 |     the renderbuffer or texture data will be stored with at least the precision | 
 |     prescribed by the sized internal format. | 
 |      | 
 | Issues | 
 |  | 
 |     1.  What API should we use to allow an application to indicate it wants  | 
 |         storage of at least a certain precision for a particular source format/ | 
 |         type combination? | 
 |          | 
 |         RESOLVED | 
 |          | 
 |         We use the "sized" <internalformat> enums to indicate that an | 
 |         application desires some minimum precision for internal storage and  | 
 |         that the GL should not use less than the specified precision. | 
 |  | 
 |         We originally had considered using a new "UNPACK" parameter for | 
 |         glPixelStorei that indicated the external <format> and <type> arguments  | 
 |         must be supported with no "downsampling" of the precision. | 
 |  | 
 |         However, this latter approach ran into the problem that glCopyTexImage2D  | 
 |         and glRenderbufferStorageOES don't use the pixel store "UNPACK" state  | 
 |         nor do they have external <format> or <type> arguments to indicate the  | 
 |         application's requested precision. | 
 |  | 
 |         Another option was to create a new set of glTexImage*, glCopyTexImage*, | 
 |         and glRenderbufferStorageOES entry points that implied a minimum | 
 |         required precision. | 
 |  | 
 |         However, it seems the simplest thing to do is to just use the | 
 |         <internalformat> argument for this purpose and keep the existing entry  | 
 |         points.  It's also the most compatible with desktop OpenGL code. | 
 |  | 
 |     2.  Should this specification make any mention of "optionally supported" | 
 |         <internalformat> values at all?  Or should we just move all of those to  | 
 |         separate defined extensions? | 
 |          | 
 |         RESOLVED, all the values for <internalformat> in Tables 3.4, 3.4.x, and | 
 |         3.4.y in this extension must be accepted by their respective commands. | 
 |         All sized formats in these tables must be stored with at least the | 
 |         corresponding minimum precision. | 
 |  | 
 |         Other extensions may introduce new values for <internalformat>.  If they | 
 |         do, they should modify Tables 3.4, 3.4.x, and 3.4.y.  If an  | 
 |         implementation can support the new <internalformat> values, it will | 
 |         export the extension. | 
 |          | 
 |         The primary motivation for moving "optionally supported" formats to | 
 |         their own extensions is so that a well-behaved application never gets  | 
 |         the idea that it is supposed to check for errors in order to query for  | 
 |         available functionality.  Well-behaved applications should always query | 
 |         for extension strings and other implementation-dependent state to check | 
 |         for available functionality on a particular implementation. | 
 |  | 
 |     3.  What should be the recommended way to add new formats in the future? | 
 |      | 
 |         RESOLVED | 
 |          | 
 |         Just like before, new extensions can add new values for <internalformat>  | 
 |         for *TexImage* and RenderbufferStorageOES.  Unless otherwise stated by | 
 |         future extensions, new sized internal formats will provide the same kind | 
 |         of minimum precision guarantees as the formats described herein. | 
 |  | 
 |     4.  How should we handle render vs. texture buffers? | 
 |      | 
 |         RESOLVED | 
 |          | 
 |         We have three tables in the spec, one for textures specified with  | 
 |         TexImage*, one for textures specified with CopyTexImage2D, and one for  | 
 |         renderbuffers allocated with RenderbufferStorageOES. | 
 |          | 
 |     5.  Should this extension require RGBA8?  For both texture and render? | 
 |      | 
 |         RESOLVED | 
 |          | 
 |         Yes, for both.  OpenGL ES 2.0 implementations are very likely to have  | 
 |         this support anyway, and OpenGL ES 1.x implementations can choose to  | 
 |         export this extension or not, depending on whether they support 8 bit/ | 
 |         component for textures and renderbuffers. | 
 |          | 
 |         Note, this extension does not require RGB8 for renderbuffers.   | 
 |         Availability of RGB8 renderbuffers is still based on presence of the | 
 |         OES_rgb8_rgba8 extension. | 
 |          | 
 |     6.  What should this extension say, if anything, about depth and stencil | 
 |         internal formats for RenderbufferStorageOES? | 
 |          | 
 |         RESOLVED | 
 |          | 
 |         Stencil and depth formats are listed in the Table 3.4.x.  If an | 
 |         implementation that supports this extension doesn't support one or more | 
 |         of the stencil/depth format extensions then this extension behaves as if  | 
 |         those enums are NOT listed in Table 3.4.x. | 
 |          | 
 |     7.  Should we allow every combination of <format>, <type>, and | 
 |         <internalformat>? | 
 |      | 
 |         RESOLVED | 
 |          | 
 |         No, we specifically disallow conversions between "base" formats (between  | 
 |         RGBA and LUMINANCE_ALPHA, for instance).  Further, we also disallow  | 
 |         requested "expansions" to larger data types.  That is, Table 3.4.x  | 
 |         allows the user to request that the GL use a lower precision than the  | 
 |         external <type> would require, but that table does not include any  | 
 |         entries that would require the GL to use more precision than the  | 
 |         external <type> would require. | 
 |  | 
 |         We intentionally don't include this feature here because the | 
 |         <internalformat> represents a required minimum precision for the GL.  We | 
 |         don't want to allow an application to require more precision internally | 
 |         than they provide externally because it would necessitate a format | 
 |         conversion.  If some implementation really wants to add this  | 
 |         functionality, it would need to create an additional extension, say  | 
 |         FOO_expanded_internalformat. | 
 |  | 
 |         Note that in the opposite situation where an application provides higher | 
 |         precision source data and asks it to be stored at lower precision, an | 
 |         implementation is still free to store at the higher precision, thereby | 
 |         avoiding format conversion. | 
 |  | 
 |     8.  Should we split this extension into multiple extensions? | 
 |      | 
 |         RESOLVED | 
 |  | 
 |         No.  No vendor has expressed interest in subsetting these 3 features: | 
 |          | 
 |             Feature 1:  This extension allows an application to specify sized  | 
 |             <internalformats> enums for texture and render buffer image  | 
 |             allocation. | 
 |  | 
 |             Feature 2:  This extension allows the implementation to export a  | 
 |             list of sized <internalformats> for which it will guarantee to  | 
 |             maintain the specified minimum precision when those formats are used  | 
 |             for texture or renderbuffer image allocation. | 
 |  | 
 |             Feature 3:  This extension defines a minimum set of sized | 
 |             <internalformat> enums that are required to be exported by the query  | 
 |             mechanism in #2 above. | 
 |  | 
 |     9.  Should we add a query that lets the implementation advertise which  | 
 |         sized internal formats it supports with minimum precision? | 
 |  | 
 |         RESOLVED  | 
 |  | 
 |         No, we'll leave it to a future extension to add this mechanism if | 
 |         necessary.  Today all sized internal formats have guaranteed minimum | 
 |         precision.  For posterity, we were close to choosing query mechanism 'c' | 
 |         from the list below before we dropped the query entirely: | 
 |           | 
 |             a) a query for a single format's support like this: | 
 |           | 
 |             boolean QuerySupportOES(enum param, int count, const enum* list);  | 
 |  | 
 |             which takes a <list> of <count> sized internal format enums and  | 
 |             returns GL_FALSE if any of them, when used as a sized internal  | 
 |             format with the currently bound context, would result in an internal  | 
 |             format of lower precision than requested.  The <param> could be | 
 |             GL_SUPPORTED_TEXTURE_INTERNALFORMAT for querying supported texture  | 
 |             precisions and GL_SUPPORTED_RENDERBUFFER_INTERNALFORMAT for querying | 
 |             supported renderbuffer precisions. | 
 |          | 
 |             b) a query for all supported formats that the implementation can  | 
 |                guarantee minimum precision, like this: | 
 |          | 
 |             void GetSupportedInternalFormatsOES(enum param,  | 
 |                                                 int* count,  | 
 |                                                 enum* list); | 
 |          | 
 |             where <param> must be TEXTURE_INTERNALFORMAT or | 
 |             RENDERBUFFER_INTERNALFORMAT.  On input <count> is the maximum | 
 |             number of internal formats to return, and on output <count> | 
 |             is the number of internal formats in <list>.  On output, <list>  | 
 |             contains all the values of <internalformat> for which the  | 
 |             implementation will guarantee specified precision.  <list> will  | 
 |             contain <count> entries. | 
 |              | 
 |             c) a query of a single internalformat providing a yes/no answer: | 
 |  | 
 |             boolean IsPreciseInternalformatOES(enum param, enum internalformat); | 
 |  | 
 |             where <param> must be TEXTURE or RENDERBUFFER_OES, and | 
 |             <internalformat> is the internal format for which the app is | 
 |             checking the minimum precision storage guarantee. | 
 |  | 
 |     10. What is the OES_framebuffer_object interaction?  Are FBOs a  | 
 |         prerequisite (even on ES 1.1), or should we strike mention of | 
 |         renderbuffers if FBOs aren't available? | 
 |  | 
 |         RESOLVED | 
 |  | 
 |         Sized format hints and minimum precision guarantees for textures are | 
 |         useful even on implementations where FBOs aren't supported.  We won't | 
 |         make FBOs a prerequisite.  | 
 |  | 
 |     11. Should we add retroactive support for EXT_texture_type_2_10_10_10_REV? | 
 |  | 
 |         RESOLVED | 
 |  | 
 |         Yes.  We introduced two new sized internal formats, RGB10_A2_EXT and | 
 |         RGB10_EXT.  This format continues to be unrenderable, consistent with | 
 |         the EXT_texture_type_2_10_10_10_REV spec.  These formats join the rest | 
 |         of existing sized internal formats on the required list of formats for | 
 |         which precision is guaranteed. | 
 |  | 
 |     12. Do we need different token values from OpenGL? | 
 |  | 
 |         RESOLVED | 
 |  | 
 |         No. Initially some new tokens (such as ALPHA8_OES) were given new | 
 |         values, which was due to a difference in the meaning relative to | 
 |         OpenGL: in OpenGL 2.1, sized internal formats were purely hints, | 
 |         whereas in this extension they are lower bounds. However, OpenGL | 
 |         now specifies a number of formats as being "required" in the | 
 |         same sense of a lower bound on precision, and the token values | 
 |         are not changed. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     None. | 
 |  | 
 | New Types | 
 |  | 
 |     None. | 
 |  | 
 | New Tokens | 
 |      | 
 |      Accepted by the <internalformat> argument of TexImage2D, TexImage3DOES, and  | 
 |      CopyTexImage2D: | 
 |           | 
 |          ALPHA8_OES                       0x803C | 
 |          LUMINANCE8_OES                   0x8040 | 
 |          LUMINANCE8_ALPHA8_OES            0x8045 | 
 |          LUMINANCE4_ALPHA4_OES            0x8043 | 
 |          RGB565_OES                       0x8D62 | 
 |          RGB8_OES                         0x8051 | 
 |          RGBA4_OES                        0x8056 | 
 |          RGB5_A1_OES                      0x8057 | 
 |          RGBA8_OES                        0x8058 | 
 |          DEPTH_COMPONENT16_OES            0x81A5 | 
 |          DEPTH_COMPONENT24_OES            0x81A6 | 
 |          DEPTH_COMPONENT32_OES            0x81A7 | 
 |          DEPTH24_STENCIL8_OES             0x88F0 | 
 |          RGB10_EXT                        0x8052 | 
 |          RGB10_A2_EXT                     0x8059 | 
 |           | 
 |      Accepted by the <internalformat> argument of RenderbufferStorageOES: | 
 |           | 
 |          RGBA8_OES                        0x8058 | 
 |           | 
 | Additions to Chapter 2 of the OpenGL ES 1.1 Specification (OpenGL ES Operation) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 3 of the OpenGL ES 1.1 Specification (Rasterization) | 
 |  | 
 |     In section 3.6.2 ("Unpacking"), p.69 (p. 60/61 of ES 2.0 spec), modify | 
 |     Table 3.4 and replace the preceding paragraph as follows: | 
 |  | 
 |  | 
 |             Format            Type                            External Bytes per Pixel Internal format | 
 |             ------            ----                            ------------------------ --------------- | 
 |             RGBA              UNSIGNED_INT_2_10_10_10_REV_EXT 4                        RGBA, RGB10_A2_EXT, RGB5_A1 | 
 |             RGBA              UNSIGNED_BYTE                   4                        RGBA, RGBA8, RGB5_A1, RGBA4   | 
 |             RGB               UNSIGNED_INT_2_10_10_10_REV_EXT 4                        RGB,  RGB10_EXT, RGB8, RGB565  | 
 |             RGB               UNSIGNED_BYTE                   3                        RGB,  RGB8, RGB565          | 
 |             RGBA              UNSIGNED_SHORT_4_4_4_4          2                        RGBA, RGBA4 | 
 |             RGBA              UNSIGNED_SHORT_5_5_5_1          2                        RGBA, RGB5_A1 | 
 |             RGB               UNSIGNED_SHORT_5_6_5            2                        RGB,  RGB565 | 
 |             LUMINANCE_ALPHA   UNSIGNED_BYTE                   2                        LUMINANCE_ALPHA, LUMINANCE8_ALPHA8, LUMINANCE4_ALPHA4 | 
 |             LUMINANCE         UNSIGNED_BYTE                   1                        LUMINANCE,  LUMINANCE8 | 
 |             ALPHA             UNSIGNED_BYTE                   1                        ALPHA, ALPHA8 | 
 |             DEPTH_COMPONENT   UNSIGNED_SHORT                  2                        DEPTH_COMPONENT, DEPTH_COMPONENT16_OES  | 
 |             DEPTH_COMPONENT   UNSIGNED_INT                    4                        DEPTH_COMPONENT, DEPTH_COMPONENT32_OES, DEPTH_COMPONENT24_OES, DEPTH_COMPONENT16_OES | 
 |             DEPTH_STENCIL_OES UNSIGNED_INT_24_8_OES           4                        DEPTH_STENCIL_OES, DEPTH24_STENCIL8_OES | 
 |  | 
 |             Table 3.4: Valid combinations of <format>, <type>, and | 
 |             <internalformat> for TexImage2D and TexImage3DOES | 
 |  | 
 |         When calling TexImage2D or TexImage3DOES, not all combinations of  | 
 |         <format>, <type>, and <internalformat> are valid.  The valid  | 
 |         combinations accepted by the GL are defined in Table 3.4.  If TexImage2D  | 
 |         or TexImage3DOES is called with a combination of <format>, <type>, and  | 
 |         <internalformat> not listed in Table 3.4, then INVALID_OPERATION is  | 
 |         generated. | 
 |          | 
 |         In addition, only certain values for <internalformat> are valid when  | 
 |         calling RenderbufferStorageOES and CopyTexImage2D.  The valid values of  | 
 |         <internalformat> are listed in Tables 3.4.x and 3.4.y.  If | 
 |         RenderbufferStorageOES is called with a value of <internalformat> not | 
 |         listed in Table 3.4.x then INVALID_ENUM is generated.  Similarly, if | 
 |         CopyTexImage2D is called with a value of <internalformat> not listed in | 
 |         Table 3.4.y, then INVALID_ENUM is generated. | 
 |  | 
 |             Internal format | 
 |             --------------- | 
 |             RGBA4_OES | 
 |             RGB5_A1_OES | 
 |             RGBA8_OES | 
 |             RGB565_OES | 
 |             RGB8_OES | 
 |             STENCIL_INDEX1_OES | 
 |             STENCIL_INDEX4_OES | 
 |             STENCIL_INDEX8_OES | 
 |             DEPTH_COMPONENT16_OES | 
 |             DEPTH_COMPONENT24_OES | 
 |             DEPTH_COMPONENT32_OES | 
 |             DEPTH24_STENCIL8_OES | 
 |  | 
 |             Table 3.4.x:  Legal values of <internalformat> for | 
 |             RenderbufferStorageOES | 
 |  | 
 |             Internal format | 
 |             ---------------     | 
 |             RGBA | 
 |             RGBA4_OES | 
 |             RGB5_A1_OES | 
 |             RGBA8_OES | 
 |             RGB10_A2_EXT | 
 |             RGB | 
 |             RGB565_OES | 
 |             RGB8_OES | 
 |             RGB10_EXT | 
 |             LUMINANCE_ALPHA | 
 |             LUMINANCE4_ALPHA4_OES | 
 |             LUMINANCE8_ALPHA8_OES | 
 |             LUMINANCE | 
 |             LUMINANCE8_OES | 
 |             ALPHA | 
 |             ALPHA8_OES | 
 |  | 
 |             Table 3.4.y:  Legal values of <internalformat> for CopyTexImage2D | 
 |  | 
 |         An implementation must accept all of the values for <internalformat>  | 
 |         specified in Tables 3.4, 3.4.x, 3.4.y.  Furthermore, an implementation | 
 |         must respect the minimum precision requirements of sized internal | 
 |         formats -- those with explicit component resolutions -- by storing each | 
 |         component with at least the number of bits prescribed. | 
 |  | 
 |         If one of the base "unsized" formats (RGBA, RGB, LUMINANCE_ALPHA,  | 
 |         LUMINANCE, ALPHA, DEPTH_COMPONENT, or DEPTH_STENCIL_OES) is specified | 
 |         for <internalformat> to TexImage2D, TexImage3DOES, or CopyTexImage2D, | 
 |         the GL is free to choose the precision that it will maintain for the | 
 |         texture.  ES implementations are still encouraged, however, to maintain | 
 |         as much precision as possible, given the source arguments to those | 
 |         commands. | 
 |  | 
 |     In section 3.7.9 (3.7.10 for ES 2.0), update the definition of texture | 
 |     completeness (and cube completeness for ES 2.0 or in the presence of | 
 |     OES_texture_cube_map) to read: | 
 |  | 
 |         "... were each specified with the same format, type, and internal | 
 |         format." | 
 |          | 
 | Additions to Chapter 4 of the OpenGL ES 1.1 Specification (Per-Fragment  | 
 | Operations and the Frame Buffer) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 5 of the OpenGL ES 1.1 Specification (Special Functions) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 6 of the OpenGL ES 1.1 Specification (State and State  | 
 | Requests) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Appendix A of the OpenGL ES 1.1 Specification (Invariance) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to the AGL/EGL/GLX/WGL Specifications | 
 |  | 
 |     None. | 
 |  | 
 | GLX Protocol | 
 |  | 
 |     XXX TBD | 
 |  | 
 | Errors | 
 |  | 
 |    If TexImage2D or TexImage3DOES is called with a combination of <format>,  | 
 |    <type>, and <internalformat> not listed in Table 3.4, then INVALID_OPERATION | 
 |    is generated. | 
 |  | 
 |    If RenderbufferStorageOES or CopyTexImage2D is called with a value of | 
 |    <internalformat> not listed in Table 3.4.x or 3.4.y, respectively, then  | 
 |    INVALID_ENUM is generated. | 
 |     | 
 | New State | 
 |  | 
 |     None. | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     None. | 
 |      | 
 | Dependencies on OpenGL ES 2.0 | 
 |  | 
 |     If OpenGL ES 2.0 is supported, the following tokens do not have the | 
 |     "_OES" suffix: RGB565, RGBA4, RGB5_A1, DEPTH_COMPONENT16, STENCIL_INDEX8, | 
 |     and RENDERBUFFER.  Also, RenderbufferStorage does not have the "OES" suffix. | 
 |  | 
 | Dependencies on OES_depth_texture | 
 |      | 
 |     If OES_depth_texture is not supported, then all references to | 
 |     DEPTH_COMPONENT as a legal value for <format> when calling TexImage2D and  | 
 |     TexImage3DOES should be deleted. | 
 |  | 
 | Dependencies on OES_depth24 and OES_depth32 | 
 |  | 
 |     If OES_depth24 is not supported, then all references to | 
 |     DEPTH_COMPONENT24_OES should be deleted. | 
 |  | 
 |     If OES_depth32 is not supported, then all references to | 
 |     DEPTH_COMPONENT32_OES should be deleted. | 
 |  | 
 | Dependencies on OES_framebuffer_object | 
 |  | 
 |     If OES_framebuffer_object is not supported and OpenGL ES 2.0 is not  | 
 |     supported, then all references to RENDERBUFFER_OES and renderbuffers should | 
 |     be deleted, including Table 3.4.x. | 
 |  | 
 | Dependencies on OES_packed_depth_stencil | 
 |      | 
 |     If OES_packed_depth_stencil is not supported, then all references to | 
 |     DEPTH_STENCIL_OES, DEPTH24_STENCIL8_OES, and UNSIGNED_INT_24_8_OES should be  | 
 |     deleted. | 
 |  | 
 | Dependencies on OES_rgb8_rgba8 | 
 |  | 
 |     If OES_rgb8_rgba8 is not supported, then references to RGB8_OES as a  | 
 |     renderbuffer format in Table 3.4.x should be deleted. | 
 |  | 
 | Dependencies on OES_stencil1, OES_stencil4, and OES_stencil8  | 
 |  | 
 |     If OES_stencil1 is not supported, then all references to STENCIL_INDEX1_OES | 
 |     should be deleted. | 
 |  | 
 |     If OES_stencil4 is not supported, then all references to STENCIL_INDEX4_OES | 
 |     should be deleted. | 
 |  | 
 |     If OES_stencil8 is not supported and OpenGL ES 2.0 is not supported, then  | 
 |     all references to STENCIL_INDEX8_OES should be deleted. | 
 |  | 
 | Dependencies on OES_texture_3D | 
 |  | 
 |     If OES_texture_3D is not supported, then all references to TexImage3DOES  | 
 |     should be deleted. | 
 |  | 
 | Dependencies on EXT_texture_type_2_10_10_10_REV | 
 |  | 
 |     If EXT_texture_type_2_10_10_10_REV is not supported, then all references to | 
 |     RGB10_A2_EXT, RGB10_EXT, and UNSIGNED_INT_2_10_10_10_REV_EXT should be | 
 |     deleted. | 
 |  | 
 | Sample Code | 
 |  | 
 |     // ==================================================================== | 
 |     // Example 1:  | 
 |     // An application that requires support for RGBA with >= 8888 storage | 
 |     // can indicate so by simply checking for the OES_required_internalformat | 
 |     // extension string, since RGBA8_OES availability is a prerequisite. | 
 |     // ==================================================================== | 
 |      | 
 |     // First, check for presence of this extension. | 
 |     bool reqSupportAvailable =  | 
 |         MyExtensionQuery("GL_OES_required_internalformat"); | 
 |     if (!reqSupportAvailable) | 
 |     { | 
 |         printf("No support for GL_OES_required_internalformat!\n"); | 
 |         exit(1); | 
 |     } | 
 |  | 
 |     // This texture is guaranteed to be stored with at least 8-bit per component | 
 |     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8_OES, 32, 32, 0, | 
 |                  GL_RGBA, GL_UNSIGNED_BYTE, myTexelData); | 
 |  | 
 |     // ==================================================================== | 
 |     // Example 2:  | 
 |     // An application that requires support for DEPTH_COMPONENT with >= 32 bit | 
 |     // storage can indicate so by checking for both OES_required_internalformat | 
 |     // and OES_depth32 extension strings.  That will guarantee minimum precision | 
 |     // for 32-bit depth values stored in renderbuffers.  If the application also | 
 |     // needs 32-bit depth stored in textures, it can check for the  | 
 |     // OES_depth_texture extension, too. | 
 |     // ==================================================================== | 
 |  | 
 |     // First, check for presence of this extension. | 
 |     bool reqSupportAvailable = CheckExtension("GL_OES_required_internalformat"); | 
 |     if (!reqSupportAvailable) | 
 |     { | 
 |         printf("No support for GL_OES_required_internalformat.\n"); | 
 |         printf("Minimum precision guarantees cannot be made!\n"); | 
 |         exit(1); | 
 |     } | 
 |      | 
 |     // Now check for the presence of the depth32 extension. | 
 |     bool depth32_available = CheckExtension("GL_OES_depth32"); | 
 |     if (!depth32_available) | 
 |     { | 
 |         printf("No support for OES_depth32.\n"); | 
 |         printf("32-bit depth renderbuffers not available!\n"); | 
 |         exit(1); | 
 |     } | 
 |  | 
 |     // We're now guaranteed minimum 32-bit depth renderbuffers | 
 |     glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT32_OES, | 
 |                              32, 32); | 
 |  | 
 |     // Now check for the presence of the depth texture extension. | 
 |     bool depth_texture_available = CheckExtension("GL_OES_depth_texture"); | 
 |     if (!depth_texture_available) | 
 |     { | 
 |         printf("No support for OES_depth_texture.\n"); | 
 |         printf("32-bit depth textures not available!\n"); | 
 |         exit(1); | 
 |     } | 
 |  | 
 |     // We're now guaranteed minimum 32-bit depth textures | 
 |     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32_OES, 32, 32, 0, | 
 |                  GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, myD32TexelData); | 
 |  | 
 | Revision History | 
 |  | 
 |     0.19, 01/29/2010, bmerry | 
 |     - changed token values for six formats where they were different | 
 |       from equivalent OpenGL tokens, and added issue 12 | 
 |  | 
 |     0.18, 11/26/2008, benj | 
 |     - RGBA8 is mandated as a renderbuffer format, while RGB8 is only available | 
 |       if OES_rgb8_rgba8 is present. | 
 |  | 
 |     0.17, 11/19/2008, benj | 
 |     - treat OES_rgb8_rgba8 as optional like other renderbuffer format extensions | 
 |     - update Dependencies section | 
 |     - assign enum values for new tokens | 
 |     - fix minor typos | 
 |  | 
 |     0.16, 11/03/2008, benj | 
 |     - remove query mechanism since all sized internal formats have guaranteed | 
 |       minimum precision today | 
 |     - mention OES_rgb8_rgba8 requirement under Dependencies section | 
 |     - remove more tokens introduced by other extensions from New Tokens | 
 |     - update overview, issues list, and sample code | 
 |  | 
 |     0.15, 10/29/2008, benj | 
 |     - fix sample code bugs reported by Acorn | 
 |     - firm up the definition of texture completeness, requested by Acorn | 
 |  | 
 |     0.14, 10/29/2008, benj | 
 |     - fix spec bug reported by Ben in New Tokens section: split up token list | 
 |     - remove unrenderable RGB10_A2_EXT and RGB10_EXT formats from Table 3.4.x | 
 |     - get rid of gl, GL, and GL_ prefixes | 
 |     - switch query mechanism to new glIsRespectedInternalFormat | 
 |     - update issues list and sample code | 
 |  | 
 |     0.13, 10/28/2008, benj | 
 |     - major overhaul | 
 |     - remove double pointer from query command | 
 |     - fix extension names for depth and stencil extensions | 
 |     - sync up with latest 10/10/10/2 texture and depth texture extensions | 
 |     - don't allow RGBA8 or RGBA4 internal formats for 10/10/10/2 textures | 
 |       since that would require expanding the alpha channel | 
 |     - add OES suffix to most tokens, EXT for 10/10/10/2 tokens | 
 |     - remove tokens that aren't introduced by this extension from New Tokens | 
 |     - add missing ALPHA8_OES and DEPTH_COMPONENT16_OES to New Tokens | 
 |     - remove unsized formats from Table 3.4.x, add missing DEPTH_COMPONENT16 | 
 |     - remove L, A, and LA formats from Table 3.4.x and Table 3.6.x | 
 |       RENDERBUFFER_OES section | 
 |     - add interactions with ES 2.0 and OES_framebuffer_object | 
 |     - change error for invalid combination of format/type/internalformat from | 
 |       INVALID_ENUM to INVALID_OPERATION | 
 |     - reformat for 80 columns | 
 |     - update issues list and sample code | 
 |  | 
 |     0.12, 02/27/2008, jsandmel | 
 |     - added glGetSupportedInternalFormatsOES to new procedures section | 
 |     - fixed typo in argument name for <internalformatlist> | 
 |  | 
 |     0.11, 02/05/2008, jsandmel | 
 |     - reworked API after the Portland F2F | 
 |     - added query for supported internal formats | 
 |     - updated section 3.6.2.1 on how the required list works | 
 |     - added table 3.6.x for the list of required <internalformats> | 
 |     - added a sample code example of the query for supported <internalformats> | 
 |     - added dependency on packed depth stencil | 
 |  | 
 |     0.10, 10/16/2007, jsandmel | 
 |     - fixed several typos and non-ascii characters, no functional changes | 
 |  | 
 |     0.9, 10/15/2007, jsandmel | 
 |     - added issues 12 and 13 | 
 |     - included Acorn's suggestion for a query for supported formats that | 
 |       respect the minimum precision guarantee | 
 |  | 
 |     0.8, 05/27/2007, jsandmel | 
 |     - added contributors section | 
 |     - updated spec with recent group decisions | 
 |     - added explicit dependencies on OES_stencil, OES_depth extensions | 
 |     - split table 3.4.x into two tables: one for RenderbufferStorageOES | 
 |       and one for CopyTexImage since you can create a depth/stencil | 
 |       renderbuffer but not texture. | 
 |  | 
 |     0.7, 05/21/2007, jsandmel | 
 |     - updated spec with recent group decisions | 
 |     - removed concept of "optionally supported" extensions | 
 |     - added second table for RenderBuffer storage | 
 |  | 
 |     0.6, 05/03/2007, jsandmel | 
 |     - fixed some typos refering to OpenGL 1.5 spec that should be ES 1.1 spec | 
 |  | 
 |     0.5, 4/28/2007, jsandmel | 
 |     - changed a few more references to LUMINANCE/ALPHA instead of L/A | 
 |     - also clarified overview wrt to required <internalformat> semantics | 
 |  | 
 |     0.4, 4/25/2007, jsandmel | 
 |     - corrected table 3.4 and 3.4x to use LUMINANCE/ALPHA instead of L/A | 
 |  | 
 |     0.3, 4/24/2007, jsandmel | 
 |     - added issue 5 to discuss whether we should move all the "optionally | 
 |       supported" <internalformat> values to their own extensions | 
 |  | 
 |     0.2, 4/24/2007, jsandmel | 
 |     - fixed up a few typos and lingering references to UNPACK state | 
 |  | 
 |     0.1, 4/23/2007, jsandmel | 
 |     - switch to start using <internalformat> instead of adding a new | 
 |       UNPACK parameter. | 
 |      | 
 |     0.0, 4/17/2007, jsandmel | 
 |     - initial revision |