Name

    ARB_internalformat_query2

Name Strings

    GL_ARB_internalformat_query2

Contact

    Daniel Koch (dkoch 'at' nvidia 'dot' com)

Contributors

    Christophe Riccio, AMD
    Bruce Merry
    Yuan Wang, IMG
    Pat Brown, NVIDIA
    Piers Daniel, NVIDIA
    Daniel Koch, TransGaming
    Jon Leech, Khronos
    Members of the ARB Working group.

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: October 12, 2018
    Revision: 20

Number

    ARB Extension #131

Dependencies

    OpenGL 2.0 is required.

    ARB_internalformat_query is required.

    This extension is written against the OpenGL 4.2 (Core Profile)
    Specification.

    OES_texture_3D, ARB_framebuffer_object, EXT_texture_sRGB,
    ARB_framebuffer_sRGB, ARB_texture_sRGB_decode,
    EXT_texture_sRGB_decode, ARB_tessellation_shader,
    ARB_geometry_shader4, ARB_compute_shader, EXT_texture_array,
    ARB_texture_cube_map_array, ARB_texture_multisample,
    ARB_texture_rectangle, ARB_texture_buffer_object,
    ARB_texture_gather, ARB_debug_output, KHR_debug,
    ARB_clear_buffer_object, ARB_texture_compression_bptc,
    ARB_texture_compression_rgtc, ARB_stencil_texturing,
    ARB_depth_texture, OES_depth_texture, ARB_texture_view,
    ARB_texture_storage, ARB_texture_storage_multisample,
    ARB_shader_image_load_store, EXT_direct_state_access,
    EXT_texture_compression_s3tc, ARB_ES3_compatibility,
    KHR_texture_compression_astc_ldr, and core specifications
    that incorporate these extensions affect the definition
    of this extension.

Overview

    This extension extends the GetInternalformativ query that was added in
    the ARB_internalformat_query extension to provide applications with more 
    granular per-format capability information.

    This extension allows the remainder of the texture-style targets to
    be specified along with any possible internal format. 
    We add queries for additional properties supported for an internal
    format in addition to the multisample-related information that was
    added in ARB_internalformat_query.

    The goals of this extension are to: 

    a) provide a mechanism for implementations to declare support *above* the
       minimum required by the specification

    b) provide API to allow universally constant information to be queried

    c) provide a user-friendly way of finding out about version- or 
       implementation-specific limitations. 

    While much of this information can be determined for a single GL version
    by careful examination of the specification, support for many of these 
    properties has been gradually introduced over a number of API
    revisions. This can observed when considering the range in functionality
    between the various versions of GL 2, 3, and 4, as well as GL ES 2 and 3.

    In the case of an application which wishes to be scalable and able to run
    on a variety of possible GL or GL ES versions without being specifically
    tailored for each version, it must either have knowledge of the
    specifications built up into either the code or tables, or it must do
    a number of tests on startup to determine which capabilities are present.

    In OpenGL, other than the course-grained extension mechanism, many 
    limitations of, or limited support for, an internalformat can only 
    be signaled by failing an operation or by operating at reduced
    performance.  Thus, such tests often involve attempts to create resources,
    using them in specific ways and benchmarking the operations to
    find out if it is supported in the desired form, and at a required 
    performance level. The extension provides a way for these properties
    and caveats to be directly queried from the implementation.

    This extension is NOT intended to allow implementations to only support
    a subset of features that are required by a specific GL version, nor is
    it intended to replace the proper use of extension checks for optional
    functionality.

IP Status

    No known IP claims.

New Procedures and Functions

    void GetInternalformati64v(enum target, enum internalformat,
                               enum pname, sizei bufSize, int64 *params);

New Types

    None.

New Tokens

    Accepted by the <target> parameter of GetInternalformativ
    and GetInternalformati64v:

        TEXTURE_1D                                      0x0DE0
        TEXTURE_1D_ARRAY                                0x8C18
        TEXTURE_2D                                      0x0DE1
        TEXTURE_2D_ARRAY                                0x8C1A
        TEXTURE_3D                                      0x806F
        TEXTURE_CUBE_MAP                                0x8513
        TEXTURE_CUBE_MAP_ARRAY                          0x9009
        TEXTURE_RECTANGLE                               0x84F5
        TEXTURE_BUFFER                                  0x8C2A
        RENDERBUFFER                                    0x8D41
        TEXTURE_2D_MULTISAMPLE                          0x9100
        TEXTURE_2D_MULTISAMPLE_ARRAY                    0x9102

    Accepted by the <pname> parameter of GetInternalformativ
    and GetInternalformati64v:

        SAMPLES                                         0x80A9 
        NUM_SAMPLE_COUNTS                               0x9380
        INTERNALFORMAT_SUPPORTED                        0x826F  
        INTERNALFORMAT_PREFERRED                        0x8270  
        INTERNALFORMAT_RED_SIZE                         0x8271  
        INTERNALFORMAT_GREEN_SIZE                       0x8272  
        INTERNALFORMAT_BLUE_SIZE                        0x8273  
        INTERNALFORMAT_ALPHA_SIZE                       0x8274  
        INTERNALFORMAT_DEPTH_SIZE                       0x8275  
        INTERNALFORMAT_STENCIL_SIZE                     0x8276  
        INTERNALFORMAT_SHARED_SIZE                      0x8277  
        INTERNALFORMAT_RED_TYPE                         0x8278  
        INTERNALFORMAT_GREEN_TYPE                       0x8279  
        INTERNALFORMAT_BLUE_TYPE                        0x827A  
        INTERNALFORMAT_ALPHA_TYPE                       0x827B  
        INTERNALFORMAT_DEPTH_TYPE                       0x827C  
        INTERNALFORMAT_STENCIL_TYPE                     0x827D  
        MAX_WIDTH                                       0x827E  
        MAX_HEIGHT                                      0x827F  
        MAX_DEPTH                                       0x8280  
        MAX_LAYERS                                      0x8281  
        MAX_COMBINED_DIMENSIONS                         0x8282  
        COLOR_COMPONENTS                                0x8283  
        DEPTH_COMPONENTS                                0x8284  
        STENCIL_COMPONENTS                              0x8285  
        COLOR_RENDERABLE                                0x8286  
        DEPTH_RENDERABLE                                0x8287  
        STENCIL_RENDERABLE                              0x8288  
        FRAMEBUFFER_RENDERABLE                          0x8289  
        FRAMEBUFFER_RENDERABLE_LAYERED                  0x828A  
        FRAMEBUFFER_BLEND                               0x828B  
        READ_PIXELS                                     0x828C  
        READ_PIXELS_FORMAT                              0x828D  
        READ_PIXELS_TYPE                                0x828E  
        TEXTURE_IMAGE_FORMAT                            0x828F  
        TEXTURE_IMAGE_TYPE                              0x8290  
        GET_TEXTURE_IMAGE_FORMAT                        0x8291  
        GET_TEXTURE_IMAGE_TYPE                          0x8292  
        MIPMAP                                          0x8293  
        MANUAL_GENERATE_MIPMAP                          0x8294
        AUTO_GENERATE_MIPMAP                            0x8295  
        COLOR_ENCODING                                  0x8296  
        SRGB_READ                                       0x8297  
        SRGB_WRITE                                      0x8298  
        SRGB_DECODE_ARB                                 0x8299  
        FILTER                                          0x829A  
        VERTEX_TEXTURE                                  0x829B  
        TESS_CONTROL_TEXTURE                            0x829C  
        TESS_EVALUATION_TEXTURE                         0x829D  
        GEOMETRY_TEXTURE                                0x829E  
        FRAGMENT_TEXTURE                                0x829F  
        COMPUTE_TEXTURE                                 0x82A0  
        TEXTURE_SHADOW                                  0x82A1  
        TEXTURE_GATHER                                  0x82A2  
        TEXTURE_GATHER_SHADOW                           0x82A3  
        SHADER_IMAGE_LOAD                               0x82A4  
        SHADER_IMAGE_STORE                              0x82A5  
        SHADER_IMAGE_ATOMIC                             0x82A6  
        IMAGE_TEXEL_SIZE                                0x82A7  
        IMAGE_COMPATIBILITY_CLASS                       0x82A8  
        IMAGE_PIXEL_FORMAT                              0x82A9  
        IMAGE_PIXEL_TYPE                                0x82AA  
        IMAGE_FORMAT_COMPATIBILITY_TYPE                 0x90C7
        SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST             0x82AC  
        SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST           0x82AD  
        SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE            0x82AE  
        SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE          0x82AF  
        TEXTURE_COMPRESSED                              0x86A1
        TEXTURE_COMPRESSED_BLOCK_WIDTH                  0x82B1  
        TEXTURE_COMPRESSED_BLOCK_HEIGHT                 0x82B2  
        TEXTURE_COMPRESSED_BLOCK_SIZE                   0x82B3  
        CLEAR_BUFFER                                    0x82B4  
        TEXTURE_VIEW                                    0x82B5  
        VIEW_COMPATIBILITY_CLASS                        0x82B6  

    Returned as possible responses for various <pname> queries
    to GetInternalformativ and GetInternalformati64v
        FULL_SUPPORT                                    0x82B7  
        CAVEAT_SUPPORT                                  0x82B8  
        IMAGE_CLASS_4_X_32                              0x82B9  
        IMAGE_CLASS_2_X_32                              0x82BA  
        IMAGE_CLASS_1_X_32                              0x82BB  
        IMAGE_CLASS_4_X_16                              0x82BC  
        IMAGE_CLASS_2_X_16                              0x82BD  
        IMAGE_CLASS_1_X_16                              0x82BE  
        IMAGE_CLASS_4_X_8                               0x82BF  
        IMAGE_CLASS_2_X_8                               0x82C0  
        IMAGE_CLASS_1_X_8                               0x82C1  
        IMAGE_CLASS_11_11_10                            0x82C2  
        IMAGE_CLASS_10_10_10_2                          0x82C3  
        VIEW_CLASS_128_BITS                             0x82C4  
        VIEW_CLASS_96_BITS                              0x82C5  
        VIEW_CLASS_64_BITS                              0x82C6  
        VIEW_CLASS_48_BITS                              0x82C7  
        VIEW_CLASS_32_BITS                              0x82C8  
        VIEW_CLASS_24_BITS                              0x82C9  
        VIEW_CLASS_16_BITS                              0x82CA  
        VIEW_CLASS_8_BITS                               0x82CB  
        VIEW_CLASS_S3TC_DXT1_RGB                        0x82CC  
        VIEW_CLASS_S3TC_DXT1_RGBA                       0x82CD  
        VIEW_CLASS_S3TC_DXT3_RGBA                       0x82CE  
        VIEW_CLASS_S3TC_DXT5_RGBA                       0x82CF  
        VIEW_CLASS_RGTC1_RED                            0x82D0  
        VIEW_CLASS_RGTC2_RG                             0x82D1  
        VIEW_CLASS_BPTC_UNORM                           0x82D2  
        VIEW_CLASS_BPTC_FLOAT                           0x82D3
    [interactions with ARB_ES3_compatibility]
        VIEW_CLASS_EAC_R11                              0x9383
        VIEW_CLASS_EAC_RG11                             0x9384
        VIEW_CLASS_ETC2_RGB                             0x9385
        VIEW_CLASS_ETC2_RGBA                            0x9386
        VIEW_CLASS_ETC2_EAC_RGBA                        0x9387
    [interactions with KHR_texture_compression_astc_ldr]
        VIEW_CLASS_ASTC_4x4_RGBA                        0x9388
        VIEW_CLASS_ASTC_5x4_RGBA                        0x9389
        VIEW_CLASS_ASTC_5x5_RGBA                        0x938A
        VIEW_CLASS_ASTC_6x5_RGBA                        0x938B
        VIEW_CLASS_ASTC_6x6_RGBA                        0x938C
        VIEW_CLASS_ASTC_8x5_RGBA                        0x938D
        VIEW_CLASS_ASTC_8x6_RGBA                        0x938E
        VIEW_CLASS_ASTC_8x8_RGBA                        0x938F
        VIEW_CLASS_ASTC_10x5_RGBA                       0x9390
        VIEW_CLASS_ASTC_10x6_RGBA                       0x9391
        VIEW_CLASS_ASTC_10x8_RGBA                       0x9392
        VIEW_CLASS_ASTC_10x10_RGBA                      0x9393
        VIEW_CLASS_ASTC_12x10_RGBA                      0x9394
        VIEW_CLASS_ASTC_12x12_RGBA                      0x9395


