Name

    WGL_ARB_create_context
    WGL_ARB_create_context_profile

Name Strings

    WGL_ARB_create_context
    WGL_ARB_create_context_profile

Contact

    Jon Leech (jon 'at' alumni.caltech.edu)
    Michael Gold, NVIDIA (gold 'at' nvidia.com)

Notice

    Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

IP Status

    No known IP claims.

Status

    Complete. Approved by the ARB on July 28, 2009.
    Approved by the Khronos Board of Promoters on August 28, 2009.

Version

    July 28, 2009 (version 20)

Number

    ARB Extension #55 (WGL_ARB_create_context)
    ARB Extension #74 (WGL_ARB_create_context_profile)

Dependencies

    WGL_ARB_extensions_string is required.

    The presence of an OpenGL 3.2 or later implementation determines
    whether or not WGL_ARB_create_context_profile is required.

Overview

    With the advent of new versions of OpenGL which deprecate features
    and/or break backward compatibility with older versions, there is a
    need and desire to indicate at context creation which interface will
    be used. These extensions add a new context creation routine with
    attributes specifying the GL version and context properties
    requested for the context, and additionally add an attribute
    specifying the GL profile requested for a context of OpenGL 3.2 or
    later.

New Procedures and Functions

    HGLRC wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext,
                                     const int *attribList)

New Tokens

    Accepted as an attribute name in <*attribList>:

        WGL_CONTEXT_MAJOR_VERSION_ARB           0x2091
        WGL_CONTEXT_MINOR_VERSION_ARB           0x2092
        WGL_CONTEXT_LAYER_PLANE_ARB             0x2093
        WGL_CONTEXT_FLAGS_ARB                   0x2094
        WGL_CONTEXT_PROFILE_MASK_ARB            0x9126

    Accepted as bits in the attribute value for WGL_CONTEXT_FLAGS in
    <*attribList>:

        WGL_CONTEXT_DEBUG_BIT_ARB               0x0001
        WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB  0x0002

    Accepted as bits in the attribute value for
    WGL_CONTEXT_PROFILE_MASK_ARB in <*attribList>:

        WGL_CONTEXT_CORE_PROFILE_BIT_ARB        0x00000001
        WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002

    New errors returned by GetLastError:

        ERROR_INVALID_VERSION_ARB               0x2095
        ERROR_INVALID_PROFILE_ARB               0x2096

Additions to the OpenGL / GLX / GLX Protocol Specificaitons

    None. This specification is written for WGL.

