Name

    EXT_no_config_context

Name Strings

    GLX_EXT_no_config_context

Contributors

    Adam Jackson
    Kyle Brenneman
    James Jones
    Alex Goins

    This extension is derived from EGL_KHR_no_config_context, whose
    contributors include:

    Etay Meiri
    Alon Or-bach
    Jeff Vigil
    Ray Smith
    Michael Gold
    James Jones
    Daniel Kartch
    Adam Jackson
    Jon Leech

Contact

    Adam Jackson <ajax@redhat.com>

IP Status

    No known IP claims.

Status

    Complete.

Version

    Version 6, 2017/12/05

Dependencies

    GLX_ARB_create_context is required.

    Interacts with GLX_ARB_fbconfig_float.

    Interacts with GLX_EXT_fbconfig_packed_float.

    This extension is written against the GLX 1.4 Specification.

    Some of the capabilities of these extensions are only available when
    creating OpenGL or OpenGL ES contexts supporting specific versions or
    capabilities. All such restrictions are documented in the body of this
    extension specification.

Overview

    Modern GPUs allow contexts to render to almost any combination of
    supported color and auxiliary buffer formats. Traditionally GLX context
    creation is done with respect to a GLXFBConfig specifying buffer formats,
    and constrains contexts to only work with drawables created with a
    "compatible" config.

    This extension allows creation of GL & ES contexts without specifying a
    GLXFBConfig.

New Procedures and Functions

    None.

New Tokens

    None.

Additions to the GLX_ARB_create_context Specification

    To the paragraph beginning "If glXCreateContextAttribsARB succeeds",
    append:

    "If <config> is NULL, the context will be created without reference to a
    config. In this case, the attribute list must include GLX_SCREEN, naming
    the screen for the context; if GLX_SCREEN is not specified, or
    GLX_RENDER_TYPE is specified, BadValue is generated."

Additions to the GLX 1.4 Specification

    In section 2.1 "Rendering Contexts and Drawing Surfaces", modify the
    5th paragraph:

    "A rendering context can be used with any GLXDrawable that it is
    compatible with (subject to the restrictions discussed in the section on
    address space and the restrictions discussed under glXCreatePixmap). A
    drawable and context are compatible if either of the following sets of
    conditions are true:

    * The context was created with NULL GLXFBConfig

    * The drawable and context are on the same screen

    or:

    [...]"

    Append a new paragraph to the end of section 2.1 "Rendering Contexts
    and Drawing Surfaces":

    "If NULL was specified as the GLXFBConfig at creation, the resulting
    context is said to be created <without reference to a config>. In this
    case, the context must pass the required conformance tests for the version
    of OpenGL/OpenGL ES it supports, and must support being made current
    without a drawable. Such support is guaranteed for OpenGL ES 2.0
    implementations supporting the GL_OES_surfaceless_context extension,
    OpenGL ES 3.0 and later versions of OpenGL ES, and OpenGL 3.0 and later
    versions of OpenGL. Such contexts are compatible with any drawable on the
    same screen, though the version of OpenGL or OpenGL ES in use may impose
    further restrictions. For example, forward-compatible OpenGL 3.0 contexts
    can not render to color index drawables, even if color index GLXFBConfigs
    are available."

    In section 3.3.7 "Rendering Contexts" in the discussion of glXQueryContext,
    to the paragraph beginning "The values and types", append:

    "If the context was created without reference to a config, the value
    of GLX_RENDER_TYPE will be GLX_DONT_CARE, and the values of
    GLX_FBCONFIG_ID and GLX_VISUAL_ID_EXT will be None."

Interactions with GLX_ARB_fbconfig_float

    A context created without reference to a config may be used to render to
    drawables whose config has GLX_RGBA_FLOAT_BIT_ARB set.

Interactions with GLX_EXT_fbconfig_packed_float

    A context created without reference to a config may be used to render to
    drawables whose config has GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT set.

Errors

    No new error types are added.

GLX Protocol

    No new requests are added.

    For GLXCreateContextAttribsARB, normally the client library derives the
    <screen> field in the request from the specified fbconfig. When the
    fbconfig is NULL, the GLX_SCREEN attribute and the <screen> field must
    match, or BadValue is generated. This implies that the client library is
    responsible for pulling the screen number out of the attribute list, since
    glXCreateContextAttribsARB does not have an explicit screen parameter.