Additions to Chapter 2 of the OpenGL 4.2 (Core Profile) Specification
(OpenGL Operation)

    None.

Additions to Chapter 3 of the OpenGL 4.2 (Core Profile) Specification
(Rasterization)

    None.

Additions to Chapter 4 of the OpenGL 4.2 (Core Profile) Specification
(Per-Fragment Operations and the Frame Buffer)

    None.

Additions to Chapter 5 of the OpenGL 4.2 (Compatibility Profile)
Specification (Special Functions)

    None.

Additions to Chapter 6 of the OpenGL 4.2 (Core Profile) Specification
(State and State Requests)

    Replace Section 6.1.15 "Internal Format Queries" with the following:

    "Information about implementation-dependent support for internal formats
    can be queried with the commands

        void GetInternalformativ(enum target, enum internalformat,
                                 enum pname, sizei bufSize, int *params);
        void GetInternalformati64v(enum target, enum internalformat,
                                   enum pname, sizei bufSize, int64 *params);

    <internalformat> can be any value. The INTERNALFORMAT_SUPPORTED <pname>
    can be used to determine if the internal format is supported, and the 
    other <pnames> are defined in terms of whether or not the format is
    supported.
   
    <target> indicates the usage of the <internalformat>, and must be one of
    the targets listed in Table 6.xx, otherwise the INVALID_ENUM error is
    generated.

      Target                         Usage
      -----------------              ------
      TEXTURE_1D                     1D texture
      TEXTURE_1D_ARRAY               1D array texture
      TEXTURE_2D                     2D texture
      TEXTURE_2D_ARRAY               2D array texture
      TEXTURE_2D_MULTISAMPLE         2D multisample texture
      TEXTURE_2D_MULTISAMPLE_ARRAY   2D multisample array texture
      TEXTURE_3D                     3D texture
      TEXTURE_BUFFER                 buffer texture
      TEXTURE_CUBE_MAP               cube map texture
      TEXTURE_CUBE_MAP_ARRAY         cube map array texture
      TEXTURE_RECTANGLE              rectangle texture
      RENDERBUFFER                   renderbuffer

      Table 6.xx: Possible targets that <internalformat> can be used with
      and the corresponding usage meaning. 

    No more than <bufSize> integers will be written into <params>. If
    more data are available, they will be ignored and no error will be
    generated.

    <pname> indicates the information to query. The following list provides
    the valid values for <pname>, defines the meaning and the possible 
    responses. In the following descriptions, the term /resource/ is used 
    to generically refer to an object of the appropriate type that has 
    been created with <internalformat> and <target>.  If the particualar
    <target> and <internalformat> combination do not make sense, or if
    a particular type of <target> is not supported by the implementation
    the "unsupported" answer should be given. This is not an error.

    All properties can be queried via either GetInternalformat* command.
    Data conversions are done as defined in section 6.1.2.

    For <pname> queries that return information about supported type of 
    operation in <params>, they have the following meanings:

    - NONE: the requested capability is not supported at all by the
      implementation.

    - CAVEAT_SUPPORT: the requested capability is supported by the 
      implementation, but there may be some implementation-specific
      caveats that make support less than optimal. For example using
      the feature may result in reduced performance (relative to other
      formats or features), such as software rendering or other mechanisms
      of emulating the desired feature. 

      If a query reports that there is a caveat and the debug output 
      functionality is enabled (see section 5.5 or ARB_debug_output), 
      the GL will generate a debug output message describing the caveat.
      The message has the source DEBUG_SOURCE_API, the type 
      DEBUG_TYPE_PERFORMANCE, and an implementation-dependent ID.

    - FULL_SUPPORT: the requested capability is fully supported by the
      implementation.

    The following are the supported values for <pname>:

    - INTERNALFORMAT_SUPPORTED: If <internalformat> is an internal format
      that is supported by the implementation in at least some subset of 
      possible operations, TRUE is written to <params>.  If <internalformat>
      if not a valid token for any internal format usage, FALSE is returned.

      <internalformats> that must be supported (in GL 4.2 or later) include
      the following: 
       - "sized internal formats" from Table 3.12, 3.13, and 3.15,
       - any specific "compressed internal format" from Table 3.14,
       - any "image unit format" from Table 3.21.
       - any generic "compressed internal format" from Table 3.14, if the
         implementation accepts it for any texture specification commands, and
       - unsized or base internal format, if the implementation accepts 
         it for texture or image specification. 

      In other words, any <internalformat> accepted by any of the commands:
        ClearBufferData, ClearBufferSubData,
        CompressedTexImage1D, CompressedTexImage2D, CompressedTexImage3D,
        CopyTexImage1D, CopyTexImage2D,
        RenderbufferStorage, RenderbufferStorageMultisample,
        TexBuffer,
        TexImage1D, TexImage2D, TexImage3D,
        TexImage2DMultisample, TexImage3DMultisample,
        TexStorage1D, TexStorage2D, TexStorage3D,
        TexStorage2DMultisample, TexStorage3DMultisample
        TextureView,
        ClearNamedBufferDataEXT, ClearNamedBufferSubDataEXT,
        TextureImage1DEXT, TextureImage2DEXT, TextureImage3DEXT
        CopyTextureImage1DEXT, CopyTextureImage2DEXT, 
        MultiTexImage1DEXT, MultiTexImage2DEXT, MultiTexImage3DEXT
        CompressedTextureImage3DEXT, CompressedTextureImage2DEXT, CompressedTextureImage1DEXT,
        CompressedMultiTexImage3DEXT, CompressedMultiTexImage2DEXT, CompressedMultiTexImage1DEXT
        TextureBufferEXT, MultiTexBufferEXT,
        NamedRenderbufferStorageEXT, NamedRenderbufferStorageMultisampleEXT,
        NamedRenderbufferStorageMultisampleCoverageEXT,
        CopyMultiTexImage1DEXT, CopyMultiTexImage2DEXT,
        TextureStorage1DEXT, TextureStorage2DEXT, TextureStorage3DEXT,
        TextureStorage2DMultisampleEXT, TextureStorage3DMultisampleEXT, and
      any valid <format> accepted by BindImageTexture, must be supported.

    - NUM_SAMPLE_COUNTS: The number of sample counts that would be
      returned by querying SAMPLES is returned in <params>.
      * If <internalformat> is not color-renderable, depth-renderable, or
        stencil-renderable (as defined in section 4.4.4), or if <target>
        does not support multiple samples (ie other than TEXTURE_2D_MULTISAMPLE,
        TEXTURE_2D_MULTISAMPLE_ARRAY, or RENDERBUFFER), 0 is returned.

    - SAMPLES: The sample counts supported for this <internalformat> and
      <target> are written into <params>, in descending order. Only
      positive values are returned.
      * Note that querying SAMPLES with a <bufSize> of 1 will return just
        the maximum supported number of samples for this format.
      * The maximum value in SAMPLES is guaranteed to be at least the lowest
        of the following:
        - The value of GetIntegerv(MAX_INTEGER_SAMPLES), if <internalformat>
          is a signed or unsigned integer format.
        - The value of GetIntegerv(MAX_DEPTH_TEXTURE_SAMPLES), if
          <internalformat> is a depth/stencil-renderable format and <target>
          is TEXTURE_2D_MULTISAMPLE or TEXTURE_2D_MULTISAMPLE_ARRAY.
        - The value of GetIntegerv(MAX_COLOR_TEXTURE_SAMPLES), if
          <internalformat> is a color-renderable format and <target> is
          TEXTURE_2D_MULTISAMPLE or TEXTURE_2D_MULTISAMPLE_ARRAY.
        - The value of GetIntegerv(MAX_SAMPLES).
      * If <internalformat> is not color-renderable, depth-renderable, or
        stencil-renderable (as defined in section 4.4.4), or if <target>
        does not support multiple samples (ie other than TEXTURE_2D_MULTISAMPLE,
        TEXTURE_2D_MULTISAMPLE_ARRAY, or RENDERBUFFER), <params> is not
        modified.

    - INTERNALFORMAT_PREFERRED: The implementation-preferred internal format
      for representing resources of the specified <internalformat> is returned
      in <params>. The preferred internal format should have no less precision
      than the requested one. If the specified <internalformat> is already
      a preferred format, or is there is no better format that is compatible,
      the queried <internalformat> value is written to <params>.  If the 
      <internalformat> is not supported, NONE is returned.

    - INTERNALFORMAT_RED_SIZE
    - INTERNALFORMAT_GREEN_SIZE
    - INTERNALFORMAT_BLUE_SIZE
    - INTERNALFORMAT_ALPHA_SIZE
    - INTERNALFORMAT_DEPTH_SIZE
    - INTERNALFORMAT_STENCIL_SIZE
    - INTERNALFORMAT_SHARED_SIZE
      For uncompressed internal formats, queries of these values return the
      actual resolutions that would be used for storing image array components
      for the resource.  
      For compressed internal formats, the resolutions returned specify the 
      component resolution of an uncompressed internal format that produces
      an image of roughly the same quality as the compressed algorithm.
      For textures this query will return the same information as querying
      GetTexLevelParameter{if}v for TEXTURE_*_SIZE would return (except in
      such cases where GetTexLevelParameter{if}v doesn't support such a query).
      If the internal format is unsupported, or if a particular component is
      not present in the format, 0 is written to <params>.

    - INTERNALFORMAT_RED_TYPE
    - INTERNALFORMAT_GREEN_TYPE
    - INTERNALFORMAT_BLUE_TYPE
    - INTERNALFORMAT_ALPHA_TYPE
    - INTERNALFORMAT_DEPTH_TYPE
    - INTERNALFORMAT_STENCIL_TYPE
      For uncompressed internal formats, queries for these values return the
      data type used to store the component.
      For compressed internal formats the types returned specify how components
      are interpreted after decompression. 
      For textures this query returns the same information as querying
      GetTexLevelParameter{if}v for TEXTURE_*_TYPE would return (except in
      such cases where GetTexLevelParameter{if}v doesn't support such a
      query). Possible values return include, NONE, SIGNED_NORMALIZED,
      UNSIGNED_NORMALIZED, FLOAT, INT, UNSIGNED_INT, representing missing,
      signed normalized fixed point, unsigned normalized fixed point, 
      floating-point, signed unnormalized integer and unsigned unnormalized
      integer components. NONE is returned for all component types if the
      format is unsupported.

    - MAX_WIDTH: The maximum supported width for the resource is returned in
      <params>. For resources with only one-dimension, this one dimension is
      considered the width. If the resource is unsupported, zero is returned.

    - MAX_HEIGHT: The maximum supported height for the resource is returned in
      <params>. For resources with two or more dimensions, the second dimension
      is considered the height. If the resource does not have at least two
      dimensions, or if the resource is unsupported, zero is returned.

    - MAX_DEPTH: The maximum supported depth for the resource is returned in
      <params>. For resources with three or more dimensions, the third 
      dimension is considered the depth. If the resource does not have at least
      three dimensions, or if the resource is unsupported, zero is returned.

    - MAX_LAYERS: The maximum supported number of layers for the resource is
      returned in <params>. For 1D array targets, the value returned is the
      same as the MAX_HEIGHT. For 2D and cube array targets, the value returned
      is the same as the MAX_DEPTH. If the resource does not support layers, 
      or if the resource is unsupported, zero is returned. 

    - MAX_COMBINED_DIMENSIONS: The maximum combined dimensions for the resource
      is returned in <params>. The combined dimensions is the product of the
      individual dimensions of the resource. For multisampled surfaces the
      number of samples is considered an additional dimension. Note that the
      value returned can be >= 2^32 and should be queried with the 64-bit query.
      This value should be considered a recommendations for applications. There
      may be system-dependant reasons why allocations larger than this size may
      fail, even if there might appear to be sufficient memory available when
      queried via some other means. This also does not provide a guarantee that
      allocations smaller than this will succeed because this value is not
      affected by existing resource allocations.
      For 1D targets this is the maximum single dimension.
      For 1D array targets this is the maximum combined width and layers.
      For 2D targets this is the maximum combined width and height.
      For 2D multisample targets this is the combined width, height and samples.
      For 2D array targets this is the max combined width, height and layers.
      For 2D multisample array targets, this is the max combined width, height,
      layers and samples.
      For 3D targets this is the maximum combined width, height and depth. 
      For cube map targets this is the maximum combined width, height and 
      faces.
      For cube map array targets this is the maximum width, height and
      layer-faces.
      If the resource is unsupported, zero is returned.
 
    - COLOR_COMPONENTS: If the internal format contains any color components 
      (R, G, B, or A), TRUE is returned in <params>. If the internal format is
      unsupported or contains no color components, FALSE is returned.

    - DEPTH_COMPONENTS: If the internal format contains a depth component (D),
      TRUE is returned in <params>. If the internal format is unsupported or
      contains no depth component, FALSE is returned.

    - STENCIL_COMPONENTS: If the internal format contains a stencil component
      (S), TRUE is returned in <params>. If the internal format is unsupported
      or contains no stencil component, FALSE is returned.

    - COLOR_RENDERABLE: If <internalformat> is color-renderable (as defined in
      section 4.4.4), TRUE is returned in <params>.  If the internal format is 
      unsupported, or the internal format is not color-renderable, FALSE 
      is returned.

    - DEPTH_RENDERABLE: If <internalformat> is depth-renderable (as defined in
      section 4.4.4), TRUE is returned in <params>. If the internal format is
      unsupported, or if the internal format is not depth-renderable, FALSE
      is returned.

    - STENCIL_RENDERABLE: If <internalformat> is stencil-renderable (as
      defined in section 4.4.4), TRUE is returned in <params>. If the internal
      format is unsupported, or if the internal format is not stencil-
      renderable, FALSE is returned.

    - FRAMEBUFFER_RENDERABLE: The support for rendering to the resource via
      framebuffer attachment is returned in <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource is unsupported, NONE is returned.

    - FRAMEBUFFER_RENDERABLE_LAYERED: The support for layered rendering to
      the resource via framebuffer attachment is returned in <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource is unsupported, NONE is returned.

    - FRAMEBUFFER_BLEND: The support for rendering to the resource
      via framebuffer attachment when blending is enabled is returned in
      <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource is unsupported, NONE is returned.

    - READ_PIXELS: The support for reading pixels from the resource when it is
      attached to a framebuffer is returned in <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource is unsupported, NONE is returned.

    - READ_PIXELS_FORMAT: The <format> to pass to ReadPixels to obtain the best
      performance and image quality when reading from framebuffers with
      <internalformat> is returned in <params>.
      Possible values include any value that is legal to pass for the <format>
      parameter to ReadPixels, or NONE if <internalformat> is not supported
      or can never be a valid source for ReadPixels.

    - READ_PIXELS_TYPE: The <type> to pass to ReadPixels to obtain the best
      performance and image quality when reading from framebuffers with
      <internalformat> is returned in <params>.
      Possible values include any value that is legal to pass for the <type>
      parameter to ReadPixels, or NONE if the internal format is not supported
      or can never be a source for ReadPixels.

    - TEXTURE_IMAGE_FORMAT: The implementation-preferred <format> to pass to 
      TexImage*D or TexSubImage*D when specifying texture image data for
      this resource is returned in <params>.
      Possible values include any value that is legal to pass for the <format>
      parameter to the Tex*Image*D commands, or NONE if the resource is
      not supported for this operation.
      
    - TEXTURE_IMAGE_TYPE: The implementation-preferred <type> to pass to 
      TexImage*D or TexSubImage*D when specifying texture image data for 
      this resource is returned in <params>.
      Possible values include any value that is legal to pass for the <type>
      parameter to the Tex*Image*D commands, or NONE if the resource is
      not supported for this operation.

    - GET_TEXTURE_IMAGE_FORMAT: The implementation-preferred <format> to pass to
      GetTexImage when querying texture image data from this resource.
      Possible values include any value that is legal to pass for the <format>
      parameter to GetTexImage, or NONE if the resource does not support
      this operation, or if GetTexImage is not supported.

    - GET_TEXTURE_IMAGE_TYPE: The implementation-preferred <type> to pass to
      GetTexImage when querying texture image data from this resource.
      Possible values include any value that is legal to pass for the <type>
      parameter to GetTexImage, or NONE if the resource does not support
      this operation, or if GetTexImage is not supported.

    - MIPMAP: If the resource supports mipmaps, TRUE is returned in <params>.
      If the resource is not supported, or if mipmaps are not supported for
      this type of resource, FALSE is returned.

    - MANUAL_GENERATE_MIPMAP: The support for manually generating mipmaps for
      the resource is returned in <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource is not supported, or if the operation is not supported,
      NONE is returned.

    - AUTO_GENERATE_MIPMAP: The support for automatic generation of mipmaps
      for the resource is returned in <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource is not supported, or if the operation is not supported,
      NONE is returned.

    - COLOR_ENCODING: The color encoding for the resource is returned in
      <params>.  Possible values for color buffers are LINEAR or SRGB, 
      for linear or sRGB-encoded color components, respectively. For non-color
      formats (such as depth or stencil), or for unsupported resources,
      the value NONE is returned.

    - SRGB_READ: The support for converting from sRGB colorspace on read
      operations (see section 3.9.18) from the resource is returned in 
      <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - SRGB_WRITE: The support for converting to sRGB colorspace on write
      operations to the resource is returned in <params>.
      This indicates that writing to framebuffers with this internalformat 
      will encode to sRGB color spaces when FRAMEBUFFER_SRGB is enabled (see
      section 4.1.8).
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.
      
    - SRGB_DECODE_ARB: The support for toggling whether sRGB decode happens at
      sampling time (see EXT/ARB_texture_sRGB_decode) for the resource is
      returned in <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - FILTER: The support for filter types other than NEAREST or 
      NEAREST_MIPMAP_NEAREST for the resource is written to <params>.
      This indicates if sampling from such resources supports setting the
      MIN/MAG filters to LINEAR values.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.
      
    - VERTEX_TEXTURE: The support for using the resource as a source for 
      texture sampling in a vertex shader is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - TESS_CONTROL_TEXTURE: The support for using the resource as a source for 
      texture sampling in a tessellation control shader is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - TESS_EVALUATION_TEXTURE: The support for using the resource as a source
      for texture sampling in a tessellation evaluation shader is written to
      <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - GEOMETRY_TEXTURE: The support for using the resource as a source for 
      texture sampling in a geometry shader is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - FRAGMENT_TEXTURE: The support for using the resource as a source for 
      texture sampling in a fragment shader is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - COMPUTE_TEXTURE: The support for using the resource as a source for 
      texture sampling in a compute shader is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - TEXTURE_SHADOW: The support for using the resource with shadow samplers
      is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - TEXTURE_GATHER: The support for using the resource with texture gather 
      operations is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.
      
    - TEXTURE_GATHER_SHADOW: The support for using resource with texture gather
      operations with shadow samplers is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - SHADER_IMAGE_LOAD: The support for using the resource with image load
      operations in shaders is written to <params>.
      In this case the <internalformat> is the value of the <format> parameter
      that would be passed to BindImageTexture.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - SHADER_IMAGE_STORE: The support for using the resource with image store
      operations in shaders is written to <params>.
      In this case the <internalformat> is the value of the <format> parameter
      that is passed to BindImageTexture.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - SHADER_IMAGE_ATOMIC: The support for using the resource with atomic
      memory operations from shaders is written to <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - IMAGE_TEXEL_SIZE: The size of a texel when the resource when used as
      an image texture is returned in <params>.  This is the value from the
      /Size/ column in Table 3.22. If the resource is not supported for image
      textures, or if image textures are not supported, zero is returned.

    - IMAGE_COMPATIBILITY_CLASS: The compatibility class of the resource when
      used as an image texture is returned in <params>.  This corresponds to 
      the value from the /Class/ column in Table 3.22. The possible values
      returned are IMAGE_CLASS_4_X_32, IMAGE_CLASS_2_X_32, IMAGE_CLASS_1_X_32,
      IMAGE_CLASS_4_X_16, IMAGE_CLASS_2_X_16, IMAGE_CLASS_1_X_16, 
      IMAGE_CLASS_4_X_8, IMAGE_CLASS_2_X_8, IMAGE_CLASS_1_X_8,
      IMAGE_CLASS_11_11_10, and IMAGE_CLASS_10_10_10_2, which correspond to 
      the 4x32, 2x32, 1x32, 4x16, 2x16, 1x16, 4x8, 2x8, 1x8, the class 
      (a) 11/11/10 packed floating-point format, and the class (b) 
      10/10/10/2 packed formats, respectively. 
      If the resource is not supported for image textures, or if image 
      textures are not supported, NONE is returned.
     
    - IMAGE_PIXEL_FORMAT: The pixel format of the resource when used as an
      image texture is returned in <params>.  This is the value
      from the /Pixel format/ column in Table 3.22. If the resource is not
      supported for image textures, or if image textures are not supported,
      NONE is returned.

    - IMAGE_PIXEL_TYPE: The pixel type of the resource when used as an
      image texture is returned in <params>.  This is the value from 
      the /Pixel type/ column in Table 3.22. If the resource is not supported
      for image textures, or if image textures are not supported, NONE is
      returned.

    - IMAGE_FORMAT_COMPATIBILITY_TYPE: The matching criteria use for the
      resource when used as an image textures is returned in <params>. This
      is equivalent to calling GetTexParameter with <value> set to 
      IMAGE_FORMAT_COMPATIBILITY_TYPE. Possible values are
      IMAGE_FORMAT_COMPATIBILITY_BY_SIZE or IMAGE_FORMAT_COMPATIBILITY_BY_CLASS.
      If the resource is not supported for image textures, or if image textures
      are not supported, NONE is returned.

    - SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST: The support for using the resource
      both as a source for texture sampling while it is bound as a buffer for
      depth test is written to <params>. For example, a depth (or stencil)
      texture could be bound simultaneously for texturing while it is bound as
      a depth (and/or stencil) buffer without causing a feedback loop, provided
      that depth writes are disabled.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST: The support for using the resource
      both as a source for texture sampling while it is bound as a buffer for
      stencil test is written to <params>. For example, a depth (or stencil)
      texture could be bound simultaneously for texturing while it is bound as
      a depth (and/or stencil) buffer without causing a feedback loop,
      provided that stencil writes are disabled.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE: The support for using the resource
      both as a source for texture sampling while performing depth writes to
      the resources is written to <params>.  For example, a depth-stencil
      texture could be bound simultaneously for stencil texturing while it
      is bound as a depth buffer. Feedback loops cannot occur because sampling 
      a stencil texture only returns the stencil portion, and thus writes to
      the depth buffer do not modify the stencil portions.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE: The support for using the resource
      both as a source for texture sampling while performing stencil writes to
      the resources is written to <params>.  For example, a depth-stencil
      texture could be bound simultaneously for depth-texturing while it is
      bound as a stencil buffer. Feedback loops cannot occur because sampling
      a depth texture only returns the depth portion, and thus writes to
      the stencil buffer could not modify the depth portions.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - TEXTURE_COMPRESSED: If <internalformat> is a compressed format
      that is supported for this type of resource, TRUE is returned in 
      <params>. If the internal format is not compressed, or the type of
      resource is not supported, FALSE is returned.

    - TEXTURE_COMPRESSED_BLOCK_WIDTH: If the resource contains a compressed
      format, the width of a compressed block (in bytes) is returned in
      <params>. If the internal format is not compressed, or the resource
      is not supported, 0 is returned.

    - TEXTURE_COMPRESSED_BLOCK_HEIGHT: If the resource contains a compressed
      format, the height of a compressed block (in bytes) is returned in
      <params>. If the internal format is not compressed, or the resource
      is not supported, 0 is returned.

    - TEXTURE_COMPRESSED_BLOCK_SIZE: If the resource contains a compressed
      format the number of bytes per block is returned in <params>.  If the
      internal format is not compressed, or the resource is not supported,
      0 is returned. 
      (combined with the above, allows the bitrate to be computed, and may be
      useful in conjunction with ARB_compressed_texture_pixel_storage).

    - CLEAR_BUFFER: The support for using the resource with ClearBuffer*Data
      commands is returned in <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.

    - TEXTURE_VIEW: The support for using the resource with the TextureView
      command is returned in <params>.
      Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
      If the resource or operation is not supported, NONE is returned.
 
    - VIEW_COMPATIBILITY_CLASS: The compatibility class of the resource when
      used as a texture view is returned in <params>. The compatibility
      class is one of the values from the /Class/ column of Table 3.X.2
      (added by the ARB_texture_view extension). If
      the resource has no other formats that are compatible, the resource
      does not support views, or if texture views are not supported, NONE is
      returned.

    If <pname> is not one of the preceeding names, the error INVALID_ENUM
    is generated."

Additions to Appendix A of the OpenGL 4.2 (Core Profile) Specification
(Invariance)

    None.

Additions to Appendix D of the OpenGL 4.2 (Core Profile) Specification
(Shared Objects and Multiple Contexts)

    None.

GLX Protocol

    XXX - TODO.

Dependencies on OpenGL ES 2.0
    Queries involving any of the following enums for <target>:
      - TEXTURE_1D
      - TEXTURE_3D
      - TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY
      - TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY
      - TEXTURE_RECTANGLE
      - TEXTURE_BUFFER
    or any of the following <pnames>:
      - GET_TEXTURE_IMAGE_FORMAT, GET_TEXTURE_IMAGE_TYPE
      - MAX_LAYERS
      - FRAMEBUFFER_RENDERABLE_LAYERED
      - AUTO_GENERATE_MIPMAP
      - SRGB_READ, SRGB_WRITE
      - TESS_CONTROL_TEXTURE, TESS_EVALUATION_TEXTURE
      - GEOMETRY_TEXTURE
      - COMPUTE_TEXTURE
      - TEXTURE_SHADOW, TEXTURE_GATHER, TEXTURE_GATHER_SHADOW
      - SHADER_IMAGE_LOAD, SHADER_IMAGE_STORE, SHADER_IMAGE_ATOMIC
      - IMAGE_TEXEL_SIZE, IMAGE_PIXEL_FORMAT, IMAGE_PIXEL_TYPE
      - IMAGE_COMPATIBILITY_CLASS, IMAGE_FORMAT_COMPATIBILITY_TYPE
      - CLEAR_BUFFER
      - TEXTURE_VIEW, VIEW_COMPATIBILITY_CLASS
    return the appropriate "unsupported" response.
    Queries for unsupported features/targets do NOT set errors.

Dependencies on OES_texture_3D
    - adds support for TEXTURE_3D targets in OpenGL ES 2.0 implementations.

Dependencies on OpenGL ES 3.0
    Queries involving any of the following enums for <target>:
      - TEXTURE_1D
      - TEXTURE_1D_ARRAY, TEXTURE_CUBE_MAP_ARRAY
      - TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY
      - TEXTURE_RECTANGLE
      - TEXTURE_BUFFER
    or any of the following <pnames>:
      - GET_TEXTURE_IMAGE_FORMAT, GET_TEXTURE_IMAGE_TYPE
      - AUTO_GENERATE_MIPMAP
      - TESS_CONTROL_TEXTURE, TESS_EVALUATION_TEXTURE
      - GEOMETRY_TEXTURE
      - COMPUTE_TEXTURE
      - TEXTURE_GATHER, TEXTURE_GATHER_SHADOW
      - SHADER_IMAGE_LOAD, SHADER_IMAGE_STORE, SHADER_IMAGE_ATOMIC
      - IMAGE_TEXEL_SIZE, IMAGE_PIXEL_FORMAT, IMAGE_PIXEL_TYPE
      - IMAGE_COMPATIBILITY_CLASS, IMAGE_FORMAT_COMPATIBILITY_TYPE
      - CLEAR_BUFFER
      - TEXTURE_VIEW, VIEW_COMPATIBILITY_CLASS
    return the appropriate "unsupported" response.
    Queries for unsupported features/targets do NOT set errors.

    If the <pname> is SRGB_WRITE, ignore references to FRAMEBUFFER_SRGB.

Dependencies on OpenGL 2.0
    Queries involving any of the following enums for <target>:
      - TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY
      - TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY
      - TEXTURE_RECTANGLE
      - TEXTURE_BUFFER
      - RENDERBUFFER
    or any of the following <pnames>:
      - MAX_LAYERS
      - FRAMEBUFFER_RENDERABLE
      - FRAMEBUFFER_RENDERABLE_LAYERED
      - FRAMEBUFFER_BLEND
      - MANUAL_GENERATE_MIPMAP
      - SRGB_READ, SRGB_WRITE
      - TESS_CONTROL_TEXTURE, TESS_EVALUATION_TEXTURE
      - GEOMETRY_TEXTURE
      - COMPUTE_TEXTURE
      - TEXTURE_SHADOW, TEXTURE_GATHER, TEXTURE_GATHER_SHADOW
      - SHADER_IMAGE_LOAD, SHADER_IMAGE_STORE, SHADER_IMAGE_ATOMIC
      - IMAGE_TEXEL_SIZE, IMAGE_PIXEL_FORMAT, IMAGE_PIXEL_TYPE
      - IMAGE_COMPATIBILITY_CLASS, IMAGE_FORMAT_COMPATIBILITY_TYPE
      - CLEAR_BUFFER
      - TEXTURE_VIEW, VIEW_COMPATIBILITY_CLASS
    return the appropriate "unsupported" response.
    Queries for unsupported features/targets do NOT set errors.

Dependencies on OpenGL 3.0
    Queries involving any of the following enums for <target>:
      - TEXTURE_CUBE_MAP_ARRAY
      - TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY
      - TEXTURE_RECTANGLE
      - TEXTURE_BUFFER
    or any of the following <pnames>:
      - TESS_CONTROL_TEXTURE, TESS_EVALUATION_TEXTURE
      - GEOMETRY_TEXTURE
      - COMPUTE_TEXTURE
      - TEXTURE_SHADOW, TEXTURE_GATHER, TEXTURE_GATHER_SHADOW
      - SHADER_IMAGE_LOAD, SHADER_IMAGE_STORE, SHADER_IMAGE_ATOMIC
      - IMAGE_TEXEL_SIZE, IMAGE_PIXEL_FORMAT, IMAGE_PIXEL_TYPE
      - IMAGE_COMPATIBILITY_CLASS, IMAGE_FORMAT_COMPATIBILITY_TYPE
      - CLEAR_BUFFER
      - TEXTURE_VIEW, VIEW_COMPATIBILITY_CLASS
    return the appropriate "unsupported" response.
    Queries for unsupported features/targets do NOT set errors.

Dependencies on OpenGL 3.2 (Core Profile)
    In core profiles for OpenGL 3.2 and later versions, queries
    for the AUTO_GENERATE_MIPMAP <pname> return the appropriate
    unsupported response.

Dependencies on OpenGL 4.0
    Queries involving any of the following <pnames>:
      - COMPUTE_TEXTURE
      - SHADER_IMAGE_LOAD, SHADER_IMAGE_STORE, SHADER_IMAGE_ATOMIC
      - IMAGE_TEXEL_SIZE, IMAGE_PIXEL_FORMAT, IMAGE_PIXEL_TYPE
      - IMAGE_COMPATIBILITY_CLASS, IMAGE_FORMAT_COMPATIBILITY_TYPE
      - CLEAR_BUFFER
      - TEXTURE_VIEW, VIEW_COMPATIBILITY_CLASS
    return the appropriate "unsupported" response.
    Queries for unsupported features/targets do NOT set errors.

Dependencies on ARB_framebuffer_object
    If ARB_framebuffer_object, EXT_framebuffer_object or equivalent
    functionality is not supported, queries involving the RENDERBUFFER
    <target> or the following <pnames>: 
      - FRAMEBUFFER_RENDERABLE
      - FRAMEBUFFER_RENDERABLE_LAYERED
      - FRAMEBUFFER_BLEND
      - MANUAL_GENERATE_MIPMAP
    return the appropriate "unsupported" response.

Dependencies on EXT_texture_sRGB
    If EXT_texture_sRGB or equivalent functionality is not supported,
    queries for the SRGB_READ <pname> and for sRGB internalformats
    return the appropriate "unsupported" response.

Dependencies on ARB_framebuffer_sRGB
    If ARB_framebuffer_sRGB or equivalent functionality is not supported,
    queries for the SRGB_WRITE <pname> return the appropriate "unsupported"
    response.

Dependencies on ARB/EXT_texture_sRGB_decode
    If ARB_texture_sRGB_decode or EXT_texture_sRGB_decode or equivalent
    functionality is not supported, queries for the SRGB_DECODE_ARB <pname>
    set the INVALID_ENUM error. (N.B. this is different from all other
    extension interactions because this functionality is not present
    in any core specification, and thus it behaves as an unrecognized
    token rather than as an unsupported feature.)

Dependencies on ARB_tessellation_shader
    If ARB_tessellation_shader or equivalent functionality is not supported,
    queries for the TESS_CONTROL_TEXTURE and TESS_EVALUATION_TEXTURE <pnames>,
    return the appropriate "unsupported" response.

Dependencies on ARB_geometry_shader4
    If ARB_geometry_shader4 or equivalent functionality is not supported,
    queries for the GEOMETRY_TEXTURE <pname> will return the appropriate
    "unsupported" response.

Dependencies on ARB_compute_shader
    If ARB_compute_shader or equivalent functionality is not supported,
    queries for the COMPUTE_TEXTURE <pname> will return the appropriate
    "unsupported" response.

Dependencies on EXT_texture_array
    If EXT_texture_array or equivalent functionality is not supported,
    queries for the TEXTURE_1D_ARRAY and TEXTURE_2D_ARRAY <targets> and
    for the FRAMEBUFFER_RENDERABLE_LAYERED <pname> return the appropriate
    "unsupported" response.  In addition, the MAX_LAYERS query will return
    zero.

Dependencies on ARB_texture_cube_map_array
    If ARB_texture_cube_map_array or equivalent functionality is not supported,
    queries for the TEXTURE_CUBE_MAP_ARRAY <target> will return the
    appropriate "unsupported" response.

Dependencies on ARB_texture_multisample
    If ARB_texture_multisample or equivalent functionality is not supported,
    queries for the TEXTURE_2D_MULTISAMPLE or TEXTURE_2D_MULTISAMPLE_ARRAY
    <target> parameter will return the appropriate unsupported response.

Dependencies on ARB_texture_rectangle
    If ARB_texture_rectange or equivalent functionality is not supported,
    queries for the TEXTURE_RECTANGLE <target> parameter will return the
    appropriate unsupported response.

Dependencies on ARB_texture_buffer_object
    If ARB_texture_buffer_object or equivalent functionality is not supported,
    queries for the TEXTURE_BUFFER <target> parameter will return the
    appropriate unsupported response. Ignore all references to TexBuffer.

Dependencies on ARB_texture_gather
    If ARB_texture_gather or equivalent functionality is not supported,
    queries for the TEXTURE_GATHER <pname> return the appropriate
    unsupported response.

Dependecies on ARB_debug_output
    If ARB_debug_output, KHR_debug or equivalent functionality is not
    supported, ignore all references to debug output messages.

Dependencies on ARB_clear_buffer_object
    If ARB_clear_buffer_object or equivalent functionality is not supported,
    queries for the CLEAR_BUFFER <pname> return the appropriate
    unsupported response.  Ignore all references to ClearBufferData and
    ClearBufferSubData, ClearNamedBufferDataEXT, and ClearNamedBufferSubDataEXT.

Dependencies on ARB_texture_compression_bptc
    If ARB_texture_compression_bptc or equivalent functionality is not
    supported, ignore all references to VIEW_CLASS_BPTC_UNORM and
    VIEW_CLASS_BPTC_FLOAT.

Dependencies on ARB_texture_compression_rgtc
    If ARB_texture_compression_rgtc or equivalent functionality is not
    supported, ignore all references to VIEW_CLASS_RGTC1_RED and
    VIEW_CLASS_RGTC2_RG.

Dependencies on ARB_ES3_compatibility
    If ARB_ES3_compatibility or equivalent functionality is not supported,
    ingore all references to VIEW_CLASS_EAC_R11, VIEW_CLASS_EAC_RG11,
    VIEW_CLASS_ETC2_RGB, VIEW_CLASS_ETC2_RGBA, and VIEW_CLASS_ETC2_EAC_RGBA.

Dependencies on KHR_texture_compression_astc_ldr
    If KHR_texture_compression_astc_ldr or equivalent functionality is not
    supported, ignore all references to VIEW_CLASS_ASTC_4x4_RGBA,
    VIEW_CLASS_ASTC_5x4_RGBA, VIEW_CLASS_ASTC_5x5_RGBA,
    VIEW_CLASS_ASTC_6x5_RGBA, VIEW_CLASS_ASTC_6x6_RGBA,
    VIEW_CLASS_ASTC_8x5_RGBA, VIEW_CLASS_ASTC_8x6_RGBA, VIEW_CLASS_ASTC_8x8_RGBA,
    VIEW_CLASS_ASTC_10x5_RGBA, VIEW_CLASS_ASTC_10x6_RGBA,
    VIEW_CLASS_ASTC_10x8_RGBA, VIEW_CLASS_ASTC_10x10_RGBA,
    VIEW_CLASS_ASTC_12x10_RGBA, and VIEW_CLASS_ASTC_12x12_RGBA.

Dependencies on ARB_stencil_texturing
    If ARB_stencil_texturing or equivalent functionality is not supported,
    ignore all references to stencil texturing.

Dependencies on ARB_depth_texture and OES_depth_texture
    If ARB_depth_texture, OES_depth_texture or equivalent functionality is
    no supported, ignore all references to depth texturing.

Dependencies on ARB_texture_view 
    If ARB_texture_view or equivalent functionality is not supported,
    queries for the TEXTURE_VIEW and VIEW_COMPATIBILITY_CLASS <pname> values
    return the appropriate unsupported response. Ignore all references
    to TextureView.

Dependencies on ARB_texture_storage
    If ARB_texture_storage, EXT_texture_storage or equivalent functionality
    is not supported, ignore all references to TexStorage1D, TexStorage2D,
    TexStorage3D, TextureStorage1DEXT, TextureStorage2DEXT, and
    TextureStorage3DEXT.

Dependencies on ARB_texture_storage_multisample
    If ARB_texture_storage_multisample or equivalent functionality is not
    supported, ignore all references to TexStorage2DMultisample, 
    TexImage3DMultisample, TextureStorage2DMultisampleEXT, and 
    TextureStorage3DMultisampleEXT.

Dependencies on ARB_shader_image_load_store
    If ARB_shader_image_load_store or equivalent functionality is not
    supported, queries for the following <pname> values:
      - SHADER_IMAGE_LOAD
      - SHADER_IMAGE_STORE
      - SHADER_IMAGE_ATOMIC
      - IMAGE_TEXEL_SIZE
      - IMAGE_COMPATIBILITY_CLASS
      - IMAGE_PIXEL_FORMAT
      - IMAGE_PIXEL_TYPE
      - IMAGE_FORMAT_COMPATIBILITY_TYPE
    return the appropriate unsupported response.
    Ignore all references to BindImageTexture.

Dependencies on EXT_direct_state_access
    If EXT_direct_state_access or equivalent functionality is not supported,
    ignore all references to:
        ClearNamedBufferDataEXT, ClearNamedBufferSubDataEXT,
        TextureImage1DEXT, TextureImage2DEXT, TextureImage3DEXT,
        CopyTextureImage1DEXT, CopyTextureImage2DEXT, 
        MultiTexImage1DEXT, MultiTexImage2DEXT, MultiTexImage3DEXT,
        CompressedTextureImage3DEXT, CompressedTextureImage2DEXT, 
        CompressedTextureImage1DEXT, CompressedMultiTexImage3DEXT,
        CompressedMultiTexImage2DEXT, CompressedMultiTexImage1DEXT
        TextureBufferEXT, MultiTexBufferEXT,
        NamedRenderbufferStorageEXT, NamedRenderbufferStorageMultisampleEXT,
        NamedRenderbufferStorageMultisampleCoverageEXT,
        CopyMultiTexImage1DEXT, CopyMultiTexImage2DEXT,
        TextureStorage1DEXT, TextureStorage2DEXT, TextureStorage3DEXT,
        TextureStorage2DMultisampleEXT, and TextureStorage3DMultisampleEXT.

Dependencies on EXT_texture_compression_s3tc
    If EXT_texture_compression_s3tc or equivalent functionality is not
    supported, ignore all references to VIEW_CLASS_S3TC_DXT1_RGBA, 
    VIEW_CLASS_S3TC_DXT1_RGB, VIEW_CLASS_S3TC_DXT3_RGBA, and 
    VIEW_CLASS_S3TC_DXT5_RGBA.

Errors

    The INVALID_ENUM error is generated if the <target> parameter to
    GetInternalformati*v is not one of the targets listed in Table 6.xx.

    The INVALID_ENUM error is generated if the <pname> parameter is
    not one of the listed possibilities.

New State

    None.

New Implementation Dependent State

    None.

Sample Code

    TBD

Conformance Tests

    TBD

Issues

    1) What should this extension be called?

    DISCUSSION: Some options that come to mind: 
       ARB_internalformat_query2
       ARB_internalformat_query_extended
    RESOLVED: use ARB_internalformat_query2.

    2) Should the <internalformat> parameter take "base internal formats" from
    Table 3.11, any of the "generic" compressed formats, or any other unsized 
    tokens? What about allowing *any* possible value for <internalformat> so
    that list of formats queryable is not tied to any particular GL version?

    DISCUSSION: Tying the internalformats accepted to various tables in one 
    specific version of the spec makes it difficult to determine what should
    be supported when this is implemented against other versions of the specs
    and even worse when you consider extensions which add new formats but 
    which may not have updated the tables.

    RESOLVED: It will be simpler and more useful to allow the query to take
    any enum value for the INTERNALFORMAT_SUPPORTED <pname> and then define
    the behaviour of all the other queries in terms of "supported internal
    formats".

    "base internal" formats, "generic compressed" formats and unsized
    formats (such as RGBA or RGB_COMPRESSED) are all possible, provided the
    implementation supports them for texture or image specification, and will 
    return appropriate information based on the internal format that the
    particular implementation would map them to internally if used as such.

    3 a) What if the combination of <target> and <pname> is invalid/nonsense
         (e.g. any texture related query on RENDERBUFFER)?
      b) What if the <target>/<pname> make sense, but the <internalformat>
         does not for that <pname> (e.g. COLOR_ENCODING for non-color internal
         format)?

    RESOLVED. If the combinations of parameters does not make sense the
    reponse best representing "not supported" or "not applicable" is returned
    as defined for each <pname>.
    In general:
     - size- or count-based queries will return zero,
     - support-, format- or type-based queries will return NONE,
     - boolean-based queries will return FALSE, and 
     - list-based queries return no entries.

    4) Should we expose a way for an implementation to describe what the
    caveats might be on a particular operation?

    RESOLVED. If ARB_debug_output or equivalent functionality is present
    and enabled, the caveat will be written to the debug output log.
    The message has the source DEBUG_SOURCE_API, the type 
    DEBUG_TYPE_PERFORMANCE, and an implementation-dependent ID.

    5) Do layers generalize in the MAX_COMBINED_DIMENSIONS? How do cube map
    faces and multisample resources work?

    RESOLVED.  Yes layers generalize in the MAX_COMBINED_DIMENSIONS, as do
    cube map faces and multiple samples.  
    The calculation for cube maps is: width x height x 6.
    The calculation for cube map arrays is: width x height x layers x 6.
    The calculation for 2D multisample arrays is: width x height x layers x samples.

    6) Is the READ_PIXELS query useful, should we replace it with
    READ_PIXELS_FORMAT and READ_PIXELS_TYPE, or have all three of them?

    RESOLVED. The READ_PIXELS_FORMAT and READ_PIXELS_TYPE queries have been
    added. READ_PIXELS still has value because an implementation may want
    to be able to report a caveat on the performance or lack of support.

    7) There some <pnames> which it makes no sense to be qualified by
    a per-format/target scope, how should we handle them? 
    e.g. MAX_WIDTH and MAX_HEIGHT might be the same for all formats.
    e.g. properties like AUTO_GENERATE_MIPMAP and MANUAL_GENERATE_MIPMAP might
     depend only on the GL version.

    DISCUSSION:
    A) Just use this entry point as is, if there are no per-format or
    target differences, it is perfectly acceptable to have the implementation
    return the same information for all valid parameters. This does
    allow implementations to report caveats that may exist for some
    formats but not others, even though all formats/targets may be supported.
    B) Introduce new entry point(s) which can report on some general 
    properties. 

    RESOLVED: Option A, just the one entry point. It doesn't hurt to
    give the implementation the ability to report more information.

    8) In GL 4.2 MAX_TEXTURE_3D_SIZE is 2048 (2^11) so the 
    MAX_COMBINED_DIMENSIONS could be as high as 2^11*2^11*2^11 = 2^33. 
    The MAX_TEXTURE_SIZE is 16384 (2^14) and MAX_ARRAY_TEXTURE_LAYERS is 
    2048 (2^11) so the MAX_COMBINED_DIMENSIONS could be 2^14*2^14*2^11 
    = 2^39. Thus it is possible for the combined dimensions to exceed 
    32-bits. What should be reported in cases like this?

    DISCUSSION: If the max combined size is great than 2^32, the resource
    could take at least 2^32 bytes or 4GB of memory. While it is currently
    unlikely that implementation would actually support resources of this 
    size, it is plausible that within a few years it would be possible to 
    exceed this with a single allocation. Possible alternatives:
    A) Saturate the reported value at a max of 2^31 (since <pname> is GLint).
    B) Add a 64-bit version of the query.
    C) Add a HI and LO query to allow generatation of a 64-bit value.
    D) Remove this query.
    E) use other units? (MB)

    Some other APIs have a maximum allocation size which may be 128 MB or
    1/4 or the dedicated VRAM. Option A is not very appealing since it
    limits the usefulness of the query when it is most needed. No interest
    in Option C. Option E is undesireable since it is too granular for
    lower-dimensioned resources. General consensus was either option B or D.

    RESOLVED: Option B is specified as it is expected that is query will
    be useful.

    9) Is a MULTISAMPLE query useful?

    RESOLVED: No. The same information can be obtained by querying if
    NUM_SAMPLE_COUNTS and checking if it is greater than zero.

   10) Is TEXTURE_SHADOW useful?

    RESOLVED: Yes. While DEPTH_COMPONENTS tells you if the texture has depth
    in it, some implementations may have caveats to report for shadow lookups.
    For example there may be caveats that depend on the depth size, or some
    hardware may not be able to do non-shadowed look ups and must emulate it
    in the shader. Additionally some versions of the API do not support
    shadow samplers.

   11) Do we need a list of interactions with all extensions?
   
    DISCUSSION: All pnames will always be supported, but return false/not-
    supported. Interactions with specific extensions and pnames will be
    noted in the interactions section.

   12) We have a way to query the component sizes and types, should we have
    a way to query the component orderings?

    RESOLVED. No. It is unclear what value this would add, and an
    implementation could already choose to expose this via the 
    TEXTURE_IMAGE_FORMAT and TEXTURE_IMAGE_TYPE queries.

   13) What does the value returned for the MAX_COMBINED_DIMENSIONS
    actually mean?  Does this mean that if you try to create a texture
    with more samples or texels than this it is guaranteed to fail
    (possibly with OUT_OF_MEMORY)? Or is it just a recommendation that
    says it might fail?

    RESOLVED. This is a recommendation for applications. There are 
    system-dependant reasons why allocations larger than this size may
    result in failures even if there might appear to be sufficient memory
    available when queried via some other means. At the same time, some
    systems may not have a single hard-limit on the allocation size and
    it may be a combination of hardware and/or software limitations.
    This value also does not a guarantee that allocations smaller than
    this will succeed because it does not factor in the current available
    memory. Applications should be able to reliably allocate resources
    that fall under this limit, providing there is sufficient memory
    available at the time of the allocation.

   14) Can we add some queries for various forms of buffer support, for
    example vertex attributes, element arrays or transform feedback? 
    Some implementations may have caveats they could report for some
    formats.

    RESOLVED: Deferred. While this is interesting, it is too late for
    this version. It is also unclear if we could use the current
    entry points which are more targetted at textures and renderbuffers
    and keyed off an <internalformat>.  We don't typically use an
    internalformat for buffers.

   15) Should we have separate values for FILTER, such as TEXTURE_MAG_FILTER
    and TEXTURE_MIN_FILTER?

    RESOLVED: No. The FITLER query is more about whether or not multi-texel
    filtering is directly supported. We don't expect implmentations to
    be able to support it for MIN filters but not for MAG, or vice versa.

   16) What should we do in cases where a command is defined in terms of
    GetTexLevelParameter, but GetTexLevelParameter doesn't support the target
    (eg TEXTURE_BUFFER in versions of GL prior to 3.1) or there is no
    corresponding pname (such as TEXTURE_STENCIL_TYPE)?

    RESOLVED: GetInternalFormat* should return the correct information for the
    specific query, it shouldn't be limited by the set of tokens that happen to
    be legal for GetTexLevelParameter. This was just used a method of
    reducing specification language duplication, and noting that the queries
    are effectively the same.