Additions to the WGL specification

    Context Creation
    ----------------

    To create an OpenGL rendering context, call

    HGLRC wglCreateContextAttribsARB(HDC hDC, HGLRC hshareContext,
                                     const int *attribList);

    If wglCreateContextAttribsARB succeeds, it initializes the context
    to the initial state defined by the OpenGL specification, and
    returns a handle to it. The handle can be used (via wglMakeCurrent
    or wglMakeContextCurrentARB) with any HDC sharing the same pixel
    format as <hDC>, and created on the same device, subject to
    constraints imposed by the API version.

    If <hshareContext> is not 0, then all shareable data (excluding
    OpenGL texture objects named 0) will be shared by <hshareContext>,
    all other contexts <hshareContext> already shares with, and the
    newly created context. An arbitrary number of contexts can share
    data in this fashion.

    <attribList> specifies a list of attributes for the context. The
    list consists of a sequence of <name,value> pairs terminated by the
    value 0. If an attribute is not specified in <attribList>, then the
    default value specified below is used instead. If an attribute is
    specified more than once, then the last value specified is used.

    <attribList> may be NULL or empty (first attribute is 0), in which
    case all attributes assume their default values as described below.

    The attribute names WGL_CONTEXT_MAJOR_VERSION_ARB and
    WGL_CONTEXT_MINOR_VERSION_ARB request an OpenGL context supporting
    the specified version of the API. If successful, the context
    returned must be backwards compatible with the context requested.
    Backwards compatibility is determined as follows:

    If a version less than or equal to 3.0 is requested, the context
    returned may implement any of the following versions:

      * Any version no less than that requested and no greater than 3.0.
      * Version 3.1, if the GL_ARB_compatibility extension is also
        implemented.
      * The compatibility profile of version 3.2 or greater.

    If version 3.1 is requested, the context returned may implement
    any of the following versions:

      * Version 3.1. The GL_ARB_compatibility extension may or may not
        be implemented, as determined by the implementation.
      * The core profile of version 3.2 or greater.

    If version 3.2 or greater is requested, the context returned may
    implement any of the following versions:

      * The requested profile of the requested version.
      * The requested profile of any later version, so long as no
        features have been removed from that later version and profile.

    Querying the GL_VERSION string with glGetString (or the
    GL_MAJOR_VERSION and GL_MINOR_VERSION values with glGetIntegerv, in
    a 3.0 or later context) will return the actual version supported by
    a context.

    The default values for WGL_CONTEXT_MAJOR_VERSION_ARB and
    WGL_CONTEXT_MINOR_VERSION_ARB are 1 and 0 respectively. In this
    case, implementations will typically return the most recent version
    of OpenGL they support which is backwards compatible with OpenGL 1.0
    (e.g. 3.0, 3.1 + GL_ARB_compatibility, or 3.2 compatibility profile)

    The attribute name WGL_CONTEXT_PROFILE_MASK_ARB requests an OpenGL
    context supporting a specific <profile> of the API. If the
    WGL_CONTEXT_CORE_PROFILE_BIT_ARB bit is set in the attribute value,
    then a context implementing the <core> profile of OpenGL is
    returned. If the WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB bit is
    set, then a context implementing the <compatibility> profile is
    returned. If the requested OpenGL version is less than 3.2,
    WGL_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality of the
    context is determined solely by the requested version.

    Querying the value of GL_CONTEXT_PROFILE_MASK with glGetIntegerv
    will return the profile mask used to create the context. This query
    is only supported in an OpenGL 3.2 or later context.

    The default value for WGL_CONTEXT_PROFILE_MASK_ARB is
    WGL_CONTEXT_CORE_PROFILE_BIT_ARB. All OpenGL 3.2 implementations are
    required to implement the core profile, but implementation of the
    compatibility profile is optional.

    If the core profile is requested, then the context returned cannot
    implement functionality defined only by the compatibility profile.

    The attribute name WGL_CONTEXT_LAYER_PLANE specifies the layer plane
    that the rendering context is bound to. The attribute value has the
    same meaning and allowed values as the <iLayerPlane> parameter of
    wglCreateLayerContext. The default value for WGL_CONTEXT_LAYER_PLANE
    is 0 (the main plane).

    The attribute name WGL_CONTEXT_FLAGS_ARB specifies a set of flag
    bits affecting the rendering context.

    If the WGL_CONTEXT_DEBUG_BIT_ARB flag bit is set in
    WGL_CONTEXT_FLAGS_ARB, then a <debug context> will be created. Debug
    contexts are intended for use during application development, and
    provide additional runtime checking, validation, and logging
    functionality while possibly incurring performance penalties. The
    additional functionality provided by debug contexts may vary
    according to the implementation(fn). In some cases a debug context
    may be identical to a non-debug context.
        [fn: The ARB Ecosystem TSG is still defining the expected and
        required features of debug contexts.]

    If the WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB is set in
    WGL_CONTEXT_FLAGS_ARB, then a <forward-compatible> context will be
    created. Forward-compatible contexts are defined only for OpenGL
    versions 3.0 and later. They must not support functionality marked
    as <deprecated> by that version of the API, while a
    non-forward-compatible context must support all functionality in
    that version, deprecated or not.

    The default value of WGL_CONTEXT_FLAGS_ARB is 0.

    On failure wglCreateContextAttribsARB returns NULL. Extended error
    information can be obtained with GetLastError. Conditions that cause
    failure include:

  * If attributes WGL_CONTEXT_MAJOR_VERSION_ARB and
    WGL_CONTEXT_MINOR_VERSION_ARB, when considered together with
    WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, specify an OpenGL version
    and feature set that are not defined, then ERROR_INVALID_VERSION_ARB
    is generated.

    The defined versions of OpenGL at the time of writing are OpenGL
    1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 2.1, 3.0, 3.1, and 3.2. Feature
    deprecation was introduced with OpenGL 3.0, so forward-compatible
    contexts may only be requested for OpenGL 3.0 and above. Thus,
    examples of invalid combinations of attributes include:

      - Major version < 1 or > 3
      - Major version == 1 and minor version < 0 or > 5
      - Major version == 2 and minor version < 0 or > 1
      - Major version == 3 and minor version > 2
      - Forward-compatible flag set and major version < 3

    Because the purpose of forward-compatible contexts is to allow
    application development on a specific OpenGL version with the
    knowledge that the app will run on a future version, context
    creation will fail if WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB is set
    and the context version returned cannot implement exactly the
    requested version.

  * If attribute WGL_CONTEXT_PROFILE_MASK_ARB has no bits set; has any
    bits set other than WGL_CONTEXT_CORE_PROFILE_BIT_ARB and
    WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; has more than one of
    these bits set; or if the implementation does not supported the
    requested profile, then ERROR_INVALID_PROFILE_ARB is generated.

  * If <hShareContext> is neither zero nor a valid context handle, then
    ERROR_INVALID_OPERATION is generated.

  * If <hDC> is not a valid device context handle, then
    ERROR_DC_NOT_FOUND is generated.

  * If the pixel format associated with <hDC> does not support OpenGL
    contexts providing the requested API major and minor version,
    forward-compatible flag, and/or debug context flag, then
    ERROR_INVALID_PIXEL_FORMAT is generated.

  * If the OpenGL server context state for <hShareContext> exists in an
    address space that cannot be shared with the newly created context,
    if <shareContext> was created on a different device context than the
    one referenced by <hDC>, 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), then
    ERROR_INVALID_OPERATION is generated.

  * If the server does not have enough resources to allocate the new
    context, then ERROR_NO_SYSTEM_RESOURCES is generated.

  * If an unrecognized attribute is present in <attribList>,
    then ERROR_INVALID_PARAMETER is generated.

    Legacy Context Creation
    -----------------------

    When this extension is supported, calling

        wglCreateContext(hdc)

    is equivalent to calling

        wglCreateContextAttribs(hdc,0,NULL).

    Calling

        wglCreateLayerContext(hdc,layer)

    is equivalent to calling

        wglCreateContextAttribs(hdc, 0,
                                { WGL_CONTEXT_LAYER_PLANE, layer, 0 }) .

    The legacy context creation routines can only return OpenGL 3.1
    contexts if the GL_ARB_compatibility extension is supported, and can
    only return OpenGL 3.2 or greater contexts implementing the
    compatibility profile. This ensures compatibility for existing
    applications. However, 3.0-aware applications are encouraged to use
    wglCreateContextAttribsARB instead of the legacy routines.

    Binding a Context to a Surface
    ------------------------------

    (add to the description of wglMakeCurrent and
    wglMakeContextCurrentARB)

   "If the OpenGL context version of <hglrc> is 3.0 or above, and if
    either the <hdc> parameter of wglMakeCurrent is NULL, or both of the
    <hDrawDC> and <hReadDC> parameters of wglMakeContextCurrentARB are
    NULL, then the context is made current, but with no default
    framebuffer defined. The effects of having no default framebuffer on
    the GL are defined in Chapter 4 of the OpenGL 3.0 Specification.

    The first time <ctx> is made current, the viewport and scissor
    dimensions are set to the size of the draw drawable (as though
    glViewport(0,0,w,h) and glScissor(0,0,w,h) were called, where <w>
    and <h> are the width and height of the drawable, respectively). If
    the first time <ctx> is made current, it is without a default
    framebuffer, then the viewport and scissor regions are set as though
    glViewport(0,0,0,0) and glScissor(0,0,0,0) were called."
    However, the viewport and scissor dimensions are not modified when
    <ctx> is subsequently made current; it is the client's
    responsibility to reset the viewport and scissor in this case."

    Sharing Objects Between Contexts
    --------------------------------

    (add to the description of wglShareLists)

    Future versions of OpenGL may only support being added to a share
    group at context creation time. Specifying such a version of a
    context as either the <hglrc1> or <hglrc2> arguments to
    wglShareLists will fail. wglShareLists will return FALSE, and
    GetLastError will return ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB.

