Name

    EGL_ANGLE_feature_control

Name Strings

    EGL_ANGLE_feature_control

Contributors

    Jonah Ryan-Davis  (jonahr 'at' google.com)

Contact

    Jonah Ryan-Davis  (jonahr 'at' google.com)

Status

    Draft

Version

    Version 1, May 23, 2019

Number

    EGL Extension #XXX

Extension Type

    EGL client extension

Dependencies

    This extension is written against the wording of the EGL 1.5
    Specification.

    EGL_EXT_device_query affects the definition of this extension.

Overview

    This extension adds two methods to query arrays holding
    information about the available features for a given device.
    One method is used to query the total count of available
    features. Another method is used to query a string property
    of an individual feature given the feature's index.

IP Status

    No known claims.

New Types

    None.

New Procedures and Functions

    const char *eglQueryStringiANGLE(
        EGLDisplay dpy,
        EGLint name,
        EGLint index);

    EGLBoolean eglQueryDisplayAttribANGLE(
        EGLDisplay dpy,
        EGLint attribute,
        EGLAttrib *value);

New Tokens

    Accepted as a queried <name> in eglQueryStringiANGLE:

        EGL_FEATURE_NAME_ANGLE          0x3460
        EGL_FEATURE_CATEGORY_ANGLE      0x3461
        EGL_FEATURE_DESCRIPTION_ANGLE   0x3462
        EGL_FEATURE_BUG_ANGLE           0x3463
        EGL_FEATURE_STATUS_ANGLE        0x3464
        EGL_FEATURE_CONDITION_ANGLE     0x3468

    Accepted as a queried <attribute> in eglQueryDisplayAttribANGLE

        EGL_FEATURE_COUNT_ANGLE         0x3465

    Accepted as an attribute name in the <attrib_list> argument of
    eglGetPlatformDisplay

        EGL_FEATURE_OVERRIDES_ENABLED_ANGLE   0x3466
        EGL_FEATURE_OVERRIDES_DISABLED_ANGLE  0x3467

New Behavior

    The attribute following EGL_FEATURE_OVERRIDES_ENABLED_ANGLE or
    EGL_FEATURE_OVERRIDES_DISABLED_ANGLE should be of type char**,
    which should contain a null-terminated array of C strings naming
    the features to be enabled or disabled upon display creation.
    Any features unspecified in one of these arrays will be
    initialized with an internal heuristic.

Add the following to the end of section 3.3 "EGL Queries":

        const char *eglQueryStringiANGLE(EGLDisplay dpy,
            EGLint name, EGLint index);

    eGLQueryStringiANGLE returns a pointer to a static, null-
    terminated string describing some aspect of the EGL
    implementation running on the specified display, from an array of
    strings. name may be one of EGL_FEATURE_NAME_ANGLE,
    EGL_FEATURE_CATEGORY_ANGLE, EGL_FEATURE_DESCRIPTION_ANGLE,
    EGL_FEATURE_BUG_ANGLE, or EGL_FEATURE_STATUS_ANGLE. Index
    must be a valid index to access into the array of strings.
        The EGL_FEATURE_NAME_ANGLE array contains strings that
    describe the name of each feature available in the display.
        The EGL_FEATURE_CATEGORY_ANGLE array contains strings
    with corresponding indices to the array of names. Each string
    describes the category of the feature at the specified index.
        The EGL_FEATURE_DESCRIPTION_ANGLE array contains strings
    with corresponding indices to the array of names. Each string
    describes the feature at the specified index.
        The EGL_FEATURE_BUG_ANGLE array contains strings
    with corresponding indices to the array of names. Each string
    describes the bug related to the feature at the specified
    index.
        The EGL_FEATURE_STATUS_ANGLE array contains strings
    with corresponding indices to the array of names. Each string has
    the value "enabled" if the feature is currently enabled, or
    "disabled" if the feature is currently disabled.
        The EGL_FEATURE_CONDITION_ANGLE array contains strings that
    describe to the condition that sets the corresponding value in
    the EGL_FEATURE_STATUS_ANGLE array.

    Errors

    On failure, NULL is returned.
    An EGL_BAD_DISPLAY error is generated if dpy is not a valid
    display.
    An EGL_BAD_PARAMETER error is generated if name is not one of the
    values described above.
    An EGL_BAD_PARAMETER error is generated if index is not within
    the valid range of indices for the array.

Add a section "3.4 Display Attributes" after "3.3 EGL Versioning"

    To query attributes of an initialized display, use:

        EGLBoolean eglQueryDisplayAttribANGLE(EGLDisplay dpy,
                                            EGLint attribute,
                                            EGLAttrib *value);

    On success, EGL_TRUE is returned.
    If <attribute> is EGL_FEATURE_COUNT_ANGLE, the total count of
    available features is returned in <value>.

    On failure, EGL_FALSE is returned.
    An EGL_BAD_DISPLAY error is generated if dpy is not a valid
    display.
    An EGL_BAD_ATTRIBUTE error is generated if <attribute> is not a
    valid value.

Issues

    None

Revision History

    Version 1, May 23, 2019 (Jonah Ryan-Davis)
        - Initial Draft