Revision History

    Rev.  Date        Author    Changes
    ----  ----------  --------  --------------------------------------------
     20   10/12/2018  dgkoch    Add tokens for ETC2/EAC and ASTC VIEW_CLASSES
                                as interactions with ARB_ES3_compatibility
                                and KHR_texture_compression_astc_ldr.
     19   02/14/2018  dgkoch    Add issue 16, clarify references to
                                GetTexLevelParameter (gitlab/opengl/api/65)
     18   07/15/2013  Jon Leech Remove redundant list of VIEW_CLASS_* tokens 
                                (Bug 10518).
     17   07/11/2013  Jon Leech Clarify relationship between VIEW_CLASS_*
                                tokens and ARB_texture_view (Bug 10518).
     16   07/26/2012  dgkoch    rename GENERATE_MIPMAP to MANUAL_GENERATE_MIPMAP 
                                for clarity and restore previous token (9330)
     15   07/24/2012  dgkoch    Fix several token values (bug 9325)
     14   07/20/2012  dgkoch    Add _ARB suffix to SRGB_DECODE
     13   07/17/2012  dgkoch    Finish adding extension/version interactions.
                                SRGB_DECODE is only valid if extension supported (bug 9293).
     12   07/10/2012  Jon Leech Change _BIT token names to _BITS (bug 9266).
     11   06/15/2012  dgkoch    Grammar fixes noticed in review (bug 9158).
     10   06/11/2012  dgkoch    Resolved Issue 13 and updated relevant spec language
                                Added Issue 14 and 15 and renamed some tokens (bug 9138)
     9    06/06/2012  dgkoch    renamed 64-bit query for consistency
                                Resolved Issue 8, and added a bit of related language.
                                Added Issue 13.
     8    05/07/2012  dgkoch    minor token renaming, misc wording improvements
                                started added extension interactions
     7    05/05/2012  dgkoch    added 64-bit entry point
                                allow any enum for internalformat
                                specify 'unsupported' responses for all queries
                                add errors
                                resolved issues as per Apr-12 F2F
                                added clear buffer, image and view related queries
     6    04/25/2012  dgkoch    remove MULTISAMPLE (redundant with NUM_SAMPLES > 0)
                                remove meta queries
                                add issues 9-11
                                added READ_PIXELS_FORMAT, READ_PIXELS_TYPE
                                added TEXTURE_IMAGE_FORMAT, TEXTURE_IMAGE_TYPE
                                added GET_TEXTURE_IMAGE_FORMAT, GET_TEXTURE_IMAGE_TYPE
                                changed ACTUAL_INTERNALFORMAT to PREFERRED_INTERNALFORMAT
                                added INTERNALFORMAT_x_SIZE/TYPE for 
                                  RED/GREEN/BLUE/ALPHA/DEPTH/STENCIL/SHARED
     5    04/05/2012  dgkoch    Update overview, issue 7.
     4    04/04/2012  dgkoch    Incorporate feedback from bmerry (Bug 8595)
     3    01/23/2012  dgkoch    Continue adding more details
     2    01/23/2012  dgkoch    Add more details
     1    10/13/2011  dgkoch    Initial draft