Dependencies on WGL_ARB_extensions_string

    Because there is no way to extend wgl, these calls are defined in
    the ICD and can be called by obtaining the address with
    wglGetProcAddress. Because this extension is a WGL extension, it is
    not included in the GL_EXTENSIONS string. Its existence can be
    determined with the WGL_ARB_extensions_string extension.

Dependencies on WGL_ARB_create_context

    If WGL_ARB_create_context_profile is supported, then
    WGL_ARB_create_context must also be supported.

Dependencies on OpenGL 3.2 and later OpenGL versions

    If WGL_ARB_create_context is supported, and if the OpenGL
    implementation supports OpenGL 3.2 or later, then
    WGL_ARB_create_context_profile must also be supported. If the OpenGL
    implementation does not support OpenGL 3.2 or later, then
    WGL_ARB_create_context_profile may or may not be supported.

    If WGL_ARB_create_context_profile is not supported, then the
    WGL_CONTEXT_PROFILE_MASK_ARB attribute, the
    WGL_CONTEXT_CORE_PROFILE_BIT_ARB and
    WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB bits in that attribute,
    and the ERROR_INVALID_PROFILE_ARB error are not defined, and
    specifying the attribute in <attribList> attribute will generate an
    error.

New State

    None

New Implementation Dependent State

   None

