Name

    QCOM_driver_control

Name Strings

    GL_QCOM_driver_control

Contributors

    Maurice Ribble
    Mikko Nurmi

Contact

    Maurice Ribble (mribble 'at' qualcomm.com)

Status

    Incomplete.

Version

    Last Modified Date: May 5, 2009
    Revision: #0.3

Number

    OpenGL ES Extension #55

Dependencies

    OpenGL ES 1.0 or higher is required.

    This extension is written based on the wording of the OpenGL ES 2.0
    specification.

Overview

    This extension exposes special control features in a driver to a
    developer. A use of these controls would be to override state or
    implement special modes of operation. One common example might be an
    IFH or infinitely fast hardware mode. In this mode none of draw
    commands would be sent to the GPU so no image would be displayed,
    but all the driver software overhead would still happen thus
    enabling developers to analyze driver overhead separate from GPU
    performance. Some uses of this extension could invalidate future
    rendering and thus should only be used by developers for debugging
    and performance profiling purposes.

    The extension is general enough to allow the implementation to
    choose which controls to expose and to provide a textual description
    of those controls to developers.

Issues

    None.

New Procedures and Functions

    void GetDriverControlsQCOM(int *num, sizei size, uint *driverControls)

    void GetDriverControlStringQCOM(uint driverControl,
                                   sizei bufSize,
                                   sizei *length,
                                   char *driverControlString)

    void EnableDriverControlQCOM(uint driverControl)

    void DisableDriverControlQCOM(uint driverControl)

New Tokens

    None.

Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)

    Add a new section "Driver Control":

    The command

        void GetDriverControlsQCOM(int *num, sizei size, uint *driverControls)

    returns the number of available driver controls in <num>, if <num>
    is not NULL. If <size> is not 0 and <driverControls> is not NULL,
    then the list of available driver controls is returned. The number
    of entries that will be in <driverControls> is determined by <size>.
    If <size> is 0, no information is copied. Each driver control is
    identified by a unique unsigned int identifier.

    The command

        void GetDriverControlStringQCOM(uint driverControl,
                                       sizei bufSize,
                                       sizei *length,
                                       char *driverControlString)

    returns the string that describes the driver control identified by
    <driverControl> in <driverControlString>. The first part of this
    string is a unique identifying name for the driver control. A space
    signifies the end of this name. It is encouraged that implementers
    not change the name so that developers can key off this name for
    their implementation. The actual number of characters written to
    <driverControlString>, excluding the null terminator, is returned in
    <length>. If <length> is NULL, then no length is returned. The
    maximum number of characters that may be written into
    <driverControlString>, including the null terminator, is specified
    by <bufSize>. If <bufSize> is 0 and <driverControlString> is NULL,
    the number of characters that would be required to hold the
    driverControl string, excluding the null terminator, is returned in
    <length>. If <driverControl> does not reference a valid
    driverControl ID, an INVALID_VALUE error is generated.

    The command

        void EnableDriverControlQCOM(uint driverControl)

    enables a driver control.

        void DisableDriverControlQCOM(uint driverControl)

    disables a driver control.


GLX Protocol

    None.

Errors

    INVALID_VALUE error will be generated if the <driverControl>
    parameter to GetDriverControlStringQCOM, EnableDriverControlQCOM or
    DisableDriverControlQCOM does not reference a valid driver control
    ID.

New State

    None.


Revision History
    11/10/2008 - Maurice Ribble
       + Initial version written.
    03/19/2009 - Maurice Ribble
       + Change from AMD to Qualcomm extension for publication
    05/05/2009 - Jon Leech
       + Reflow paragraphs and assign extension number.