Issues

 1) Should non-conformant no-config contexts be allowed to be created?

    RESOLVED: No. We are not encouraging non-conformant contexts. This is
    not a change, in the sense that CreateContextAttribs already does not
    accept GLX_NON_CONFORMANT_CONFIG as an attribute.

    What is required is: a no-context config bound to a drawable whose
    config is conformant, or to no drawable, must be conformant.

 2) Are no-config contexts constrained to those GL & ES implementations
    which can support them?

    RESOLVED: Yes. ES2 + OES_surfaceless_context, ES 3.0, and GL 3.0 all
    support binding a context without a drawable. This implies that they
    don't need to know drawable attributes at context creation time.

    In principle, equivalent functionality could be possible with ES 1.x +
    OES_surfaceless_context. This extension makes no promises about that. An
    implementation wishing to reliably support this combination, or a similarly
    permissive combination for GL < 3.0, should indicate so with an additional
    GLX extension.

 3) For an OpenGL or OpenGL ES context created with no config, what is the
    initial state of GL_DRAW_BUFFER and GL_READ_BUFFER for the default
    framebuffer?

    RESOLVED: This is an implementation detail rather than a spec issue.
    glReadBuffer/glDrawBuffer have undefined results if called without a
    current context. The GL_DRAW_BUFFER and GL_READ_BUFFER are set on the
    first glXMakeCurrent call and can be updated in glReadBuffer and
    glDrawBuffers calls after that. Therefore, the attribute value with
    which the context is created is irrelevant from the point of view of the
    spec and is left up to the implementation.

 4) Can glXMakeCurrent alter the GL_DRAW_BUFFER and GL_READ_BUFFER state of
    the default framebuffer?

    RESOLVED: Yes, but only on the first call to glXMakeCurrent. The two
    relevant excerpts from the OpenGL 3.2 Core Profile Specification.
    From Section 4.2.1 Selecting a Buffer for Writing:

        For the default framebuffer, in the initial state the draw buffer
        for fragment color zero is BACK if there is a back buffer; FRONT if
        there is no back buffer; and NONE if no default framebuffer is
        associated with the context.

    From 4.3.3 Pixel Draw/Read State:

        For the default framebuffer, in the initial state the read buffer is
        BACK if there is a back buffer; FRONT if there is no back buffer;
        and NONE if no default framebuffer is associated with the context.

    Based on the above excerpts on the first call to glXMakeCurrent the
    GL_DRAW_BUFFER and GL_READ_BUFFER are set to: GL_NONE if the drawable is
    NULL, GL_BACK if the drawable is double buffered, GL_FRONT if the drawable
    is single buffered. Following calls to glReadBuffer and glDrawBuffers
    change the GL_DRAW_BUFFER and GL_READ_BUFFER attributes and these values
    persist even when the application change the current context.

 5) Should we add a glXCreateGenericContext which is the same as
    glXCreateContext but without the config parameter?

    RESOLVED: No.

 6) Can no-config contexts share state with contexts that have a config?

    RESOLVED: Yes, to the extent that the implementation would allow such
    sharing if the contexts had the same config and compatible attributes.

    GLX_ARB_create_context has this to say about the <share_context> parameter:

    "* If the server context state for <share_context> exists in an address
       space that cannot be shared with the newly created context, if
       <share_context> was created on a different screen than the one
       referenced by <config>, or if the contexts are otherwise incompatible
       (for example, one context being associated with a hardware device
       driver and the other with a software renderer), BadMatch is generated."

    For this extension, "otherwise incompatible" might include mismatched GL
    or ES versions, or versions that do not support making a context current
    without a drawable. (This list is not intended to be exhaustive.)

    Other extensions like GLX_ARB_create_context_no_error and
    GLX_ARB_create_context_robustness place additional restrictions on
    share context compatibility; this extension does not relax them.

 7) What drawable types can be made current with a no-config context?

    RESOLVED: Any drawable created relative to a supported config can be made
    current with a no-config context.

 8) Can you create a no-config context with glXCreate{,New}Context?

    RESOLVED: No. GLX contexts are per-screen. Although the corresponding
    requests include the screen number, there is no way to specify it from
    the function signature, the client library derives it from the visual
    or the fbconfig. Only glXCreateContextAttribsARB is expressive enough.

 9) Can you specify a no-config context with a specific GLX_RENDER_TYPE?

    RESOLVED: No. It might be possible to implement, but there seems to be
    little point.

Revision History

    Version 7, 2017/12/05 (Adam Jackson)
    - Mark complete.

    Version 6, 2017/10/04 (Adam Jackson)
    - Clarify the float fbconfig extension interaction language

    Version 5, 2017/10/03 (Adam Jackson)
    - s/GLX_NO_CONFIG_EXT/NULL/
    - s/surface/drawable/
    - Plain GL 3.0 doesn't fully drop color index, forward-compatible 3.0 does
    - Clarify the interaction with non-conformant configs
    - Reword references to "client API", which is an EGLism
    - Add disclaimers about creating or sharing state with ES1 or GL<3 contexts
    - Miscellaneous typo fixes

    Version 4, 2017/09/26 (Adam Jackson)
    - Tighten the GLX protocol to require the two screen numbers to match

    Version 3, 2017/09/21 (Adam Jackson)
    - Restrict no-config contexts to glXCreateContextAttribsARB
    - Add the GLX_VISUAL_ID_EXT case to glXQueryContext
    - Forbid no-config contexts with a specific render type
    - Get the screen from the attribute list not the <screen> request field

    Version 2, 2017/09/21 (Adam Jackson)
    - Add the GLX_FBCONFIG_ID case to glXQueryContext
    - Document the GLX protocol encoding

    Version 1, 2017/09/20 (Adam Jackson)
    - Clone from version 9 of EGL_KHR_no_config_context