Conformance Tests

    TBD

Sample Code

    TBD

Issues

 1) Can different GL context versions share data?

    PROPOSED: Yes, with restrictions as defined by the supported feature
    sets. For example, program and shader objects cannot be shared with
    OpenGL 1.x contexts, which do not support them.

    NOTE: When the new object model is introduced, sharing must be
    established at creation time, since the object handle namespace is
    also shared. wglShareLists would therefore fail if either context
    parameter to it were to be a context supporting the new object
    model.

 2) Should we introduce a token WGL_NONE to terminate attribute lists,
    instead of using the value 0, by analogy to GLX and EGL?

    RESOLVED: No.

 3) Should all GL context versions be able to bind to all the same pixel
    formats?

    RESOLVED: unlike EGL, we don't expose the version restriction in the
    pixel format. Instead, wglMakeCurrent may fail when binding contexts
    to surfaces if the surface type is unrecognized by that context
    version. No specific examples exist at present, but in a
    hypothetical future version of the API supporting only the new
    object model, such an API probably could not bind to pbuffer
    surfaces.

 4) Should there be a way to make a context current without binding
    it to a window system drawable at the same time?

    RESOLVED: Yes, but only in OpenGL 3.0 and later. This results in a
    context with an invalid default framebuffer, the meaning of which is
    defined in the OpenGL 3.0 specification.

    NOTE: Apparently on Windows, opengl32.dll makes use of the drawable
    argument to identify the namespace of the driver, so we may not be
    able to work around it.

 5) Should we add a token to the attrib list for pixel format selection
    to indicate the GL context version, instead of introducing a new
    entry point for context creation?

    RESOLVED: No. We want pixel formats to be portable between
    feature-incompatible context versions, so that drawables and GL
    objects that make sense to share, may be shared between such
    contexts. This is important for code migration and backward
    compatibility.

 6) Do we need a "can be shared" parameter at context creation time?

    RESOLVED: No. All contexts have potential to share objects (whether
    they actually can share depends on context version and feature sets,
    and the address space they're created in). Savings from saying a
    context cannot share objects are unclear but probably minimal. Such
    a parameter would default to TRUE if it existed.

 7) How are "debug contexts" created?

    RESOLVED: by specifying the WGL_CONTEXT_DEBUG_BIT_ARB flag in the
    WGL_CONTEXT_FLAGS_ARB attribute value.

    DISCUSSION: For the most part, the behavior of debug contexts is
    being determined by the ARB Ecosystem TSG. However, whatever their
    behavior, it's clear that "debug contexts" may differ at a basic
    level from regular contexts. Debug contexts might even go down a
    completely separate driver path. So it's essential to know at
    context creation time if a debug context is required.

 8) Is wglCreateContextVersion a good name?

    Ian Romanick suggests wglCreateContextAttribs instead. Changed in
    version 12.

 9) Should the context version be named with separate major and minor
    number attributes, or as a single (major*100 + minor*10) number as
    in GLSL (e.g. version == 220 <-> major = 2, minor = 2)?

    John Kessenich argues for consistency with the existing GLSL naming
    scheme.

