Name

    QCOM_extended_get

Name Strings

    GL_QCOM_extended_get

Contributors

    Jukka Liimatta
    James Ritts

Contact

    Jukka Liimatta (jukka.liimatta 'at' qualcomm.com)

Notice

    Copyright Qualcomm 2009.

IP Status

    Qualcomm Proprietary.

Status

    Complete.

Version

    Last Modified Date: May 14, 2009
    Revision: #1

Number

    OpenGL ES Extension #62

Dependencies

    OpenGL ES 1.0 or higher is required.

Overview

    This extension enables instrumenting the driver for debugging of OpenGL ES 
    applications.

New Procedures and Functions

    void ExtGetTexturesQCOM(uint* textures,
                            int maxTextures,
                            int* numTextures);

    void ExtGetBuffersQCOM(uint* buffers,
                           int maxBuffers,
                           int* numBuffers);

    void ExtGetRenderbuffersQCOM(uint* renderbuffers,
                                 int maxRenderbuffers,
                                 int* numRenderbuffers);

    void ExtGetFramebuffersQCOM(uint* framebuffers,
                                int maxFramebuffers,
                                int* numFramebuffers);

    void ExtGetTexLevelParameterivQCOM(uint texture, enum face, int level,
                                       enum pname, int* params);

    void ExtTexObjectStateOverrideiQCOM(enum target, enum pname, int param);

    void ExtGetTexSubImageQCOM(enum target, int level,
                               int xoffset, int yoffset, int zoffset,
                               sizei width, sizei height, sizei depth,
                               enum format, enum type, void *texels);

    void ExtGetBufferPointervQCOM(enum target, void **params)

New Tokens

    Accepted by the <pname> parameter of ExtGetTexLevelParameterivQCOM

        TEXTURE_WIDTH_QCOM                         0x8BD2
        TEXTURE_HEIGHT_QCOM                        0x8BD3
        TEXTURE_DEPTH_QCOM                         0x8BD4
        TEXTURE_INTERNAL_FORMAT_QCOM               0x8BD5
        TEXTURE_FORMAT_QCOM                        0x8BD6
        TEXTURE_TYPE_QCOM                          0x8BD7
        TEXTURE_IMAGE_VALID_QCOM                   0x8BD8
        TEXTURE_NUM_LEVELS_QCOM                    0x8BD9
        TEXTURE_TARGET_QCOM                        0x8BDA
        TEXTURE_OBJECT_VALID_QCOM                  0x8BDB

    Accepted by the <target> parameter of ExtTexObjectStateOverrideiQCOM

        TEXTURE_2D
        TEXTURE_CUBE_MAP
        TEXTURE_3D_OES
        TEXTURE_EXTERNAL_OES

    Accepted by the <pname> parameter of ExtTexObjectStateOverrideiQCOM

        STATE_RESTORE                              0x8BDC
        TEXTURE_MIN_FILTER
        TEXTURE_MAG_FILTER
        TEXTURE_WIDTH_QCOM
        TEXTURE_HEIGHT_QCOM
        TEXTURE_DEPTH_QCOM

    Accepted by the <target> parameter of ExtGetTexSubImageQCOM

        TEXTURE_2D
        TEXTURE_3D
        TEXTURE_CUBE_MAP_POSITIVE_X
        TEXTURE_CUBE_MAP_NEGATIVE_X
        TEXTURE_CUBE_MAP_POSITIVE_Y
        TEXTURE_CUBE_MAP_NEGATIVE_Y
        TEXTURE_CUBE_MAP_POSITIVE_Z
        TEXTURE_CUBE_MAP_NEGATIVE_Z

    Accepted by the <format> parameter of ExtGetTexSubImageQCOM

        ALPHA
        LUMINANCE
        LUMINANCE_ALPHA
        RGB
        RGBA
        ATC_RGB_AMD
        ATC_RGBA_EXPLICIT_ALPHA_AMD
        ATC_RGBA_INTERPOLATED_ALPHA_AMD

    Accepted by the <type> parameter of ExtGetTexSubImageQCOM

        UNSIGNED_BYTE
        UNSIGNED_SHORT_5_6_5
        UNSIGNED_SHORT_5_5_5_1
        UNSIGNED_SHORT_4_4_4_4
        HALF_FLOAT_OES
        FLOAT

    Accepted by the <target> parameter of ExtGetBufferPointervQCOM

        ARRAY_BUFFER
        ELEMENT_ARRAY_BUFFER