10) How are profiles specified? Why is the profile attribute a bitmask
    rather than an enum?

    RESOLVED: Profiles are specified as individual bits passed in a
    bitmask attribute. This attribute is ignored unless the OpenGL
    version requested defines profiles (OpenGL 3.2 and later). While
    only a single profile can be specified today, it is not unlikely
    that eventually there will be profiles defined than can be
    implemented in the same context. In that case we will need to be
    able to specify multiple profiles at context creation and in the GL
    context profile query, for which a bitmask is appropriate.

11) Why is the value of WGL_CONTEXT_PROFILE_MASK_ARB in the GL
    core enumerant range?

    RESOLVED: The token value for the context profile mask and for the
    context profile bits should be shared by GL, GLX, and WGL to ease
    implementation and reduce programming errors. These values are drawn
    from the GL token ranges.

12) What errors can result from requesting a profile?

    RESOLVED: Only a single profile can currently be requested.
    Requesting no profile, more than one profile, or an unrecognized
    profile are all errors.

13) How does the profile request interact with older GL versions?

    RESOLVED: It does not. The profile mask is ignored unless the
    requested GL version is >= 3.2.

    DISCUSSION: Bruce had proposed using the profile mask to control
    whether or not GL_ARB_compatibility was provided in earlier GL
    versions, but general feeling was that apps had already had to sort
    this out, and it's difficult to see how to define a default value
    that can always be implemented (core profile) without changing the
    existing behavior of wglCreateContextAttribsARB on implementations
    which implement GL_ARB_compatibility by default when an OpenGL 3.1
    context is requested.

14) How does the profile request interact with the forward compatibility
    bit?

    RESOLVED: Nothing special need be done here. If the forward
    compatibility bit is set, the returned context must not implement
    deprecated functionality in that profile (nothing is deprecated
    from the OpenGL 3.2 compatibility profile, so a forward-compatible
    compatibility profile has exactly the same functionality as
    a non-forward-compatible compatibility profile, while a
    forward-compatible core profile would leave out only the handful
    of features - wide lines and two queries - deprecated from core
    OpenGL 3.2).

15) How is context sharing between contexts of different versions
    handled?

    RESOLVED: It's up to the implementation whether or not to allow
    this, and to define behavior when shared objects include state or
    behaviors not described by one of the contexts sharing them (for
    example, textures with nonzero width borders shared by 3.2 core and
    compatibility profile contexts).

16) Is the GL_ARB_compatibility extension equivalent to the
    compatibility profile?

    RESOLVED: No. The extension refers specifically to functionality
    removed from OpenGL 3.1 and restored by this extension. The
    compatibility profile also restores this functionality, but may
    define additional interactions between new features in version 3.N
    and the functionality removed in OpenGL 3.1.

    In other words, the extension is a subset of the compatibility
    profile. A context implementing the compatibility profile for OpenGL
    3.2 or greater may (and probably will) choose to export
    GL_ARB_compatibility, but this is not required.

17) If the core profile is requested, what additional functionality
    can be provided?

    RESOLVED: Functionality defined only by the compatibility profile
    cannot be implemented by a context supporting the core profile. For
    example, if a 3.2 core profile is requested, that context cannot
    implement the GL_ARB_compatibility extension. However, any desired
    new functionality may be exposed via vendor or ARB extensions in the
    normal fashion.


Revision History

    Version 20, 2009/07/28 - Correct issue 14 to note that the 3.2
    compatibility profile does not deprecated anything.

    Version 19, 2009/07/27 - Add profiled context creation functionality
    (WGL_CONTEXT_PROFILE_MASK_ARB and the associated bit tokens, error
    code, and issues 10-16). Clarify that if the core profile is
    requested, the returned context cannot restore functionality from
    the compatibility profile (issue 17 and corresponding spec
    language). Add ERROR_INVALID_PARAMETER error if an unrecognized
    attribute is specified. Specify the interdependencies between the
    two WGL extensions defined here and OpenGL 3.2, including the
    requirement that WGL_ARB_create_context_profile be supported if an
    OpenGL 3.2 or later implementation is supported.

    Version 18, 2009/07/24 - Specify that repeated attribute values
    always result in the last specified value being used.

    Version 17, 2009/07/23 - Update the extension to clarify
    interactions with OpenGL 3.1 and greater, allow returning 3.0 and
    greater contexts from the legacy context creation routines so long
    as they're backwards compatible, and mandate that requesting a
    forward-compatible context always return exactly the requested
    version (bugs 5112, 5349).

    Version 16, 2008/08/21 - Add initial viewport/scissor setting
    behavior (cloned from GLX, including the case when no default
    framebuffer is made current.

    Version 15, 2008/08/10 - Assign enumerant values and extension
    number.

    Version 14, 2008/07/10 - Add trailing zero to array attributes in
    wglCreateLayerContext example (Pat Brown).

    Version 13, 2008/07/03 - Update versioning behavior so asking for <=
    2.1 will return <= 2.1, asking for 3.0 will return 3.0, and noting
    that we must update interactions with GL once 3.1 is defined.
    Mandated behavior of legacy context creation APIs when this
    extension is supported (bug 3595).

    Version 12, 2008/07/02 - Rename WGL_PREVIEW_BIT to
    WGL_CONTEXT_FORWARD_COMPATIBLE_BIT and other replace "preview
    context" with "forward-compatible context". Rename
    wglCreateContextVersion to wglCreateContextAttribs.

    Version 11, 2008/06/12 - Use ARB suffix. Raise ERROR_INVALID_VERSION
    instead of ERROR_INVALID_DATA on a bad version/preview combination.

    Version 10, 2008/04/08 - Changed "lite" to "preview" (still open for
    discussion however), and changed version "2.2" to "3.0" following
    the marketing TSG recommendation. Changed definition of preview
    contexts so that deprecated functionality *must not* be supported.
    Added issue 10 about how to handle profiles.

    Version 9, 2008/02/07 - Added version naming issue 9.

    Version 8, 2008/02/07 - Added naming issue 8. Removed reference to
    GL version 3 in "Sharing Objects Between Contexts".

    Version 7, 2008/02/01 - Rewrote issues list in light of new API
    direction, and reopened some issues. Added separate major and minor
    version attributes and "lite" API flag.

    Version 6, 2007/05/22 - Resolve issue 4, although the exact
    mechanism is still unknown.

    Version 5, 2007/04/09 - Added WGL_CONTEXT_FLAGS attribute and
    WGL_CONTEXT_DEBUG_BIT flag, and a high-level description of the
    concept of "debug contexts".

    Version 4, 2007/02/06 - Removed CreateContextVersion error when GL2
    and Longs Peak contexts are placed in the same share group, and
    referred to the GL_EXT_bind_image extension in issue 1. Added issues
    6 ("can be shared" attribute) and 7 (creation of debug contexts) per
    discussion at the Atlanta F2F ARB meeting. Added error condition for
    wglShareLists if passed a Longs Peak context handle.

    Version 3, 2007/01/22 - added issue 5.

    Version 2, 2007/01/17 - change to the same style as
    eglCreateContext, using an attribute list. Add wglMakeCurrent
    language disallowing current 3.x contexts bound to pbuffers, and
    allowing current 3.x context without a window-system provided
    framebuffer.

    Version 1, 2007/1/17 - First draft