Additions to OpenGL ES 1.1 Specification

    The command

        void ExtGetTexturesQCOM(uint* textures,
                                int maxTextures,
                                int* numTextures);

    returns list of texture objects in the current render context.

    The command

        void ExtGetBuffersQCOM(uint* buffers,
                               int maxBuffers,
                               int* numBuffers);

    returns list of buffer objects in the current render context.

    The command

        void ExtGetRenderbuffersQCOM(uint* renderbuffers,
                                     int maxRenderbuffers,
                                     int* numRenderbuffers);

    returns list of render buffer objects in the current render context.

    The command

        void ExtGetFramebuffersQCOM(uint* framebuffers,
                                    int maxFramebuffers,
                                    int* numFramebuffers);

    returns list of frame buffer objects in the current render context.

    The command

        void ExtGetTexLevelParameterivQCOM(uint texture, enum face, int level,
                                           enum pname, int* params);

    returns parameters for texture level chosen with <texture>, <face> and 
    <level>.

    The command

        void ExtTexObjectStateOverrideiQCOM(enum target, enum pname, int param);

    overrides texture parameter for current texture in the <target>. The state 
    chosen with the <pname> argument is restored with <param> value 
    STATE_RESTORE. The STATE_RESTORE has the same effect as calling 
    TexParameteri(enum target, enum pname, int param).

    The command

        void ExtGetTexSubImageQCOM(enum target, int level,
                                   int xoffset, int yoffset, int zoffset,
                                   sizei width, sizei height, sizei depth,
                                   enum format, enum type, void *texels);

    copies texels from current texture in <target> to address in <texels> 
    parameter.

    The command

        void ExtGetBufferPointervQCOM(enum target, void **params)

    returns pointer to the buffer chosen with <target>.

Errors

    INVALID_VALUE error will be generated if the <texture> parameter to
    ExtGetTexLevelParameterivQCOM does not reference to a valid texture object.

    INVALID_ENUM error will be generated if the <texture> parameter to
    ExtGetTexLevelParameterivQCOM does not reference to a valid texture target.

    INVALID_VALUE error will be generated if the <face> parameter to cubemap 
    texture target in ExtGetTexLevelParameterivQCOM is not one of the allowable 
    values.

    INVALID_VALUE error will be generated if the texture <level> parameter to
    ExtGetTexLevelParameterivQCOM is not one of the allowable values.

    INVALID_ENUM error will be generated if the <pname> parameter to
    ExtGetTexLevelParameterivQCOM is not one of the allowable values.

    INVALID_ENUM error will be generated if the <target> parameter to
    ExtGetTexSubImageQCOM is not one of the allowable values.

    INVALID_ENUM error will be generated if the <target> parameter to
    ExtGetTexSubImageQCOM does not reference to a valid texture object.

    INVALID_VALUE error will be generated if the selected region to
    ExtGetTexSubImageQCOM is not inside the texture.

    INVALID_VALUE error will be generated if the <level> parameter to
    ExtGetTexSubImageQCOM does not reference to a valid texture level.

    INVALID_ENUM error will be generated if the <format> or <type> parameters to
    ExtGetTexSubImageQCOM are not one of the allowable values.

    INVALID_ENUM error will be generated if the <target> parameter to
    ExtGetBufferPointervQCOM is not one of the allowable values.

New State

    None.

Revision History

    #01    05/14/2009    Jukka Liimatta       First draft.
