Name

    ARB_framebuffer_object

Name Strings

    GL_ARB_framebuffer_object

Contributors

    Kurt Akeley
    Jason Allen
    Rob Barris
    Bob Beretta
    Pat Brown
    Matt Craighead
    Alex Eddy
    Cass Everitt
    Mark Galvan
    Michael Gold
    Evan Hart
    Jeff Juliano
    John Kessenich
    Mark Kilgard
    Dale Kirkland
    Daniel Koch
    Jon Leech
    Bill Licea-Kane
    Barthold Lichtenbelt
    Kent Lin
    Rob Mace
    Teri Morrison
    Chris Niederauer
    Brian Paul
    Paul Puey
    Ian Romanick
    John Rosasco
    R. Jason Sams
    Jeremy Sandmel
    Mark Segal
    Avinash Seetharamaiah
    Folker Schamel
    Eskil Steenberg
    Daniel Vogel
    Eric Werness
    Cliff Woolley

Contacts

    Rob Barris (rbarris 'at' gmail.com)
    Daniel Koch, TransGaming Inc.

Notice

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

Status

    Approved by the ARB on August 4, 2008

Version

    Last Modified Date: October 6, 2016
    Revision: #38

Number

    ARB Extension #45

Dependencies

    OpenGL 1.1 is required.

    WGL_ARB_make_current_read affects the definition of this extension.

    GLX 1.3 / GLX_SGI_make_current_read affects the definition of this
    extension.

    ATI_draw_buffers affects the definition of this extension.

    ARB_draw_buffers affects the definition of this extension.

    ARB_fragment_program affects the definition of this extension.

    ARB_fragment_shader affects the definition of this extension.

    ARB_texture_rectangle affects the definition of this extension.

    ARB_vertex_shader affects the definition of this extension.

    NV_float_buffer affects the definition of this extension.

    ARB_color_buffer_float affects the definition of this extension.

    NV_texture_shader affects the definition of this extension.

    This extension modifies NV_packed_depth_stencil.

    ARB_depth_texture affects the definition of this extension.

    SGIX_depth_texture affects the definition of this extension.

    ARB_texture_rg affects the definition of this extension.

    EXT_texture_array affects the definition of this extension.

    EXT_texture_integer affects the definition of this extension.

    ARB_framebuffer_sRGB affects the definition of this extension.

    Written based on the wording of the OpenGL 2.1 specification.

Overview

    ARB_framebuffer_object is an extension intended to address the following
    goals:

    - Reflect FBO-related functionality found in the OpenGL 3.0 specification.

    - Integrate multiple disjoint extensions into a single ARB extension.
      These extensions are:

        EXT_framebuffer_object
        EXT_framebuffer_blit
        EXT_framebuffer_multisample
        EXT_packed_depth_stencil

    - Where appropriate, relax some of the constraints expressed by previous
      FBO-related extensions. In particular the requirement of matching
      attachment dimensions and component sizes has been relaxed, to allow
      implementations the freedom to support more flexible usages where
      possible.


    ARB_framebuffer_object defines an interface for drawing to rendering
    destinations other than the buffers provided to the GL by the
    window-system.

    In this extension, these newly defined rendering destinations are
    known collectively as "framebuffer-attachable images".  This
    extension provides a mechanism for attaching framebuffer-attachable
    images to the GL framebuffer as one of the standard GL logical
    buffers: color, depth, and stencil.  (Attaching a
    framebuffer-attachable image to the accum logical buffer is left for
    a future extension to define).  When a framebuffer-attachable image
    is attached to the framebuffer, it is used as the source and
    destination of fragment operations as described in Chapter 4.

    By allowing the use of a framebuffer-attachable image as a rendering
    destination, this extension enables a form of "offscreen" rendering.
    Furthermore, "render to texture" is supported by allowing the images
    of a texture to be used as framebuffer-attachable images.  A
    particular image of a texture object is selected for use as a
    framebuffer-attachable image by specifying the mipmap level, cube
    map face (for a cube map texture), and layer (for a 3D texture)
    that identifies the image.  The "render to texture" semantics of
    this extension are similar to performing traditional rendering to
    the framebuffer, followed immediately by a call to CopyTexSubImage.
    However, by using this extension instead, an application can achieve
    the same effect, but with the advantage that the GL can usually
    eliminate the data copy that would have been incurred by calling
    CopyTexSubImage.

    This extension also defines a new GL object type, called a
    "renderbuffer", which encapsulates a single 2D pixel image.  The
    image of renderbuffer can be used as a framebuffer-attachable image
    for generalized offscreen rendering and it also provides a means to
    support rendering to GL logical buffer types which have no
    corresponding texture format (stencil, accum, etc).  A renderbuffer
    is similar to a texture in that both renderbuffers and textures can
    be independently allocated and shared among multiple contexts.  The
    framework defined by this extension is general enough that support
    for attaching images from GL objects other than textures and
    renderbuffers could be added by layered extensions.

    To facilitate efficient switching between collections of
    framebuffer-attachable images, this extension introduces another new
    GL object, called a framebuffer object.  A framebuffer object
    contains the state that defines the traditional GL framebuffer,
    including its set of images.  Prior to this extension, it was the
    window-system which defined and managed this collection of images,
    traditionally by grouping them into a "drawable".  The window-system
    API's would also provide a function (i.e., wglMakeCurrent,
    glXMakeCurrent, aglSetDrawable, etc.) to bind a drawable with a GL
    context (as is done in the WGL_ARB_pbuffer extension).  In this
    extension however, this functionality is subsumed by the GL and the
    GL provides the function BindFramebufferARB to bind a framebuffer
    object to the current context.  Later, the context can bind back to
    the window-system-provided framebuffer in order to display rendered
    content.

    Previous extensions that enabled rendering to a texture have been
    much more complicated.  One example is the combination of
    ARB_pbuffer and ARB_render_texture, both of which are window-system
    extensions.  This combination requires calling MakeCurrent, an
    operation that may be expensive, to switch between the window and
    the pbuffer drawables.  An application must create one pbuffer per
    renderable texture in order to portably use ARB_render_texture.  An
    application must maintain at least one GL context per texture
    format, because each context can only operate on a single
    pixelformat or FBConfig.  All of these characteristics make
    ARB_render_texture both inefficient and cumbersome to use.

    ARB_framebuffer_object, on the other hand, is both simpler to use
    and more efficient than ARB_render_texture.  The
    ARB_framebuffer_object API is contained wholly within the GL API and
    has no (non-portable) window-system components.  Under
    ARB_framebuffer_object, it is not necessary to create a second GL
    context when rendering to a texture image whose format differs from
    that of the window.  Finally, unlike the pbuffers of
    ARB_render_texture, a single framebuffer object can facilitate
    rendering to an unlimited number of texture objects.

    This extension differs from EXT_framebuffer_object by splitting the
    framebuffer object binding point into separate DRAW and READ
    bindings (incorporating functionality introduced by
    EXT_framebuffer_blit). This allows copying directly from one
    framebuffer to another. In addition, a new high performance blit
    function is added to facilitate these blits and perform some data
    conversion where allowed.

    This extension also enables usage of multisampling in conjunction with
    renderbuffers (incorporating functionality from
    EXT_packed_depth_stencil), as follows:

    The new operation RenderbufferStorageMultisample() allocates
    storage for a renderbuffer object that can be used as a multisample
    buffer.  A multisample render buffer image differs from a
    single-sample render buffer image in that a multisample image has a
    number of SAMPLES that is greater than zero.  No method is provided
    for creating multisample texture images.

    All of the framebuffer-attachable images attached to a framebuffer
    object must have the same number of SAMPLES or else the framebuffer
    object is not "framebuffer complete".  If a framebuffer object with
    multisample attachments is "framebuffer complete", then the
    framebuffer object behaves as if SAMPLE_BUFFERS is one.

    In traditional multisample rendering, where
    DRAW_FRAMEBUFFER_BINDING is zero and SAMPLE_BUFFERS is one, the
    GL spec states that "the color sample values are resolved to a
    single, displayable color each time a pixel is updated."  There are,
    however, several modern hardware implementations that do not
    actually resolve for each sample update, but instead postpones the
    resolve operation to a later time and resolve a batch of sample
    updates at a time.  This is OK as long as the implementation behaves
    "as if" it had resolved a sample-at-a-time. Unfortunately, however,
    honoring the "as if" rule can sometimes degrade performance.

    In contrast, when DRAW_FRAMEBUFFER_BINDING is an
    application-created framebuffer object, MULTISAMPLE is enabled, and
    SAMPLE_BUFFERS is one, there is no implicit per-sample-update
    resolve.  Instead, the application explicitly controls when the
    resolve operation is performed.  The resolve operation is affected
    by calling BlitFramebuffer where the source is a multisample
    application-created framebuffer object and the destination is a
    single-sample framebuffer object (either application-created or
    window-system provided).

    This design for multisample resolve more closely matches current
    hardware, but still permits implementations which choose to resolve
    a single sample at a time.  If hardware that implements the
    multisample resolution "one sample at a time" exposes
    ARB_framebuffer_object, it could perform the implicit resolve
    to a driver-managed hidden surface, then read from that surface when
    the application calls BlitFramebuffer.

    Another motivation for granting the application explicit control
    over the multisample resolve operation has to do with the
    flexibility afforded by ARB_framebuffer_object.  Previously, a
    drawable (window or pbuffer) had exclusive access to all of its
    buffers.  There was no mechanism for sharing a buffer across
    multiple drawables.  Under ARB_framebuffer_object, however, a
    mechanism exists for sharing a framebuffer-attachable image across
    several framebuffer objects, as well as sharing an image between a
    framebuffer object and a texture.  If we had retained the "implicit"
    resolve from traditional multisampled rendering, and allowed the
    creation of "multisample" format renderbuffers, then this type of
    sharing would have lead to two problematic situations:

      * Two contexts, which shared renderbuffers, might perform
        competing resolve operations into the same single-sample buffer
        with ambiguous results.

      * It would have introduced the unfortunate ability to use the
        single-sample buffer as a texture while MULTISAMPLE is ENABLED.

    Using BlitFramebuffer as an explicit resolve to serialize access to
    the multisampled contents and eliminate the implicit per-sample
    resolve operation, we avoid both of these problems.

    This extension also enables usage of packed depth-stencil formats in
    renderbuffers (incorporating functionality from
    EXT_packed_depth_stencil), as follows:

    Many OpenGL implementations have chosen to interleave the depth and
    stencil buffers into one buffer, often with 24 bits of depth
    precision and 8 bits of stencil data.  32 bits is more than is
    needed for the depth buffer much of the time; a 24-bit depth buffer,
    on the other hand, requires that reads and writes of depth data be
    unaligned with respect to power-of-two boundaries.  On the other
    hand, 8 bits of stencil data is more than sufficient for most
    applications, so it is only natural to pack the two buffers into a
    single buffer with both depth and stencil data.  OpenGL never
    provides direct access to the buffers, so the OpenGL implementation
    can provide an interface to applications where it appears the one
    merged buffer is composed of two logical buffers.

    One disadvantage of this scheme is that OpenGL lacks any means by
    which this packed data can be handled efficiently.  For example,
    when an application reads from the 24-bit depth buffer, using the
    type GL_UNSIGNED_SHORT will lose 8 bits of data, while
    GL_UNSIGNED_INT has 8 too many.  Both require expensive format
    conversion operations.  A 24-bit format would be no more suitable,
    because it would also suffer from the unaligned memory accesses that
    made the standalone 24-bit depth buffer an unattractive proposition
    in the first place.

    Many applications, such as parallel rendering applications, may also
    wish to draw to or read back from both the depth and stencil buffers
    at the same time.  Currently this requires two separate operations,
    reducing performance.  Since the buffers are interleaved, drawing to
    or reading from both should be no more expensive than using just
    one; in some cases, it may even be cheaper.

    This extension provides a new data format, GL_DEPTH_STENCIL,
    that can be used with the glDrawPixels, glReadPixels, and
    glCopyPixels commands, as well as a packed data type,
    GL_UNSIGNED_INT_24_8, that is meant to be used with
    GL_DEPTH_STENCIL.  No other data types are supported with
    GL_DEPTH_STENCIL.  If ARB_depth_texture or SGIX_depth_texture is
    supported, GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8 data can
    also be used for textures; this provides a more efficient way to
    supply data for a 24-bit depth texture.

    GL_DEPTH_STENCIL data, when passed through the pixel path,
    undergoes both depth and stencil operations.  The depth data is
    scaled and biased by the current GL_DEPTH_SCALE and GL_DEPTH_BIAS,
    while the stencil data is shifted and offset by the current
    GL_INDEX_SHIFT and GL_INDEX_OFFSET.  The stencil data is also put
    through the stencil-to-stencil pixel map.

    glDrawPixels of GL_DEPTH_STENCIL data operates similarly to that
    of GL_STENCIL_INDEX data, bypassing the OpenGL fragment pipeline
    entirely, unlike the treatment of GL_DEPTH_COMPONENT data.  The
    stencil and depth masks are applied, as are the pixel ownership and
    scissor tests, but all other operations are skipped.

    glReadPixels of GL_DEPTH_STENCIL data reads back a rectangle
    from both the depth and stencil buffers.

    glCopyPixels of GL_DEPTH_STENCIL data copies a rectangle from
    both the depth and stencil buffers.  Like glDrawPixels, it applies
    both the stencil and depth masks but skips the remainder of the
    OpenGL fragment pipeline.

    glTex[Sub]Image[1,2,3]D of GL_DEPTH_STENCIL data loads depth and
    stencil data into a depth_stencil texture.  glGetTexImage of
    GL_DEPTH_STENCIL data can be used to retrieve depth and stencil
    data from a depth/stencil texture.

    In addition, a new base internal format, GL_DEPTH_STENCIL, can
    be used by both texture images and renderbuffer storage.  When an
    image with a DEPTH_STENCIL internal format is attached to both
    the depth and stencil attachment points of a framebuffer object,
    then it becomes both the depth and stencil
    buffers of the framebuffer.  This fits nicely with hardware that
    interleaves both depth and stencil data into a single buffer.  When
    a texture with DEPTH_STENCIL data is bound for texturing, only
    the depth component is accessible through the texture fetcher.  The
    stencil data can be written with TexImage or CopyTexImage, and can
    be read with GetTexImage.  When a DEPTH_STENCIL image is
    attached to the stencil attachment of the bound framebuffer object,
    the stencil data can be accessed through any operation that reads
    from or writes to the framebuffer's stencil buffer.


Glossary of Helpful Terms

        logical buffer:
            One of the color, depth, or stencil buffers of the
            framebuffer.

        framebuffer:
            The collection of logical buffers and associated state
            defining where the output of GL rendering is directed.

        texture:
            an object which consists of one or more 2D arrays of pixel
            images and associated state that can be used as a source of
            data during the texture-mapping process described in section
            3.8.

        texture image:
            one of the 2D arrays of pixels that are part of a texture
            object as defined in section 3.8.  Texture images contain
            and define the texels of the texture object.

        renderbuffer:
            A new type of storage object which contains a single 2D
            array of pixels and associated state that can be used as a
            destination for pixel data written during the rendering
            process described in Chapter 4.

        renderbuffer image:
            The 2D array of pixels that is part of a renderbuffer
            object.  A renderbuffer image contains and defines the
            pixels of the renderbuffer object.

        framebuffer-attachable image:
            A 2D pixel image that can be attached to one of the logical
            buffer attachment points of a framebuffer object.  Texture
            images and renderbuffer images are two examples of
            framebuffer-attachable images.

        attachment point:
            The set of state which references a specific
            framebuffer-attachable image, and allows that
            framebuffer-attachable image to be used to store the
            contents of a logical buffer of a framebuffer object.  There
            is an attachment point state vector for each color, depth,
            and stencil buffer of a framebuffer.

        attach:
            The act of connecting one object to another object.

            An "attach" operation is similar to a "bind" operation in
            that both represent a reference to the attached or bound
            object for the purpose of managing object lifetimes and both
            enable manipulation of the state of the attached or bound
            object.

            However, an "attach" is also different from a "bind" in that
            "binding" an unused object creates a new object, while
            "attaching" does not.  Additionally, "bind" establishes a
            connection between a context and an object, while "attach"
            establishes a connection between two objects.

            Finally, if object "A" is attached to object "B" and object
            "B" is bound to context "C", then in most respects, we treat
            "A" as if it is <implicitly> bound to "C".

        framebuffer attachment completeness:
            Similar to texture "mipmap" or "cube" completeness from
            section 3.8.10, defines a minimum set of criteria for
            framebuffer attachment points.  (for complete definition,
            see section 4.4.4.1)

        framebuffer completeness:
            Similar to texture "mipmap cube completeness", defines a
            composite set of "completeness" requirements and
            relationships among the attached framebuffer-attachable
            images.  (for complete definition, see section 4.4.4.2)


New Procedures and Functions

    boolean IsRenderbuffer(uint renderbuffer);
    void BindRenderbuffer(enum target, uint renderbuffer);
    void DeleteRenderbuffers(sizei n, const uint *renderbuffers);
    void GenRenderbuffers(sizei n, uint *renderbuffers);

    void RenderbufferStorage(enum target, enum internalformat,
                             sizei width, sizei height);

    void RenderbufferStorageMultisample(enum target, sizei samples,
                                        enum internalformat,
                                        sizei width, sizei height);

    void GetRenderbufferParameteriv(enum target, enum pname, int *params);

    boolean IsFramebuffer(uint framebuffer);
    void BindFramebuffer(enum target, uint framebuffer);
    void DeleteFramebuffers(sizei n, const uint *framebuffers);
    void GenFramebuffers(sizei n, uint *framebuffers);

    enum CheckFramebufferStatus(enum target);

    void FramebufferTexture1D(enum target, enum attachment,
                              enum textarget, uint texture, int level);
    void FramebufferTexture2D(enum target, enum attachment,
                              enum textarget, uint texture, int level);
    void FramebufferTexture3D(enum target, enum attachment,
                              enum textarget, uint texture,
                              int level, int layer);
    void FramebufferTextureLayer(enum target,enum attachment,
                                 uint texture,int level,int layer);

    void FramebufferRenderbuffer(enum target, enum attachment,
                                 enum renderbuffertarget, uint renderbuffer);

    void GetFramebufferAttachmentParameteriv(enum target, enum attachment,
                                             enum pname, int *params);

    void BlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1,
                         int dstX0, int dstY0, int dstX1, int dstY1,
                         bitfield mask, enum filter);

    void GenerateMipmap(enum target);


New Types

    None.


New Tokens

    Accepted by the <target> parameter of BindFramebuffer,
    CheckFramebufferStatus, FramebufferTexture{1D|2D|3D},
    FramebufferRenderbuffer, and
    GetFramebufferAttachmentParameteriv:

        FRAMEBUFFER                     0x8D40
        READ_FRAMEBUFFER                0x8CA8
        DRAW_FRAMEBUFFER                0x8CA9

    Accepted by the <target> parameter of BindRenderbuffer,
    RenderbufferStorage, and GetRenderbufferParameteriv, and
    returned by GetFramebufferAttachmentParameteriv:

        RENDERBUFFER                    0x8D41

    Accepted by the <internalformat> parameter of
    RenderbufferStorage:

        STENCIL_INDEX1                  0x8D46
        STENCIL_INDEX4                  0x8D47
        STENCIL_INDEX8                  0x8D48
        STENCIL_INDEX16                 0x8D49

    Accepted by the <pname> parameter of GetRenderbufferParameteriv:

        RENDERBUFFER_WIDTH              0x8D42
        RENDERBUFFER_HEIGHT             0x8D43
        RENDERBUFFER_INTERNAL_FORMAT    0x8D44
        RENDERBUFFER_RED_SIZE           0x8D50
        RENDERBUFFER_GREEN_SIZE         0x8D51
        RENDERBUFFER_BLUE_SIZE          0x8D52
        RENDERBUFFER_ALPHA_SIZE         0x8D53
        RENDERBUFFER_DEPTH_SIZE         0x8D54
        RENDERBUFFER_STENCIL_SIZE       0x8D55
        RENDERBUFFER_SAMPLES            0x8CAB

    Accepted by the <pname> parameter of
    GetFramebufferAttachmentParameteriv:

        FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE            0x8CD0
        FRAMEBUFFER_ATTACHMENT_OBJECT_NAME            0x8CD1
        FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL          0x8CD2
        FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE  0x8CD3
        FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER          0x8CD4
        FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING         0x8210
        FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE         0x8211
        FRAMEBUFFER_ATTACHMENT_RED_SIZE               0x8212
        FRAMEBUFFER_ATTACHMENT_GREEN_SIZE             0x8213
        FRAMEBUFFER_ATTACHMENT_BLUE_SIZE              0x8214
        FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE             0x8215
        FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE             0x8216
        FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE           0x8217

    Returned in <params> by GetFramebufferAttachmentParameteriv:

        SRGB                                          0x8C40
        UNSIGNED_NORMALIZED                           0x8C17
        FRAMEBUFFER_DEFAULT                           0x8218
        INDEX                                         0x8222

    Accepted by the <attachment> parameter of
    FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and
    GetFramebufferAttachmentParameteriv

        COLOR_ATTACHMENT0                0x8CE0
        COLOR_ATTACHMENT1                0x8CE1
        COLOR_ATTACHMENT2                0x8CE2
        COLOR_ATTACHMENT3                0x8CE3
        COLOR_ATTACHMENT4                0x8CE4
        COLOR_ATTACHMENT5                0x8CE5
        COLOR_ATTACHMENT6                0x8CE6
        COLOR_ATTACHMENT7                0x8CE7
        COLOR_ATTACHMENT8                0x8CE8
        COLOR_ATTACHMENT9                0x8CE9
        COLOR_ATTACHMENT10               0x8CEA
        COLOR_ATTACHMENT11               0x8CEB
        COLOR_ATTACHMENT12               0x8CEC
        COLOR_ATTACHMENT13               0x8CED
        COLOR_ATTACHMENT14               0x8CEE
        COLOR_ATTACHMENT15               0x8CEF
        DEPTH_ATTACHMENT                 0x8D00
        STENCIL_ATTACHMENT               0x8D20
        DEPTH_STENCIL_ATTACHMENT         0x821A

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

        MAX_SAMPLES                     0x8D57
        FRAMEBUFFER_BINDING             0x8CA6 // alias DRAW_FRAMEBUFFER_BINDING
        DRAW_FRAMEBUFFER_BINDING        0x8CA6
        READ_FRAMEBUFFER_BINDING        0x8CAA
        RENDERBUFFER_BINDING            0x8CA7
        MAX_COLOR_ATTACHMENTS           0x8CDF
        MAX_RENDERBUFFER_SIZE           0x84E8


    Returned by CheckFramebufferStatus():

        FRAMEBUFFER_COMPLETE                          0x8CD5
        FRAMEBUFFER_INCOMPLETE_ATTACHMENT             0x8CD6
        FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT     0x8CD7
        FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER            0x8CDB
        FRAMEBUFFER_INCOMPLETE_READ_BUFFER            0x8CDC
        FRAMEBUFFER_UNSUPPORTED                       0x8CDD
        FRAMEBUFFER_INCOMPLETE_MULTISAMPLE            0x8D56
        FRAMEBUFFER_UNDEFINED                         0x8219

    Returned by GetError():

        INVALID_FRAMEBUFFER_OPERATION   0x0506

    Accepted by the <format> parameter of DrawPixels, ReadPixels,
    TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D,
    TexSubImage3D, and GetTexImage, by the <type> parameter of
    CopyPixels, by the <internalformat> parameter of TexImage1D,
    TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and
    RenderbufferStorage, and returned in the <data> parameter of
    GetTexLevelParameter and GetRenderbufferParameteriv:

        DEPTH_STENCIL                              0x84F9

    Accepted by the <type> parameter of DrawPixels, ReadPixels,
    TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D,
    TexSubImage3D, and GetTexImage:

        UNSIGNED_INT_24_8                          0x84FA

    Accepted by the <internalformat> parameter of TexImage1D,
    TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and
    RenderbufferStorage, and returned in the <data> parameter of
    GetTexLevelParameter and GetRenderbufferParameteriv:

        DEPTH24_STENCIL8                           0x88F0

    Accepted by the <value> parameter of GetTexLevelParameter:

        TEXTURE_STENCIL_SIZE                       0x88F1


Additions to Chapter 2 of the 2.1 Specification (OpenGL Operation)

    "The GL interacts with two classes of framebuffers: window
    system-provided and application-created. There is at most one window
    system-provided framebuffer at any time, referred to as the <default
    framebuffer>. Application-created framebuffers, referred to as
    <framebuffer objects>, may be created as desired. These two types of
    framebuffer are distinguished primarily by the interface for configuring
    and managing their state.

    The effects of GL commands on the default framebuffer are ultimately
    controlled by the window system, which allocates framebuffer resources,
    determines what portions of the default framebuffer the GL may access at
    any given time, and communicates to the GL how those portions are
    structured. Therefore, there are no GL commands to initialize a GL
    context or configure the default framebuffer. Similarly, display of
    framebuffer contents on a physical display device (including the
    transformation of individual framebuffer values by such techniques as
    gamma correction) is not addressed by the GL.

    Allocation and configuration of the default framebuffer occurs outside
    of the GL in conjunction with the window system, using companion APIs
    such as GLX, WGL, and AGL for GL implementations running on the X Window
    System, Microsoft Windows, and MacOS X respectively.

    Allocation and initialization of GL contexts is also done using these
    companion APIs. GL contexts can typically be associated with different
    default framebuffers, and some context state is determined at the time
    this association is performed.

    It is possible to use a GL context <without> a default framebuffer, in
    which case a framebuffer object must be used to perform all rendering.
    This is useful for applications needing to perform <offscreen
    rendering>."


    Add to table 2.3, "Summary of GL errors":

    Error                         Description        Offending command
                                                     ignored?
    ----------------------------- ------------------ -----------------
    ...
    INVALID_FRAMEBUFFER_OPERATION Framebuffer object Yes
                                  is not complete


    Append the following to section 2.6.1 "Begin and End":

    "Calling Begin will result in an INVALID_FRAMEBUFFER_OPERATION
    error if the object bound to DRAW_FRAMEBUFFER_BINDING is not
    "framebuffer complete" (see section 4.4.4.2)."

    Update the bulleted list in section 2.15.4 "Shader Execution" in
    the subsection titled "Texture Access" to say:

    "* The sampler used in a texture lookup function is not one of
      the shadow sampler types, the texture object's base internal
      format is DEPTH_COMPONENT or DEPTH_STENCIL, and the
      TEXTURE_COMPARE_MODE is not NONE.

    * The sampler used in a texture lookup function is one of the
      shadow sampler types, the texture object's base
      internal format is DEPTH_COMPONENT or DEPTH_STENCIL, and the
      TEXTURE_COMPARE_MODE is NONE.

    * The sampler used in a texture lookup function is one of the
      shadow sampler types, and the texture object's base
      internal format is not DEPTH_COMPONENT or DEPTH_STENCIL.

    The stencil index texture internal component is ignored if the base
    internal format is DEPTH_STENCIL.

    If a vertex shader uses..."


Additions to Chapter 3 of the OpenGL 2.1 Specification (Rasterization)

    Update section 3.6.3 "Pixel Transfer Modes", the first paragraph of
    the subsection "Color Table Specification", in the definition of
    ColorTable, to say:

    "... The <formats> COLOR_INDEX, DEPTH_COMPONENT, DEPTH_STENCIL,
    and STENCIL_INDEX and the <type> BITMAP are not allowed."

    Update section 3.6.3 "Pixel Transfer Modes", the third paragraph of
    the subsection "Color Table Specification", in the definition of
    ColorTable, to say:

    "... <internalformat> must be one of the formats in table 3.15 or
    table 3.16, other than the DEPTH_COMPONENT or DEPTH_STENCIL
    formats in those tables."

    Add to section 3.6.3 "Pixel Transfer Modes", at the end of the
    subsection titled "Alternate Color Table Specification Commands":

    "Calling CopyColorTable or CopyColorSubTable will result in an
    INVALID_FRAMEBUFFER_OPERATION error if the object bound to
    READ_FRAMEBUFFER_BINDING is not "framebuffer complete"
    (see section 4.4.4.2)."

    In section 3.6.3 "Pixel Transfer Modes", the subsection "Covolution
    Filter Specification", update the first paragraph in the definition
    of ConvolutionFilter2D to say:

    "... The formats COLOR_INDEX, DEPTH_COMPONENT, DEPTH_STENCIL,
    and STENCIL_INDEX and the type BITMAP are not allowed."

    In section 3.6.3 "Pixel Transfer Modes", update the third paragraph
    of the subsection "Convolution Filter Specification", in the definition
    of ConvolutionFilter2D, to say:

    "... <internalformat> accepts the same values as the corresponding
    argument of ColorTable."

    Add to section 3.6.3 "Pixel Transfer Modes", at the end of the
    subsection titled "Alternate Convolution Filter Specification Commands":

    "Calling CopyConvolutionFilter1D or CopyConvolutionFilter2D will
    result in an INVALID_FRAMEBUFFER_OPERATION error if the object
    bound to READ_FRAMEBUFFER_BINDING is not "framebuffer
    complete" (see section 4.4.4.2)."

    In section 3.6.3 "Pixel Transfer Modes", update the third paragraph
    of the "Histogram Table Specification" subsection , in the definition of
    Histogram, to say:

    "... is too large for the implementation. <internalformat> accepts the
    same values as the corresponding argument of ColorTable, with the
    exception of the values 1, 2, 3, and 4."

    In section 3.6.3 "Pixel Transfer Modes", update the second paragraph
    in the subsection titled "Minmax Table Specification", in the definition
    of Minmax to say:

    "<internalformat> accepts the same values as the corresponding argument
    of ColorTable, with the exception of the values 1, 2, 3, and 4, as well
    as the INTENSITY base and sized internal formats."

    In section 3.6.4 "Rasterization of Pixel Rectangles", modify the final
    paragraph of the definition of DrawPixels as follows:

    "... If the GL is in color index mode and <format> is not one of
    COLOR_INDEX, STENCIL_INDEX, DEPTH_COMPONENT, or DEPTH_STENCIL,
    then the error INVALID_OPERATION occurs.  If <type> is BITMAP and
    <format> is not COLOR_INDEX or STENCIL_INDEX then the error
    INVALID_ENUM occurs.  If <format> is DEPTH_STENCIL and <type> is
    not UNSIGNED_INT_24_8 then the error INVALID_ENUM occurs.  Some
    additional constraints on the combinations of <format> and <type>
    values that are accepted is discussed below.

   "Calling DrawPixels
    will result in an INVALID_FRAMEBUFFER_OPERATION error if the
    object bound to DRAW_FRAMEBUFFER_BINDING is not
    "framebuffer complete" (see section 4.4.4.2)."

    Add a row to Table 3.5, in section 3.6.4:

      type Parameter                GL Type Special
      ---------------------------   ------- -------
      ...                           ...     ...
      UNSIGNED_INT_2_10_10_10_REV   uint    Yes
      UNSIGNED_INT_24_8             uint    Yes

    Add a row to Table 3.6, in section 3.6.4:

      Format Name       Element Meaning and Order   Target Buffer
      ---------------   -------------------------   -----------------
      ...               ...                         ...
      DEPTH_COMPONENT   Depth                       Depth
      DEPTH_STENCIL     Depth and Stencil Index     Depth and Stencil
      ...               ...                         ...

    In section 3.6.4 "Rasterization of Pixel Rectangles", in the subsection
    titled "Unpacking", update the last paragraph on page 131 to say:

    "Calling DrawPixels with a <type> matching one of the types in table 3.8
    is a special case in which all the components of each group are packed
    into a single unsigned byte, unsigned short, or unsigned int, depending
    on the type. The number of components..."

    Add a row to Table 3.8, in section 3.6.4:

      type Parameter               GL Type  Components  Pixel Formats
      ---------------------------  -------  ----------  -------------
      ...                          ...      ...         ...
      UNSIGNED_INT_2_10_10_10_REV  uint     4           RGBA,BGRA
      UNSIGNED_INT_24_8            uint     2           DEPTH_STENCIL

    Add the following diagram to Table 3.11, in section 3.6.4:

    UNSIGNED_INT_24_8

       31 30 29 28 27 26 ... 12 11 10 9 8 7 6 5 4 3 2 1 0
      +----------------------------------+---------------+
      |           1st Component          | 2nd Component |
      +----------------------------------+---------------+

    Add a row to Table 3.12, in section 3.6.4:

      Format        |  1st     2nd     3rd     4th
      --------------+-------------------------------
      ...           |  ...     ...     ...     ...
      BGRA          |  blue    green   red     alpha
      DEPTH_STENCIL |  depth   stencil N/A     N/A

    In section 3.6.4 "Rasterization of Pixel Rectangles", add the
    following sentence to the end of the first paragraph in "Conversion
    to floating-point":

    "For groups containing both components and indices, such as
    DEPTH_STENCIL, the indices are not converted."

    In section 3.6.4 "Rasterization of Pixel Rectangles", update the
    last paragraph in the section "Conversion to Fragments" to say:

    "... Groups arising from DrawPixels with a <format> of STENCIL_INDEX
    or DEPTH_STENCIL are treated specially and are described in
    section 4.3.1."

    Update the first paragraph of section 3.6.5 "Pixel Transfer
    Operations" to say:

    "The GL defines five kinds of pixel groups:

       1. RGBA component: Each group comprises four color components:
          red, green, blue, and alpha.
       2. Depth component: Each group comprises a single depth
          component.
       3. Color index: Each group comprises a single color index.
       4. Stencil index: Each group comprises a single stencil index.
       5. Depth/stencil: Each group comprises a single depth component
          and a single stencil index."

    In section 3.6.5 "Pixel Transfer Operations" update the first paragraph
    in the subsection "Arithmetic on Components" to say:

    "This step applies only to RGBA component and depth component
    groups, and to the depth components in depth/stencil groups. ..."

    In section 3.6.5 "Pixel Transfer Operations" update the first paragraph
    in the subsection "Arithmetic on Indices" to say:

    "This step applies only to color index and stencil index groups, and
    to the stencil indices in depth/stencil groups. ..."

    In section 3.6.5 "Pixel Transfer Operations" update the first paragraph
    in the subsection "Stencil Index Lookup" to say:

    "This step applies only to stencil index groups and to the stencil
    indices in depth/stencil groups. ..."

    Add the following to section 3.7 "Bitmaps", following the description of
    Bitmap:

    "Calling Bitmap will result in an
    INVALID_FRAMEBUFFER_OPERATION error if the object bound to
    DRAW_FRAMEBUFFER_BINDING is not "framebuffer complete"
    (see section 4.4.4.2)."

    In section 3.8.1 "Texture Image Specification", update the following
    paragraphs as follows:

    Update the fourth paragraph to say:

    "The selected groups are processed exactly as for DrawPixels,
    stopping just before final conversion.  Each R, G, B, A, or depth
    value so generated is clamped to [0, 1], while the stencil index
    values are masked by 2^n-1, where n is the number of stencil bits in
    the internal format resolution (see below).  If the base internal
    format is DEPTH_STENCIL and <format> is not DEPTH_STENCIL,
    then the values of the stencil index texture component are
    undefined."

    Update the fifth paragraph to say:

    "Components are then selected from the resulting R, G, B, A, depth,
    or stencil index values to obtain a texture with the base internal
    format specified by (or derived from) <internalformat>.  Table 3.15
    summarizes the mapping of R, G, B, A, depth, or stencil values to
    texture components, as a function of the base internal format of the
    texture image.  <internalformat> may be specified as one of the
    eight internal format symbolic constants listed in table 3.15, as
    one of ..."

    Update the sixth paragraph to say:

    "Textures with a base internal format of DEPTH_COMPONENT or
    DEPTH_STENCIL are supported by texture image specification
    commands only if <target> is TEXTURE_1D, TEXTURE_2D,
    PROXY_TEXTURE_1D or PROXY_TEXTURE_2D.  Using these formats in
    conjunction with any other <target> will result in an
    INVALID_OPERATION error."

    Update the seventh paragraph to say:

    Textures with a base internal format of DEPTH_COMPONENT or
    DEPTH_STENCIL require either depth component data or
    depth/stencil component data.  Textures with other base internal
    formats require RGBA component data.  The error INVALID_OPERATION is
    generated if one of the base internal format and <format>
    is DEPTH_COMPONENT or DEPTH_STENCIL, and the other is neither
    of these values."

    Update the tenth paragraph to say:

    "...the mapping of the R, G, B, A, depth and stencil values to
    texture components..."

    Add a row to table 3.15 in section 3.8.1, and update the title of the
    second column:

      Base Internal Format  RGBA and Depth and Stencil Values  Internal Components
      --------------------  ---------------------------------  -------------------
      ...                   ...                                ...
      DEPTH_STENCIL         Depth,Stencil                      D,S
      ...                   ...                                ...

    Update the caption for table 3.15

    "Table 3.15: Conversion from RGBA, depth, and stencil pixel
    components to internal texture, table, or filter components.  See
    section 3.8.13 for a description of the texture components R, G, B,
    A, L, I, D, and S."

    Add a new column to table 3.16, in section 3.8.1, labeled "S bits".  The
    value of this column is blank for all rows except a new row:

      Sized            Base               R    G    B    A    L    I    D    S
      Internal Format  InternalFormat    bits bits bits bits bits bits bits bits
      ---------------- --------------    ---- ---- ---- ---- ---- ---- ---- ----
      ...                  ...           ...  ...  ...  ...  ...  ...  ...  ...
      DEPTH24_STENCIL8 DEPTH_STENCIL                                   24    8
      ...                  ...           ...  ...  ...  ...  ...  ...  ...  ...

    In section 3.8.2 "Alternate Texture Image Specification Commands",
    update the second paragraph, in the definition of CopyTexImage2D, to
    say:

    "...The image is taken from the framebuffer exactly as if these
    arguments were passed to CopyPixels with argument type set to COLOR
    DEPTH, or DEPTH_STENCIL, depending on <internalformat>, stopping
    after pixel transfer processing is complete.  RGBA data is taken
    from the current color buffer, while depth component and stencil
    index data are taken from the depth and stencil buffers,
    respectively.  If depth component data is required and no depth
    buffer is present, or if stencil index data is required and there is
    no stencil buffer, the error INVALID_OPERATION is generated.
    Subsequent processing is identical to that described for TexImage2D,
    beginning with clamping of the R, G, B, A, or depth values, and
    masking of the stencil index value, from the resulting pixel
    groups..."

    Update the third paragraph to say:

    "Subsequent processing is identical to that described for TexImage2D,
    beginning with clamping of the R, G, B, A, or depth values, and masking
    of the stencil index values from the resulting pixel groups..."

    In section 3.8.2 "Alternate Texture Image Specification Commands",
    update the seventh paragraph, in the description of the
    CopyTexSubImage{2|3}D arguments, to say:

    "...except that the assignment of R, G, B, A, depth, and stencil
    pixel group values to the texture components is controlled by the
    internalformat of the texture array, not by an argument to the
    command..."

    Append the following to section 3.8.2 "Alternate Texture Image
    Specification Commands":

    "Calling CopyTexSubImage3D, CopyTexImage2D,
    CopyTexSubImage2D, CopyTexImage1D or CopyTexSubImage1D will result
    in an INVALID_FRAMEBUFFER_OPERATION error if the object bound
    to READ_FRAMEBUFFER_BINDING is not "framebuffer complete"
    (see section 4.4.4.2)."

    Update section 3.8.5 "Depth Component Textures" to say:

    "Depth textures and the depth components of depth/stencil textures
    can be treated as LUMINANCE, INTENSITY or ALPHA textures during
    texture filtering and application. The initial state for depth and
    depth/stencil textures treats them as LUMINANCE textures."

    In section 3.8.8 "Texture Minification", add the following text
    immediately before the subsection "Mipmapping":

    "If all of the following conditions are satisfied, then the value of
    the selected Tau(ijk), Tau(ij), or Tau(i) in the above equations is
    undefined instead of referring to the value of the texel at location
    (i), (i,j), or (i,j,k).  See Chapter 4 for discussion of framebuffer
    objects and their attachments.

      * The current DRAW_FRAMEBUFFER_BINDING names an application-created
        framebuffer object <F>.

      * The texture is attached to one of the attachment points, <A>, of
        framebuffer object <F>.

      * The value of TEXTURE_MIN_FILTER is NEAREST or LINEAR, and the value
        of FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL for attachment point <A>
        is equal to the value of TEXTURE_BASE_LEVEL

        -or-

        The value of TEXTURE_MIN_FILTER is NEAREST_MIPMAP_NEAREST,
        NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_NEAREST, or
        LINEAR_MIPMAP_LINEAR, and the value of
        FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL for attachment point
        <A> is within the inclusive range from TEXTURE_BASE_LEVEL to q."

    In subsection "Automatic Mipmap Generation" to section 3.8.8,
    replace the first paragraph with the following text and footnote:

    "If the value of texture parameter GENERATE MIPMAP is TRUE and a
    change is made to the interior or border texels of the level_base
    array of a mipmap by one of the texture image specification
    operations defined in sections 3.8.1 through 3.8.3, then a complete
    set of mipmap arrays (as defined in section 3.8.10) will be
    computed.  Array levels level_base + 1 through p are replaced with
    arrays derived from the modified level_base, regardless of their
    previous contents.  All other mipmap arrays, including the
    level_base array, are left unchanged by this computation[fn1]."

    "[fn1] Automatic mipmap generation is not performed for changes
           resulting from rendering operations targeting a texture array
           bound as a color buffer of a framebuffer object."


    Add a new subsection "Manual Mipmap Generation" to section 3.8.8,
    after "Automatic Mipmap Generation":

    "Manual Mipmap Generation

    Mipmaps can be generated manually with the command

      void GenerateMipmap(enum target);

    where <target> is one of TEXTURE_1D, TEXTURE_2D, TEXTURE_CUBE_MAP, or
    TEXTURE_3D. Mipmap generation affects the texture image attached to
    <target>. For cube map textures, an INVALID_OPERATION error is generated
    if the texture bound to <target> is not cube complete, as defined in
    section 3.8.10.

    Mipmap generation replaces texture array levels level_base + 1
    through q with arrays derived from the level_base array, as
    described above under Automatic Mipmap Generation.  All other mipmap
    arrays, including the level_base array, are left unchanged by this
    computation.  For arrays in the range level_base+1 through q,
    inclusive, automatic and manual mipmap generation generate the same
    derived arrays, given identical level_base arrays."

    Add a new section between sections 3.8.9 and 3.8.10:

    "3.8.10 DEPTH_STENCIL Textures

    If the texture image has a base internal format of
    DEPTH_STENCIL, then the stencil index texture component is
    ignored.  The texture value Tau does not include a stencil index
    component, but includes only the depth component."

    Update the first paragraph of section 3.8.11 "Texture State and
    Proxy State" to say:

    "...eight integer values describing the resolutions of each of the
    red, green, blue, alpha, luminance, intensity, depth, and stencil
    components of the image..."

    Update the second paragraph of section 3.8.11 "Texture State and
    Proxy State" to say:

    "... and internal format state values, as well as state for the red,
    green, blue, alpha, luminance, intensity, depth, and stencil
    component resolutions."

    Modify the definition of DeleteTextures in section 3.8.12 "Texture
    Objects", to read:

    "Texture objects are deleted by calling

        void DeleteTextures( sizei n, uint *textures );

    textures contains n names of texture objects to be deleted.  After a
    texture object is deleted, it has no contents or dimensionality, and
    its name is again unused.  If a texture that is currently bound to
    one of the targets TEXTURE 1D, TEXTURE 2D, TEXTURE 3D, or TEXTURE
    CUBE MAP is deleted, it is as though BindTexture had been executed
    with the same target and texture zero.  Additionally, special care
    must be taken when deleting a texture if any of the images of the
    texture are attached to a framebuffer object.  See section 4.4.2.3
    for details.

    Unused names in textures are silently ignored, as is the value
    zero."

    In section 3.8.14 "Texture Comparison Modes", update the first
    paragraph of "Depth Texture Comparison Mode" subsection to say:

    "If the currently bound texture's base internal format is
    DEPTH_COMPONENT or DEPTH_STENCIL..."

    In the section 3.8.16 "Texture Application", update the first
    paragraph of to say:

    "...Otherwise, a texture value is found according to the parameter
    values of the currently bound texture image of the appropriate
    dimensionality using the rules given in sections 3.8.6 through
    3.8.9.  Note that the texture value may contain R, G, B, A, L, I, or
    D components, but it does not contain an S component.  If the
    texture's base internal format is DEPTH_STENCIL, for the
    purposes of texture application, it is as if the base internal
    format were DEPTH_COMPONENT..."

    In section 3.11.2 "Shader Execution", in the bulleted list
    in the "Texture Access" subsection to say:

    "* The sampler used in a texture lookup function is not one of the
      shadow sampler types, the texture object's base internal
      format is DEPTH_COMPONENT or DEPTH_STENCIL, and the
      TEXTURE_COMPARE_MODE is not NONE.

    * The sampler used in a texture lookup function is one of the
      shadow sampler types, the texture object's base
      internal format is DEPTH_COMPONENT or DEPTH_STENCIL, and the
      TEXTURE_COMPARE_MODE is NONE.

    * The sampler used in a texture lookup function is one of the
      shadow sampler types, and the texture object's base
      internal format is not DEPTH_COMPONENT or DEPTH_STENCIL.

    The stencil index texture internal component is ignored if the base
    internal format is DEPTH_STENCIL.

    If a fragment shader uses..."


Additions to Chapter 4 of the OpenGL 2.1 Specification (Per-Fragment
Operations and the Framebuffer)

    In the introduction to chapter 4, modify the first
    three paragraphs to read as follows:

   "The framebuffer, whether it is the default framebuffer or a framebuffer
    object (see section 2.1), consists of a set of pixels arranged as a
    two-dimensional array.
    For purposes of this
    discussion, each pixel in the framebuffer is simply a set of some
    number of bits.  The number of bits per pixel may  vary
    depending on the GL implementation, the type of framebuffer
    selected, and parameters specified when the framebuffer was created.
    Creation and management of the default framebuffer is outside the scope
    of this specification, while creation and management of framebuffer
    objects is described in detail in section 4.4

    Corresponding bits from each pixel in the framebuffer are grouped
    together into a <bitplane>; each bitplane contains a single bit from
    each pixel.  These bitplanes are grouped into several <logical
    buffers>.  These are the color, accumulation, depth, and stencil
    buffers.  The color buffer actually consists of a number of buffers,
    and these color buffers serve related but slightly different
    purposes depending on whether the GL is bound to the default
    framebuffer or a framebuffer object.

    For the default framebuffer, the color buffers are the <front left>
    buffer, the <front right> buffer, the <back left> buffer, the <back
    right> buffer, and some number of <auxiliary> buffers. Typically, the
    contents of the front buffers are displayed on a color monitor while the
    contents of the back buffers are invisible. (Monoscopic contexts display
    only the front left buffer; stereoscopic contexts display both the front
    left and the front right buffers.) The contents of the auxiliary buffers
    are never visible. All color buffers must have the same number of
    bitplanes, although an implementation or context may choose not to
    provide right buffers, back buffers, or auxiliary buffers at all.
    Further, an implementation or context may choose not to provide
    accumulation, depth, or stencil buffers. If no default framebuffer is
    associated with the GL context, the framebuffer is incomplete except
    when a framebuffer object is bound (see sections 4.4.1 and 4.4.4).

    Framebuffer objects are not visible, and do not have any of the color
    buffers present in the default framebuffer. Instead, the buffers of an
    framebuffer object are specified by attaching individual textures or
    renderbuffers (see section 4.4) to a set of attachment points. A
    framebuffer object has an array of color buffer attachment points,
    numbered zero through <n>, a depth buffer attachment point, and a
    stencil buffer attachment point. In order to be used for rendering, a
    framebuffer object must be complete, as described in section 4.4.4. Not
    all attachments of a framebuffer object need to be populated.

    Each pixel in a color buffer consists of either an unsigned integer
    color index or of up to four color components. The four color components
    are named R, G, B, and A, in that order; color buffers are not required
    to have all four color components. R, G, B, and A components may be
    represented as signed or unsigned normalized fixed-point,
    floating-point, or signed or unsigned integer values; all components
    must have the same representation. Each pixel in a depth buffer consists
    of a single unsigned integer value in the format described in section
    2.12.1 or a floating-point value. Each pixel in a stencil buffer
    consists of a single unsigned integer value. Each pixel in an
    accumulation buffer consists of up to four color components. If an
    accumulation buffer is present, it must have at least as many bitplanes
    per component as in the color buffers.

    The number of bitplanes in the accumulation, color, depth, and stencil
    buffers is dependent on the currently bound framebuffer. For the default
    framebuffer, the number of bitplanes is fixed. For framebuffer objects,
    the number of bitplanes in a given logical buffer may change if the
    image attached to the corresponding attachment point changes.

    The GL has two active framebuffers; the <draw framebuffer> is the
    destination for rendering operations, and the <read framebuffer> is the
    source for readback operations. The same framebuffer may be used for
    both drawing and reading. Section 4.4.1 describes the mechanism for
    controlling framebuffer usage."

    The default framebuffer is initially used as the draw and read
    framebuffer [fn1], and the initial state of all provided bitplanes is
    undefined. The format and encoding of buffers in the draw and read
    framebuffers can be queried as described in section 6.1.3.
        [fn1] The window system binding API may allow associating a GL
              context with two separate ``default framebuffers'' provided by
              the window system as the draw and read framebuffers, but if
              so, both default framebuffers are referred to by the name zero
              at their respective binding points.

    Add a new paragraph to the end of section 4.1.1 "Pixel Ownership Test":

    "If the draw framebuffer is a framebuffer object (see section 4.2.1),
    the pixel ownership test always passes, since the pixels of framebuffer
    objects are owned by the GL, not the window system. If the draw
    framebuffer is the default framebuffer, the window system controls pixel
    ownership."

    Change section 4.1.5 "Stencil Test", the fifth paragraph,
    the second and third sentences, to read as follows:

    "<ref> is an integer reference value that is used in the unsigned
    stencil comparison.  Stencil comparison operations and queries of
    of <ref> clamp its value to the range [0,(2^s)-1], where <s> is the
    number of bits in the stencil buffer attached to the draw framebuffer.

    Replace the first three sentences of 4.1.10 "Logical Operation":

    "Finally, a logical operation is applied between the incoming
    fragment's color or index values and the color or index values
    stored at the corresponding location in the framebuffer. The result
    replaces the values in the framebuffer at the fragment's (x[w],
    y[w]) coordinates. If the selected draw buffers refer to the same
    framebuffer-attachable image more than once, then the values stored
    in that image are undefined."

    Change section 4.2.1 "Selecting a Buffer for Writing", to read as follows:

    "The first such operation is controlling the buffers into which each of
    the fragment color values is written.  This is accomplished with either
    DrawBuffer or DrawBuffers. The command

        void DrawBuffer( enum buf );

    defines the set of color buffers to which fragment color zero is
    written. <buf> must be one of the values from tables 4.4 or 10.nnn. In
    addition, acceptable values for <buf> depend on whether the GL is using
    the default framebuffer (i.e., DRAW_FRAMEBUFFER_BINDING is zero), or a
    framebuffer object (i.e., DRAW_FRAMEBUFFER_BINDING is non-zero). In the
    initial state, the GL is bound to the default framebuffer. For more
    information about framebuffer objects, see section 4.4.

    If the GL is bound to the default framebuffer, then
    <buf> must be one the values listed in table 4.4, which summarizes
    the constants and the buffers they indicate.  In this case, <buf> is
    a symbolic constant specifying zero, one, two, or four buffers for
    writing. These constants refer to the four potentially visible
    buffers front left, front right, back left, and back right, and to
    the auxiliary buffers.  Arguments other than AUXi that omit
    reference to LEFT or RIGHT refer to both left and right buffers.
    Arguments other than AUXi that omit reference to FRONT or BACK refer
    to both front and back buffers.  AUXi enables drawing only to
    auxiliary buffer i.  Each AUXi adheres to AUXi = AUX0 + i,
    and i must be in the range 0 to the value of AUX_BUFFERS minus one.

    If the GL is bound to a framebuffer object,
    <buf> must be one of the values listed in table 10.nnn, which
    summarizes the constants and the buffers they indicate. In this
    case, <buf> is a symbolic constant specifying a single color buffer
    for writing.  Specifying COLOR_ATTACHMENTi enables drawing only
    to the image attached to the framebuffer at COLOR_ATTACHMENTi.
    Each COLOR_ATTACHMENTi adheres to COLOR_ATTACHMENTi =
    COLOR_ATTACHMENT0 + i.  The initial value of DRAW_BUFFER for
    application-created framebuffer objects is COLOR_ATTACHMENT0.


    Symbolic Constant               Meaning
    -----------------               -------
    NONE                            no buffer
    COLOR_ATTACHMENTi (see caption) output fragment color to image attached
                                    at color attachment point i
    -------------------------------------------------------------------
    Table 10.nnn:  Arguments to DrawBuffer(s) and ReadBuffer when the
    context is bound to a framebuffer object, and
    the buffers they indicate. i in COLOR_ATTACHMENTi may range from
    zero to the value of MAX_COLOR_ATTACHMENTS - 1.

    If the GL is bound to the default framebuffer and
    DrawBuffer is supplied with a constant (other than NONE) that does
    not indicate any of the color buffers allocated to the GL context,
    the error INVALID_OPERATION results.

    If the GL is bound to a framebuffer object and <buf> is one of the
    constants from table 4.4, then the error INVALID_OPERATION results.
    If <buf> is COLOR_ATTACHMENT<m> and <m> is greater than or equal to
    the value of MAX_COLOR_ATTACHMENTS, then the error INVALID_VALUE
    results.

    If DrawBuffer is supplied with a constant that is neither legal for
    the default framebuffer nor a framebuffer object, then the error
    INVALID_ENUM results.

    DrawBuffer will set the draw buffer for fragment colors other than
    zero to NONE.

    The command

        void DrawBuffers( sizei n, const enum *bufs );

    defines the draw buffers to which all fragment colors are written.
    <n> specifies the number of buffers in <bufs>.  <bufs> is a pointer
    to an array of symbolic constants specifying the buffer to which
    each fragment color is written.

    Each buffer listed in <bufs> must be one of the values from tables
    10.nnn or 11.nnn.  Otherwise, an INVALID_ENUM error is generated.
    Further, acceptable values for the constants in <bufs> depend on
    whether the GL is using the default
    framebuffer (i.e., DRAW_FRAMEBUFFER_BINDING is zero), or an
    framebuffer object (i.e.,
    DRAW_FRAMEBUFFER_BINDING is non-zero).  For more information about
    framebuffer objects, see section 4.4.


      symbolic       front  front   back   back   aux
      constant       left   right   left   right  i
      --------       -----  -----   ----   -----  ---
      NONE
      FRONT LEFT      X
      FRONT RIGHT             X
      BACK LEFT                      X
      BACK RIGHT                            X
      AUXi                                         X
      --------------------------------------------------
      Table 11.nnn: Arguments to DrawBuffers, when the context is bound
      to the default framebuffer, and the buffers that they indicate.

    If the GL is bound to the default
    framebuffer, then each of the constants must be one of the
    values listed in table 11.nnn.

    If the GL is bound to a framebuffer object,
    then each of the constants must be one of the values listed in table
    10.nnn.

    In both cases, the draw buffers being defined correspond in order to
    the respective fragment colors.  The draw buffer for fragment colors
    beyond <n> is set to NONE.

    The maximum number of draw buffers is implementation dependent and
    must be at least 1.  The number of draw buffers supported can be
    queried by calling GetIntegerv with the symbolic constant
    MAX_DRAW_BUFFERS. An INVALID_VALUE error is generated if <n> is
    greater than MAX_DRAW_BUFFERS.

    Except for NONE, a buffer may not appear more then once in the array
    pointed to by <bufs>.  Specifying a buffer more then once will
    result in the error INVALID_OPERATION.

    If fixed-function fragment shading is being performed, DrawBuffers
    specifies a set of draw buffers into which the fragment color is
    written.

    If a fragment shader writes to "gl_FragColor", DrawBuffers specifies
    a set of draw buffers into which the single fragment color defined
    by "gl_FragColor" is written.  If a fragment shader writes to
    "gl_FragData", DrawBuffers specifies a set of draw buffers into which
    each of the multiple fragment colors defined by "gl_FragData" are
    separately written.  If a fragment shader writes to neither
    "gl_FragColor" nor "gl_FragData", the values of the fragment colors
    following shader execution are undefined, and may differ for each
    fragment color.

    For both the default framebuffer and framebuffer objects,
    the constants FRONT, BACK, LEFT, RIGHT, and
    FRONT_AND_BACK are not valid in the <bufs> array passed to
    DrawBuffers, and will result in the error INVALID_OPERATION.  This
    restriction is because these constants may themselves refer to
    multiple buffers, as shown in table 4.4.

    If the GL is bound to the default framebuffer and
    DrawBuffers is supplied with a constant (other than NONE) that does
    not indicate any of the color buffers allocated to the GL context by
    the window system, the error INVALID_OPERATION will be generated.

    If the GL is bound to a framebuffer object and
    DrawBuffers is supplied with a constant from table 11.nnn, or
    COLOR_ATTACHMENTm where m is greater than or equal to the value of
    MAX_COLOR_ATTACHMENTS, then the error INVALID_OPERATION results.

    Indicating a buffer or buffers using DrawBuffer or DrawBuffers
    causes subsequent pixel color value writes to affect the indicated
    buffers.

    Specifying NONE as the draw buffer for a fragment color will inhibit
    that fragment color from being written to any buffer.

    Monoscopic contexts include only left buffers, while stereoscopic
    contexts include both left and right buffers.  Likewise, single
    buffered contexts include only front buffers, while double buffered
    contexts include both front and back buffers.  The type of context
    is selected at GL initialization.

    The state required to handle color buffer selection for each
    framebuffer is an integer
    for each supported fragment color.  For the default
    framebuffer, in the initial state, the draw
    buffer for fragment color zero is FRONT if there are no back
    buffers; otherwise it is BACK.  For framebuffer
    objects, in the initial state the draw buffer for fragment color zero is
    COLOR_ATTACHMENT0.  For both the default
    framebuffer and framebuffers objects, the initial state
    of draw buffers for fragment colors other then zero is NONE.

    The value of the draw buffer selected for fragment color <i> can be
    queried by calling GetIntegerv with the symbolic constant DRAW_BUFFERi.
    DRAW_BUFFER is equivalent to DRAW_BUFFER0."

    In section 4.2.2 "Fine Control of Buffer Updates", modify the beginning
    of the paragraph defining <mask> for StencilMask and StencilMaskSeparate
    as follows:

    Modify the second to last paragraph of section 4.2.4 "The Accumulation
    Buffer" as follows:

    "If there is no accumulation buffer, or if the DRAW_FRAMEBUFFER
    and READ_FRAMEBUFFER bindings (see section 4.4.4.2) do not refer to
    the same object, or if the GL is in color index mode, Accum
    generates the error INVALID_OPERATION."

    Replace section 4.3.1 "Writing to the Stencil Buffer" with the following:

    "4.3.1 Writing to the Stencil Buffer or to the Depth and Stencil
    Buffers

    The operation of DrawPixels was described in section 3.6.4, except
    if the <format> argument was STENCIL_INDEX or DEPTH_STENCIL.  In
    this case, all operations described for DrawPixels take place, but
    window (x,y) coordinates, each with the corresponding stencil index,
    or depth value and stencil index, are produced in lieu of fragments.
    Each coordinate-data pair is sent directly to the per-fragment
    operations, bypassing the texture, fog, and antialiasing application
    stages of rasterization.  Each pair is then treated as a fragment
    for purposes of the pixel ownership and scissor tests; all other
    per-fragment operations are bypassed.  Finally, each stencil index
    is written to its indicated location in the framebuffer, subject to
    the current front stencil mask (set with StencilMask or
    StencilMaskSeparate).  If a depth component is present, and if the
    setting of DepthMask is not FALSE, the depth component is also
    written to the framebuffer; the setting of DepthTest is ignored.

    The error INVALID_OPERATION results if the <format> argument is
    STENCIL_INDEX and there is no stencil buffer, or if <format> is
    DEPTH_STENCIL and there is not both a depth buffer and a stencil
    buffer."

    Add to 4.3.2 "Reading Pixels", right before the subsection titled
    "Obtaining Pixels from the Framebuffer":

    "ReadPixels generates an INVALID_OPERATION error
    if READ_FRAMEBUFFER_BINDING
    (see section 4.4) is non-zero, the read framebuffer is framebuffer
    complete, and the value of SAMPLE_BUFFERS for the read framebuffer
    is greater than zero."

    In section 4.3.2 "Reading Pixels", add the following paragraph
    after the second paragraph of the section "Obtaining Pixels from
    the Framebuffer":

    "If the <format> is DEPTH_STENCIL, then values are taken from
    both the depth buffer and the stencil buffer.  If there is no depth
    buffer or if there is no stencil buffer, then the error
    INVALID_OPERATION occurs.  If the <type> parameter is not
    UNSIGNED_INT_24_8, then the error INVALID_ENUM occurs.

    If there is a multisample buffer, then values are obtained from the
    depth and stencil samples in this buffer. It is recommended that the
    depth and stencil values of the centermost sample be used, though
    implementations may choose any function of the depth and stencil
    sample values at each pixel."

    In section 4.3.2 "Reading Pixels" in the subsection "Obtaining Pixels
    from the Framebuffer", modify the first two paragraphs of the
    definition of ReadBuffer to read as follows:

    "The command

         void ReadBuffer( enum src );

    takes a symbolic constant as argument.  <src> must be one of the
    values from tables 4.4 or 10.nnn.  Otherwise, INVALID_ENUM is
    generated.  Further, the acceptable values for <src> depend on
    whether the GL is using the default
    framebuffer (i.e., READ_FRAMEBUFFER_BINDING is zero), or a
    framebuffer object (i.e.,
    READ_FRAMEBUFFER_BINDING is non-zero).  For more information about
    framebuffer objects, see section 4.4.

    If the object bound to READ_FRAMEBUFFER_BINDING is not <framebuffer
    complete> (as defined in section 4.4.4.2), then ReadPixels generates
    the error INVALID_FRAMEBUFFER_OPERATION.  If ReadBuffer is
    supplied with a constant that is neither legal for the default
    framebuffer, nor legal for a
    framebuffer object, then the error INVALID_ENUM results.

    When READ_FRAMEBUFFER_BINDING is zero, i.e. the default framebuffer,
    <src> must be one of the values listed in table 4.4, including NONE.
    FRONT_AND_BACK, FRONT, and LEFT refer to the front left buffer, BACK
    refers to the back left buffer, and RIGHT refers to the front right
    buffer. The other constants correspond directly to the buffers that they
    name. If the requested buffer is missing, then the error
    INVALID_OPERATION is generated. For the default framebuffer, the initial
    setting for ReadBuffer is FRONT if there is no back buffer and BACK
    otherwise.

    When the GL is using a framebuffer object, <src> must be one of the
    values listed in table 10.nnn, including NONE. In a manner analogous to
    how the DRAW_BUFFERs state is handled, specifying COLOR_ATTACHMENTi
    enables reading from the image attached to the framebuffer at
    COLOR_ATTACHMENTi. For framebuffer objects, the initial setting for
    ReadBuffer is COLOR_ATTACHMENT0.

    ReadPixels generates an INVALID_OPERATION error if it attempts to select
    a color buffer while READ_BUFFER is NONE.

    ReadPixels obtains values from the selected buffer from each pixel
    with lower left hand corner at (x+i, y+j) for (0 <= i < width) and
    (0 <= j < height); this pixel is said to be the ith pixel in the jth
    row.  If any of these pixels lies outside of the window allocated to
    the current GL context, or outside of the image attached to the
    currently bound framebuffer object, then the values obtained for
    those pixels are undefined.  When READ_FRAMEBUFFER_BINDING is zero,
    results are also undefined for individual pixels that are not owned
    by the current context.  Otherwise, ReadPixels obtains values from
    the selected buffer, regardless of how those values were placed
    there."

    In section 4.3.2 "Reading Pixels", modify the last paragraph of the
    subsection "Obtaining Pixels from the Framebuffer", to say:

    "... If the GL is in color index mode, and <format> is not
    DEPTH_COMPONENT, STENCIL_INDEX, or DEPTH_STENCIL, then the color
    index is obtained at each pixel location."

    In section 4.3.2 "Reading Pixels", add a paragraph at the end of the
    subsection "Obtaining Pixels from the Framebuffer" immediately before
    "Conversion of RGBA values":

    "When READ_FRAMEBUFFER_BINDING is non-zero, the red, green, blue, and
    alpha values are obtained by first reading the internal component
    values of the corresponding value in the image attached to the
    selected logical buffer. Internal components are converted to an
    RGBA color by taking each R, G, B, and A component present according
    to the base internal format of the buffer (as shown in table 3.15).
    If G, B, or A values are not present in the internal format, they
    are taken to be zero, zero, and one respectively.

    In section 4.3.2 "Reading Pixels", update the first sentence of the
    subsection "Conversion of RGBA values" to say:

    "This step applies only if the GL is in RGBA mode, and then only if
    <format> is neither STENCIL_INDEX, DEPTH_COMPONENT, nor
    DEPTH_STENCIL."

    In section 4.3.2 "Reading Pixels", update the section "Conversion
    of Depth values" to say:

    "This step applies only if <format> is DEPTH_COMPONENT or
    DEPTH_STENCIL.  Each element taken from the depth buffer is
    taken to be a fixed-point value in [0,1] with m bits, where m is the
    number of bits in the depth buffer (see section 2.11.1)."

    Add a row to Table 4.6, in section 4.3.2 "Reading Pixels":

      type Parameter     Index Mask
      -----------------  ----------
      ...                ...
      INT                2^31-1
      UNSIGNED_INT_24_8  2^8-1

    Modify the first sentence of section 4.3.3 "Copying Pixels" as follows:

    "CopyPixels transfers a rectangle of pixel values from one region
    of the read framebuffer to another in the draw framebuffer."

    In section 4.3.3 "Copying Pixels", update the second and third
    paragraphs to say:

    "<type> is a symbolic constant that must be one of COLOR, STENCIL,
    DEPTH, or DEPTH_STENCIL, indicating that the values to be
    transferred are colors, stencil values, depth values, or
    depth/stencil values, respectively. The first four arguments have the
    same interpretation as the corresponding arguments to ReadPixels.

    Values are obtained from the framebuffer, converted (if
    appropriate), then subjected to the pixel transfer operations
    described in section 3.6.5, just as if ReadPixels were called with
    the corresponding arguments.  If the <type> is STENCIL or DEPTH,
    then it is as if the <format> for ReadPixels were STENCIL_INDEX, or
    DEPTH_COMPONENT, respectively.  If the <type> is DEPTH_STENCIL,
    then it is as if the <format> for ReadPixels were specified as
    described in table 4.6b.  If the <type> is COLOR, then if the GL is
    in RGBA mode, it is as if the <format> were RGBA, while if the GL is
    in color index mode, it is as if the <format> were COLOR_INDEX."

    Add Table 4.6b:

      DEPTH_BITS  STENCIL_BITS     format
      ----------  ------------  ---------------
         zero       zero        DEPTH_STENCIL
         zero       non-zero    DEPTH_COMPONENT
       non-zero     zero        STENCIL_INDEX
       non-zero     non-zero    DEPTH_STENCIL

       Table 4.6b: Effective ReadPixels format for DEPTH_STENCIL
       CopyPixels operation.

    Add a row to Table 4.7 (page 224):

      type Parameter                GL Type Component Conversion ...
      ---------------------------   ------- ---------------------------
      ...                           ...      ...
      UNSIGNED_INT_2_10_10_10_REV   uint    c = (2^N - 1)f
      UNSIGNED_INT_24_8             uint    c = (2^N - 1)f (depth only)

    Add the following text to section 4.3.3 "Copying Pixels", inside the
    definition of CopyPixels:

    "Finally, the behavior of several GL operations is specified "as if
    the arguments were passed to CopyPixels."  These operations include:
    CopyTex{Sub}Image*, CopyColor{Sub}Table, and CopyConvolutionFilter*.
    An INVALID_FRAMEBUFFER_OPERATION error will be generated if an attempt is
    made to execute one of these operations, or CopyPixels, while the
    object bound to READ_FRAMEBUFFER_BINDING (see section 4.4) is not
    "framebuffer complete" (as defined in section 4.4.4.2).
    An INVALID_OPERATION error will be generated if the object bound to
    READ_FRAMEBUFFER_BINDING is "framebuffer complete" and the value
    of SAMPLE_BUFFERS is greater than zero.

    CopyPixels will generate an INVALID_FRAMEBUFFER_OPERATION error
    if the object bound to DRAW_FRAMEBUFFER_BINDING (see section
    4.4) is not "framebuffer complete".

    Append to section 4.3.3 "Copying Pixels":

    "The command

    BlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1,
                       int dstX0, int dstY0, int dstX1, int dstY1,
                       bitfield mask, enum filter);

    transfers a rectangle of pixel values from one
    region of the read framebuffer to another in the draw framebuffer.
    There are some important distinctions from CopyPixels, as
    described below.

    <mask> is the bitwise OR of a number of values indicating which
    buffers are to be copied. The values are COLOR_BUFFER_BIT,
    DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT, which are described in
    section 4.2.3.  The pixels corresponding to these buffers are
    copied from the source rectangle bounded by the locations (srcX0,
    srcY0) and (srcX1, srcY1), to the destination rectangle bounded by
    the locations (dstX0, dstY0) and (dstX1, dstY1).  The lower bounds
    of the rectangle are inclusive, while the upper bounds are
    exclusive.

    When the color buffer is transferred, values are taken from the read
    buffer of the read framebuffer and written to each of the draw buffers
    of the draw framebuffer, just as with CopyPixels.

    The actual region taken from the read framebuffer is limited to the
    intersection of the source buffers being transferred, which may include
    the color buffer selected by the read buffer, the depth buffer, and/or
    the stencil buffer depending on <mask>.
    The actual region written to the draw framebuffer is limited to the
    intersection of the destination buffers being written, which may include
    multiple draw buffers, the depth buffer, and/or the stencil buffer
    depending on <mask>
    Whether or not the source or destination regions are altered due to
    these limits, the scaling and offset applied to pixels being transferred
    is performed as though no such limits were present.

    If the source and destination rectangle dimensions do not match,
    the source image is stretched to fit the destination
    rectangle. <filter> must be LINEAR or NEAREST and specifies the
    method of interpolation to be applied if the image is
    stretched. LINEAR filtering is allowed only for the color buffer;
    if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, and
    filter is not NEAREST, no copy is performed and an
    INVALID_OPERATION error is generated.  If the source and
    destination dimensions are identical, no filtering is applied.  If
    either the source or destination rectangle specifies a negative
    width or height (X1 < X0 or Y1 < Y0),
    the image is reversed in the corresponding direction.
    If both the source and destination rectangles specify a negative
    dimension for the same direction, no reversal is performed.
    If a linear filter is selected and the rules of LINEAR sampling
    would require sampling outside the bounds of a source buffer, it is
    as though CLAMP_TO_EDGE texture sampling were being performed. If a
    linear filter is selected and sampling would be required outside the
    bounds of the specified source region, but within the bounds of a
    source buffer, the implementation may choose to clamp while sampling
    or not.

    If the source and destination buffers are identical, and the
    source and destination rectangles overlap, the result of the blit
    operation is undefined.

    Blit operations bypass the fragment pipeline.  The only fragment
    operations which affect a blit are the pixel ownership test and
    the scissor test.

    If a buffer is specified in <mask> and does not exist in both the
    read and draw framebuffers, the corresponding bit is silently
    ignored.

    If the color formats of the read and draw framebuffers do not
    match, and <mask> includes COLOR_BUFFER_BIT, pixel groups are
    converted to match the destination format as in CopyPixels.
    However, no pixel transfer operations are applied, and clamping
    behaves as if CLAMP_FRAGMENT_COLOR_ARB is set to FIXED_ONLY_ARB.
    Format conversion is not supported for all data types. If the read
    buffer contains floating-point values and any draw buffer does not
    contain floating-point values, or if the read buffer contains
    non-floating-point values and any draw buffer contains
    floating-point values, an INVALID_OPERATION error is generated.

    Calling BlitFramebuffer will result in an
    INVALID_FRAMEBUFFER_OPERATION error if the objects bound to
    DRAW_FRAMEBUFFER_BINDING and READ_FRAMEBUFFER_BINDING are
    not "framebuffer complete" (see section 4.4.4.2)."

    Calling BlitFramebuffer will result in an INVALID_OPERATION
    error if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
    and the source and destination depth and stencil buffer formats do
    not match.

    If SAMPLE_BUFFERS for the read framebuffer is greater than zero and
    SAMPLE_BUFFERS for the draw framebuffer is zero, the samples
    corresponding to each pixel location in the source are converted to
    a single sample before being written to the destination.

    If SAMPLE_BUFFERS for the read framebuffer is zero and
    SAMPLE_BUFFERS for the draw framebuffer is greater than zero, the
    value of the source sample is replicated in each of the destination
    samples.

    If SAMPLE_BUFFERS for both the read and draw framebuffers are
    greater than zero, and the values of SAMPLES for the read and draw
    framebuffers are identical, the samples are copied without
    modification from the read framebuffer to the draw framebuffer.
    Otherwise, no copy is performed and an INVALID_OPERATION error is
    generated. Note that the samples in the draw buffer are not
    guaranteed to be at the same sample location as the read buffer,
    so rendering using this newly created buffer can potentially
    have geometry cracks or incorrect antialiasing. This may occur
    if the sizes of the framebuffers do not match, if the
    formats differ, or if the source and destination rectangles are
    not defined with the same (X0,Y0) and (X1,Y1) bounds.

    If SAMPLE_BUFFERS for either the read framebuffer or
    draw framebuffer is greater than zero, no copy is performed and an
    INVALID_OPERATION error is generated if the dimensions of the source
    and destination rectangles provided to BlitFramebuffer are not
    identical, or if the formats of the read and draw framebuffers are
    not identical.


    Add a new section "Framebuffer Objects" after section 4.3:

    "4.4 Framebuffer Objects

    As described in chapters 1 and 2, GL renders into (and reads values
    from) a framebuffer.  GL defines two classes of framebuffers:
    window-system-provided framebuffers and application-created
    framebuffers.  For each GL context, there is a single framebuffer
    provided by the window-system, and there may also be one or more
    framebuffer objects created and managed by the application.

    By default, the GL uses the window-system-provided framebuffer.  The
    storage, dimensions, allocation, and format of the images attached
    to this framebuffer are managed entirely by the window-system.
    Consequently, the state of the window-system-provided framebuffer,
    including its images, can not be changed by the GL, nor can the
    window-system-provided framebuffer itself, or its images, be deleted
    by the GL.

    The routines described in the following sections, however, can be
    used to create, destroy, and modify the state and attachments of
    application-created framebuffer objects.

    Application-created framebuffer objects encapsulate the state of a
    framebuffer in a similar manner to the way texture objects
    encapsulate the state of a texture.  In particular, a framebuffer
    object encapsulates state necessary to describe a collection of
    color, depth, and stencil logical buffers (accumulation and
    auxiliary buffers are not allowed).  For each
    logical buffer, a framebuffer-attachable image can be attached to
    the framebuffer to store the rendered output for that logical
    buffer.  Examples of framebuffer-attachable images include texture
    images and renderbuffer images.  Renderbuffers are described further
    in section 4.4.2.1

    By allowing the images of a renderbuffer to be attached to a
    framebuffer, the GL provides a mechanism to support "off-screen"
    rendering.  Further, by allowing the images of a texture to be
    attached to a framebuffer, the GL provides a mechanism to support
    "render to texture".

    4.4.1 Binding and Managing Framebuffer Objects

    The default framebuffer for rendering and readback operations is
    provided by the window system.  In addition, named framebuffer
    objects can be created and operated upon.  The namespace for
    framebuffer objects is the unsigned integers, with zero reserved
    by the GL for the default framebuffer.

    A framebuffer object is created by binding
    a name returned by GenFramebuffers (see below) to
    DRAW_FRAMEBUFFER or READ_FRAMEBUFFER.  The binding is
    effected by calling

        void BindFramebuffer(enum target, uint framebuffer);

    with <target> set to the desired framebuffer target and
    <framebuffer> set to the framebuffer object name.
    The resulting framebuffer
    object is a new state vector, comprising all the state values
    listed in table 4.nnn, as well as one set of the state values
    listed in table 5.nnn for each attachment point of the
    framebuffer, set to the same initial values.  There are
    MAX_COLOR_ATTACHMENTS color attachment points, plus one each
    for the depth and stencil attachment points.

    BindFramebuffer may also be used to bind an existing
    framebuffer object to DRAW_FRAMEBUFFER or
    READ_FRAMEBUFFER.  If the bind is successful no change is made
    to the state of the bound framebuffer object, and any previous
    binding to <target> is broken.

    BindFramebuffer fails and an INVALID_OPERATION error is generated if
    <framebuffer> is not zero or a name returned from a previous call to
    GenFramebuffers, or if such a name has since been deleted with
    DeleteFramebuffers.

    If a framebuffer object is bound to DRAW_FRAMEBUFFER or
    READ_FRAMEBUFFER, it becomes the target for rendering or
    readback operations, respectively, until it is deleted or another
    framebuffer is bound to the corresponding bind point. Calling
    BindFramebuffer with <target> set to FRAMEBUFFER binds the
    framebuffer to both the draw and read targets.

    While a framebuffer object is bound, GL operations on the target
    to which it is bound affect the images attached to the bound
    framebuffer object, and queries of the target to which it is bound
    return state from the bound object.  Queries of the values
    specified in table 6.31 (Implementation Dependent Pixel Depths)
    and table 8.nnn (Framebuffer-Dependent State Variables) are
    derived from the framebuffer object bound to DRAW_FRAMEBUFFER.

    The initial state of DRAW_FRAMEBUFFER and READ_FRAMEBUFFER
    refers to the default framebuffer.
    In order that access to the default framebuffer is not
    lost, it is treated as a framebuffer object with the name of zero.
    The default framebuffer is therefore rendered to and read from
    while zero is bound to the corresponding targets.  On some
    implementations, the properties of the default framebuffer can
    change over time (e.g., in response to window system events
    such as attaching the context to a new window system drawable.)

    Framebuffer objects (those with a non-zero
    name) differ from the default framebuffer in
    a few important ways.  First and foremost, unlike the
    default framebuffer, framebuffer objects
    have modifiable attachment points for each logical buffer in the
    framebuffer.  Framebuffer-attachable images can be attached to and
    detached from these attachment points, which are described further
    in section 4.4.2.  Also, the size and format of the images attached
    to application-created framebuffers are controlled entirely within
    the GL interface, and are not affected by window system events, such
    as pixel format selection, window resizes, and display mode changes.

    Additionally, when rendering to or reading from an application
    created-framebuffer object,

          - The pixel ownership test always succeeds.  In other words,
            framebuffer objects own all of their pixels.

          - There are no visible color buffer bitplanes.  This means
            there is no color buffer corresponding to the back, front,
            left, or right color bitplanes.

          - The only color buffer bitplanes are the ones defined by the
            framebuffer attachment points named COLOR_ATTACHMENT0
            through COLOR_ATTACHMENTn.

          - The only depth buffer bitplanes are the ones defined by the
            framebuffer attachment point DEPTH_ATTACHMENT.

          - The only stencil buffer bitplanes are the ones defined by
            the framebuffer attachment point STENCIL_ATTACHMENT.

          - There are no accum buffer bitplanes, so the value of the
            implementation-dependent state variables ACCUM_RED_BITS,
            ACCUM_GREEN_BITS, ACCUM_BLUE_BITS, and ACCUM_ALPHA_BITS, are
            all zero.

          - There are no AUX buffer bitplanes, so the value of the
            implementation-dependent state variable AUX_BUFFERS is zero.

          - If the attachment sizes are not all identical, rendering will be
            limited to the largest area that can fit in all of the
            attachments (i.e. an intersection of rectangles having a lower
            left of (0,0) and an upper right of (width,height) for each
            attachment)

          - If the attachment sizes are not all identical, the values of
            pixels outside the common intersection area after rendering are
            undefined.

    Framebuffer objects are deleted by calling

      void DeleteFramebuffers(sizei n, uint *framebuffers);

    <framebuffers> contains <n> names of framebuffer objects to be
    deleted.  After a framebuffer object is deleted, it has no
    attachments, and its name is again unused.  If a framebuffer that
    is currently bound to one or more of the targets
    DRAW_FRAMEBUFFER or READ_FRAMEBUFFER is deleted, it is as
    though BindFramebuffer had been executed with the corresponding
    <target> and <framebuffer> zero.   Unused names in
    <framebuffers> are silently ignored, as is the value zero.

    The command

      void GenFramebuffers(sizei n, uint *ids);

    returns <n> previously unused framebuffer object names in <ids>.
    These names are marked as used, for the purposes of
    GenFramebuffers only, but they acquire state and type only when
    they are first bound, just as if they were unused.

    The names bound to the draw and read framebuffer bindings can be
    queried by calling GetIntegerv with the symbolic constants
    DRAW_FRAMEBUFFER_BINDING and READ_FRAMEBUFFER_BINDING
    respectively. FRAMEBUFFER_BINDING is equivalent to
    DRAW_FRAMEBUFFER_BINDING.

    4.4.2 Attaching Images to Framebuffer Objects

    Framebuffer-attachable images may be attached to, and detached from,
    framebuffer objects.  In contrast, the image
    attachments of the default framebuffer may not be
    changed by the GL.

    A single framebuffer-attachable image may be attached to multiple
    framebuffer objects, potentially avoiding some
    data copies, and possibly decreasing memory consumption.

    For each logical buffer, a framebuffer object stores a set of
    state which defines the logical buffer's <attachment point>.  The
    attachment point state contains enough information to identify the
    single image attached to the attachment point, or to indicate that
    no image is attached.  The per-logical buffer attachment point
    state is listed in table 5.nnn

    There are two types of framebuffer-attachable images: the image of a
    renderbuffer object, and an image of a texture object.

    4.4.2.1 Renderbuffer Objects

    A renderbuffer is a data storage object containing a single image of
    a renderable internal format.  GL provides the methods described
    below to allocate and delete a renderbuffer's image, and to attach a
    renderbuffer's image to a framebuffer object.

    The name space for renderbuffer objects is the unsigned integers,
    with zero reserved for the GL.  A renderbuffer object is created by
    binding a name returned by GenRenderbuffers (see below)
    to RENDERBUFFER.  The binding is effected by calling

        void BindRenderbuffer( enum target, uint renderbuffer );

    with <target> set to RENDERBUFFER and <renderbuffer> set to the
    unused name.  If <renderbuffer> is not zero, then the resulting
    renderbuffer object is a new state vector, initialized with a
    zero-sized memory buffer, and comprising the state values listed in
    Table 8.nnn.  Any previous binding to <target> is broken.

    BindRenderbuffer may also be used to bind an existing
    renderbuffer object.  If the bind is successful, no change is made
    to the state of the newly bound renderbuffer object, and any
    previous binding to <target> is broken.

    While a renderbuffer object is bound, GL operations on the target to
    which it is bound affect the bound renderbuffer object, and queries
    of the target to which a renderbuffer object is bound return state
    from the bound object.

    The name zero is reserved.  A renderbuffer object cannot be created
    with the name zero.  If <renderbuffer> is zero, then any previous
    binding to <target> is broken and the <target> binding is restored
    to the initial state.

    In the initial state, the reserved name zero is bound to
    RENDERBUFFER.  There is no renderbuffer object corresponding to
    the name zero, so client attempts to modify or query renderbuffer
    state for the target RENDERBUFFER while zero is bound will
    generate GL errors, as described in section 6.1.3.

    The current RENDERBUFFER binding can be determined by calling
    GetIntegerv with the symbolic constant RENDERBUFFER_BINDING.

    BindRenderbuffer fails and an INVALID_OPERATION error is generated
    if <renderbuffer> is not a name returned from a previous call to
    GenRenderbuffers, or if such a name has since been deleted with
    DeleteRenderbuffers.

    Renderbuffer objects are deleted by calling

        void DeleteRenderbuffers( sizei n, const uint *renderbuffers );

    where <renderbuffers> contains <n> names of renderbuffer objects to be
    deleted.  After a renderbuffer object is deleted, it has no
    contents, and its name is again unused.  If a renderbuffer that is
    currently bound to RENDERBUFFER is deleted, it is as though
    BindRenderbuffer had been executed with the <target>
    RENDERBUFFER and <name> of zero.  Additionally, special care
    must be taken when deleting a renderbuffer if the image of the
    renderbuffer is attached to a framebuffer object (see section
    4.4.2.2 for details).  Unused names in <renderbuffers> are silently
    ignored, as is the value zero.

    The command

        void GenRenderbuffers( sizei n, uint *renderbuffers );

    returns <n> previously unused renderbuffer object names in
    <renderbuffers>.  These names are marked as used, for the purposes
    of GenRenderbuffers only, but they acquire renderbuffer state
    only when they are first bound, just as if they were unused.

    The command

        void RenderbufferStorageMultisample(enum target, sizei samples,
                                               enum internalformat,
                                               sizei width, sizei height);

    establishes the data storage, format, dimensions, and number of
    samples of a renderbuffer object's image.  <target> must be
    RENDERBUFFER.  <internalformat> must be color-renderable, depth-
    renderable, or stencil-renderable (as defined in section 4.4.4).
    <width> and <height> are the dimensions in pixels of the renderbuffer.
    If either <width> or <height> is greater than MAX_RENDERBUFFER_SIZE,
    or if <samples> is greater than MAX_SAMPLES,
    then the error INVALID_VALUE is
    generated. If the GL is unable to create a data store of the
    requested size, the error OUT_OF_MEMORY is generated.

    Upon success, RenderbufferStorageMultisample deletes any existing
    data store for the renderbuffer image and the contents of the data
    store after calling RenderbufferStorageMultisample are undefined.
    RENDERBUFFER_WIDTH is set to <width>, RENDERBUFFER_HEIGHT is
    set to <height>, and RENDERBUFFER_INTERNAL_FORMAT is set to
    <internalformat>.

    If <samples> is zero, then RENDERBUFFER_SAMPLES is set to zero.
    Otherwise <samples> represents a request for a desired minimum
    number of samples. Since different implementations may support
    different sample counts for multisampled rendering, the actual
    number of samples allocated for the renderbuffer image is
    implementation dependent.  However, the resulting value for
    RENDERBUFFER_SAMPLES is guaranteed to be greater than or equal
    to <samples> and no more than the next larger sample count supported
    by the implementation.

    Sized                 Base               S
    Internal Format       Internal format    Bits
    ---------------       ---------------    ----
    STENCIL_INDEX1        STENCIL_INDEX      1
    STENCIL_INDEX4        STENCIL_INDEX      4
    STENCIL_INDEX8        STENCIL_INDEX      8
    STENCIL_INDEX16       STENCIL_INDEX      16
    ----------------------------------------------------------------
    Table 2.nnn Desired component resolution for each sized internal
    format that can be used only with renderbuffers.

    A GL implementation may vary its allocation of internal component
    resolution based on any RenderbufferStorage parameter (except
    target), but the allocation and chosen internal format must not be a
    function of any other state and cannot be changed once they are
    established.

    The command

        void RenderbufferStorage(enum target, enum internalformat,
                                    sizei width, sizei height);

     is equivalent to calling RenderbufferStorageMultisample with
     <samples> equal to zero."

    4.4.2.2 Attaching Renderbuffer Images to a Framebuffer

    A renderbuffer can be attached as one of the logical buffers of the
    currently bound framebuffer object by calling

        void FramebufferRenderbuffer(enum target,
                                        enum attachment,
                                        enum renderbuffertarget,
                                        uint renderbuffer);

    <target> must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or
    FRAMEBUFFER. FRAMEBUFFER is equivalent to
    DRAW_FRAMEBUFFER.
    An INVALID_OPERATION error is generated if the value of the
    corresponding binding is zero. <attachment> should be set to
    one of the attachment points of the framebuffer listed in table
    1.nnn.  <renderbuffertarget> must be RENDERBUFFER and
    <renderbuffer> should be set to the name of the renderbuffer object
    to be attached to the framebuffer.  <renderbuffer> must be either
    zero or the name of an existing renderbuffer object of type
    <renderbuffertarget>, otherwise an INVALID_OPERATION error is
    generated. If <renderbuffer> is zero, then the value of
    <renderbuffertarget> is ignored.

    If <renderbuffer> is not zero and if FramebufferRenderbuffer is
    successful, then the renderbuffer named <renderbuffer> will be used
    as the logical buffer identified by <attachment> of the framebuffer
    currently bound to <target>.  The value of
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE for the specified attachment
    point is set to RENDERBUFFER and the value of
    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME is set to <renderbuffer>. All
    other state values of the attachment point specified by <attachment>
    are set to their default values listed in table 5.nnn. No change is
    made to the state of the renderbuffer object and any previous
    attachment to the <attachment> logical buffer of the framebuffer
    object bound to framebuffer <target> is broken.  If
    the attachment is not successful, then no change is made to
    the state of either the renderbuffer object or the framebuffer
    object.

    Calling FramebufferRenderbuffer with the <renderbuffer> name zero
    will detach the image, if any, identified by <attachment>, in the
    framebuffer currently bound to <target>.  All state values of the
    attachment point specified by <attachment> in the object bound to
    <target> are set to their default values listed in table 5.nnn.

    Setting <attachment> to the value DEPTH_STENCIL_ATTACHMENT is a
    special case causing both the depth and stencil attachments of the
    framebuffer object to be set to <renderbuffer>, which should have
    base internal format DEPTH_STENCIL.

    If a renderbuffer object is deleted while its image is attached to
    one or more attachment points in the currently bound framebuffer,
    then it is as if FramebufferRenderbuffer had been called, with
    a <renderbuffer> of 0, for each attachment point to which this image
    was attached in the currently bound framebuffer.  In other words,
    this renderbuffer image is first detached from all attachment points
    in the currently bound framebuffer.  Note that the renderbuffer
    image is specifically *not* detached from any non-bound
    framebuffers.  Detaching the image from any non-bound framebuffers
    is the responsibility of the application.

        Name of attachment
        -----------------------------------------------------
        COLOR_ATTACHMENTi (see caption)
        DEPTH_ATTACHMENT
        STENCIL_ATTACHMENT
        DEPTH_STENCIL_ATTACHMENT
        -----------------------------------------------------
        Table 1.nnn: Framebuffer attachment points. <i> in
        COLOR_ATTACHMENTi may range from zero to the value of
         MAX_COLOR_ATTACHMENTS - 1.

    4.4.2.3 Attaching Texture Images to a Framebuffer

    GL supports copying the rendered contents of the framebuffer into
    the images of a texture object through the use of the routines
    CopyTexImage{1D|2D}, and CopyTexSubImage{1D|2D|3D}.  Additionally,
    GL supports rendering directly into the images of a texture object.

    To render directly into a texture image, a specified image from a
    texture object can be attached as one of the logical buffers of the
    currently bound framebuffer object by calling one of the following
    routines, depending on the type of the texture:

        void FramebufferTexture1D(enum target, enum attachment,
                                     enum textarget, uint texture,
                                     int level);
        void FramebufferTexture2D(enum target, enum attachment,
                                     enum textarget, uint texture,
                                     int level);
        void FramebufferTexture3D(enum target, enum attachment,
                                     enum textarget, uint texture,
                                     int level, int layer);

    In all three routines, <target> must be DRAW_FRAMEBUFFER,
    READ_FRAMEBUFFER or FRAMEBUFFER. FRAMEBUFFER is
    equivalent to DRAW_FRAMEBUFFER.
    An INVALID_OPERATION error is generated if the
    value of the corresponding binding is zero.
    <attachment> must be one of the attachment points of the
    framebuffer listed in table 1.nnn.

    If <texture> is zero, the image identified by <attachment>, if
    any, will be detached from the framebuffer currently bound to
    <target>. <textarget>, <level>, and <layer> are ignored. All
    state values of the attachment point specified by <attachment> are
    set to their default values listed in table 5.nnn.

    If <texture> is not zero, then <texture> must either name an existing
    texture object with a target of <textarget>, or <texture> must name an
    existing cube map texture and <textarget> must be one of
    TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
    TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_X,
    TEXTURE_CUBE_MAP_NEGATIVE_Y, or TEXTURE_CUBE_MAP_NEGATIVE_Z. Otherwise,
    an INVALID_OPERATION error is generated.

    <level> specifies the mipmap level of the texture image to be
    attached to the framebuffer.

    If <textarget> is TEXTURE_RECTANGLE_ARB, then <level> must be zero.
    If <textarget> is TEXTURE_3D, then <level> must be greater than or
    equal to zero and less than or equal to log base 2 of the value of
    MAX_3D_TEXTURE_SIZE.  If <textarget> is one of
    TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
    TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_X,
    TEXTURE_CUBE_MAP_NEGATIVE_Y, or TEXTURE_CUBE_MAP_NEGATIVE_Z, then
    <level> must be greater than or equal to zero and less than or equal
    to log base 2 of the value of MAX_CUBE_MAP_TEXTURE_SIZE. For all other
    values of <textarget>, <level> must be greater than or equal to zero and
    no larger than log base 2 of the value of MAX_TEXTURE_SIZE. Otherwise,
    an INVALID_VALUE error is generated.

    <layer> specifies the layer of a 2-dimensional image within a
    3-dimensional texture. An INVALID_VALUE error is generated if
    <layer> is larger than the value of MAX_3D_TEXTURE_SIZE-1.

    For FramebufferTexture1D, if <texture> is not zero, then
    <textarget> must be TEXTURE_1D.

    For FramebufferTexture2D, if <texture> is not zero, then
    <textarget> must be one of TEXTURE_2D, TEXTURE_RECTANGLE_ARB,
    TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
    TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_X,
    TEXTURE_CUBE_MAP_NEGATIVE_Y, or TEXTURE_CUBE_MAP_NEGATIVE_Z.

    For FramebufferTexture3D, if <texture> is not zero, then
    <textarget> must be TEXTURE_3D.

    If <texture> is not zero, and if FramebufferTexture{1D|2D|3D} is
    successful, then the specified texture image will be used as the
    logical buffer identified by <attachment> of the framebuffer
    currently bound to <target>.  The value of
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE for the specified attachment
    point is set to TEXTURE and the value of
    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME is set to <texture>.
    Additionally, the value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL for
    the named attachment point is set to <level>.  If <texture> is a
    cube map texture, then the value of
    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE the named attachment
    point is set to <textarget>.  If <texture> is a 3D texture, then the
    value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER for the named
    attachment point is set to <layer>.  All other state values of the
    attachment point specified by <attachment> are set to their default
    values listed in table 5.nnn.  No change is made to the state of the
    texture object, and any previous attachment to the <attachment>
    logical buffer of the framebuffer object bound to framebuffer
    <target> is broken.  If the attachment is not
    successful, then no change is made to the state of either the
    texture object or the framebuffer object.

    Setting <attachment> to the value DEPTH_STENCIL_ATTACHMENT is a
    special case causing both the depth and stencil attachments of the
    framebuffer object to be set to <texture>. <texture> must have base
    internal format DEPTH_STENCIL, or the depth and stencil
    framebuffer attachments will be incomplete (see section 4.4.4.1).

    The command

    void FramebufferTextureLayer(enum target,enum attachment,
                                    uint texture,int level,int layer);

    operates identically to FramebufferTexture3D, except that it
    attaches a single layer of a three-dimensional texture, or one- or
    two-dimensional array texture. <layer> is an integer indicating the
    layer number, and is treated identically to the <layer> parameter in
    FramebufferTexture3D. The error INVALID_VALUE is generated if
    <layer> is negative. The error INVALID_OPERATION is generated if
    <texture> is non-zero and is not the name of a three dimensional
    texture, or one- or two-dimensional array texture.

    Unlike FramebufferTexture3D, no <textarget> parameter is accepted.

    If <texture> is non-zero and the command does not result in an
    error, the framebuffer attachment state corresponding to
    <attachment> is updated as in the other FramebufferTexture commands,
    except that FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER is set to
    <layer>.

    If a texture object is deleted while its image is attached to one or
    more attachment points in the currently bound framebuffer, then it
    is as if FramebufferTexture* had been called, with a <texture> of
    zero, for each attachment point to which this image was attached in
    the currently bound framebuffer. In other words, this texture image
    is first detached from all attachment points in the currently bound
    framebuffer. Note that the texture image is specifically *not*
    detached from any other framebuffer objects. Detaching the texture
    image from any other framebuffer objects is the responsibility of
    the application.

    4.4.3  Rendering When an Image of a Bound Texture Object is Also
    Attached to the Framebuffer

    The mechanisms for attaching textures to a framebuffer object do not
    prevent a one- or two-dimensional texture level, a face of a cube
    map texture level, or a layer of a two-dimensional array or
    three-dimensional texture from being attached to the draw
    framebuffer while the same texture is bound to a texture unit. While
    any of these conditions hold, texturing operations accessing that
    image will produce undefined results, as described at the end of
    section 3.8.8. Conditions resulting in such undefined behavior are
    defined in more detail below. Such undefined texturing operations
    are likely to leave the final results of the shader or
    fixed-function fragment processing operations undefined, and should
    be avoided.

    Special precautions need to be taken to avoid attaching a texture
    image to the currently bound framebuffer while the texture object is
    currently bound and enabled for texturing.  Doing so could lead to
    the creation of a <feedback loop> between the writing of pixels by
    the GL's rendering operations and the simultaneous reading of those
    same pixels when used as texels in the currently bound texture.  In
    this scenario, the framebuffer will be considered framebuffer
    complete (see section 4.4.4), but the values of fragments rendered
    while in this state will be undefined.  The values of texture
    samples may be undefined as well, as described at the end of the
    "Scale Factor and Level of Detail" subsection of section 3.8.8.

    Specifically, the values of rendered fragments are undefined if all
    of the following conditions are true:

        - an image from texture object <T> is attached to the currently
          bound framebuffer at attachment point <A>, and

        - the texture object <T> is currently bound to a texture unit
          <U>, and

        - the current fixed-function texture state or programmable
          vertex and/or fragment processing state makes it possible(*)
          to sample from the texture object <T> bound to texture unit
          <U>

    while either of the following conditions are true:

        - the value of TEXTURE MIN FILTER for texture object <T> is
          NEAREST or LINEAR, and the value of
          FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL for attachment point
          <A> is equal to the value of TEXTURE_BASE_LEVEL for the
          texture object <T>, or

        - the value of TEXTURE_MIN_FILTER for texture object <T> is one
          of NEAREST_MIPMAP_NEAREST, NEAREST_MIPMAP LINEAR, LINEAR
          MIPMAP_NEAREST, or LINEAR_MIPMAP_LINEAR, and the value of
          FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL for attachment point
          <A> is within the range specified by the current values of
          TEXTURE_BASE_LEVEL to q, inclusive, for the texture object
          <T>.  (q is defined in the Mipmapping discussion of section
          3.8.8),

    (*) For the purpose of this discussion, it is <possible>
        to sample from the texture object <T> bound to texture unit <U>
        if any of the following are true:

        - Programmable vertex and fragment processing is disabled
          and the target of texture object <T> is enabled according
          to the texture target precedence rules of section 3.8.15
        - FRAGMENT_PROGRAM_ARB is enabled and the currently bound
          fragment program contains any instructions that
          sample from the texture object <T> bound to <U>
        - The active fragment or vertex shader contains any instructions
          that might sample from the texture object <T> bound to <U> if even
          those instructions might only be executed conditionally.

    Note that if TEXTURE_BASE_LEVEL and TEXTURE_MAX_LEVEL exclude any
    levels containing image(s) attached to the currently bound
    framebuffer, then the above conditions will not be met, (i.e., the
    above rule will not cause the values of rendered fragments to be
    undefined.)

    4.4.4 Framebuffer Completeness

    A framebuffer must be <framebuffer complete> to effectively be used
    as the draw or read framebuffer of the GL.

    The default framebuffer is always complete if it exists; however, if no
    default framebuffer exists (no window system-provided drawable is
    associated with the GL context), it is deemed to be incomplete.

    A framebuffer object is said to be framebuffer complete if all of
    its attached images, and all framebuffer parameters required to
    utilize the framebuffer for rendering and reading, are consistently
    defined and meet the requirements defined below.  The rules of
    framebuffer completeness are dependent on the properties of the
    attached images, and on certain implementation dependent
    restrictions.

    The internal formats of the attached images can affect the
    completeness of the framebuffer, so it is useful to first define the
    relationship between the internal format of an image and the
    attachment points to which it can be attached.

        * The following base internal formats from table 3.15 are
          <color-renderable>: ALPHA, LUMINANCE, LUMINANCE_ALPHA,
          INTENSITY, RED, RG, RGB, RGBA, FLOAT_R_NV, FLOAT_RG_NV,
          FLOAT_RGB_NV, and FLOAT_RGBA_NV. The sized
          internal formats from table 3.16 that have a color-renderable
          base internal format are also color-renderable. No other
          formats, including compressed internal formats, are
          color-renderable.

        * An internal format is <depth-renderable> if it is
          DEPTH_COMPONENT or one of the formats from table 3.16 whose
          base internal format is DEPTH_COMPONENT or DEPTH_STENCIL.
          No other formats are depth-renderable.

        * An internal format is <stencil-renderable> if it is
          STENCIL_INDEX or DEPTH_STENCIL, if it is one of the
          STENCIL_INDEX formats from table 2.nnn, or if it is one of the
          formats from table 3.16 whose base internal format is
          DEPTH_STENCIL.  No other formats are stencil-renderable."

    4.4.4.1 Framebuffer Attachment Completeness

    If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE for the
    framebuffer attachment point <attachment> is not NONE, then it is
    said that a framebuffer-attachable image, named <image>, is attached
    to the framebuffer at the attachment point.  <image> is identified
    by the state in <attachment> as described in section 4.4.2.

    The framebuffer attachment point <attachment> is said to be
    <framebuffer attachment complete> if the value of
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE for <attachment> is NONE
    (i.e., no image is attached), or if all of the following conditions
    are true:

      * <image> is a component of an existing object with the name
        specified by FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, and of the
        type specified by FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE.

      * The width and height of <image> must be non-zero.

      * If FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE and
        FRAMEBUFFER_ATTACHMENT_OBJECT_NAME names a 3-dimensional
        texture, then FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER must be
        smaller than the depth of the texture.

      * If <attachment> is COLOR_ATTACHMENTi, then <image> must have
        a color-renderable internal format.

      * If <attachment> is DEPTH_ATTACHMENT, then <image> must have
        a depth-renderable internal format.

      * If <attachment> is STENCIL_ATTACHMENT, then <image> must
        have a stencil-renderable internal format.

    4.4.4.2 Whole Framebuffer Completeness

    Each rule below is followed by an error enum enclosed in { brackets }.
    The meaning of these errors is explained below and under ``Effects of
    Framebuffer Completeness on Framebuffer Operations'' later in section
    4.4.4.

    The framebuffer object <target> is said to be "framebuffer complete" if
    all the following conditions are true:

      * <target> is the default framebuffer, and the default framebuffer
        exists.
        { FRAMEBUFFER_UNDEFINED }

      * All framebuffer attachment points are framebuffer attachment
        complete.
        { FRAMEBUFFER_INCOMPLETE_ATTACHMENT }

      * There is at least one image attached to the framebuffer.
        { FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT }

      * The value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE must not be
        NONE for any color attachment point(s) named by DRAW_BUFFERi.
        { FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER }

      * If READ_BUFFER is not NONE, then the value of
        FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE must not be NONE for the
        color attachment point named by READ_BUFFER.
        { FRAMEBUFFER_INCOMPLETE_READ_BUFFER }

      * The combination of internal formats of the attached
        images does not violate an implementation-dependent set of
        restrictions.
        { FRAMEBUFFER_UNSUPPORTED }

      * The value of RENDERBUFFER_SAMPLES is the same for all attached
        images.
        { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE }


    The token in { brackets } after each clause of the framebuffer
    completeness rules specifies the return value of
    CheckFramebufferStatus (see below) that is generated when that
    clause is violated.  If more than one clause is violated, it is
    implementation-dependent exactly which value will be returned by
    CheckFramebufferStatus.

    Performing any of the following actions may change whether the
    framebuffer is considered complete or incomplete.

      - Binding to a different framebuffer with BindFramebuffer.

      - Attaching an image to the framebuffer with
        FramebufferTexture{1D|2D|3D} or FramebufferRenderbuffer.

      - Detaching an image from the framebuffer with
        FramebufferTexture{1D|2D|3D} or FramebufferRenderbuffer.

      - Changing the internal format of a texture image that is attached
        to the framebuffer by calling {Copy|Compressed}TexImage{1D|2D|3D}.

      - Changing the internal format of a renderbuffer that is attached
        to the framebuffer by calling RenderbufferStorage.

      - Deleting, with DeleteTextures or DeleteRenderbuffers, an object
        containing an image that is attached to a framebuffer object
        that is bound to the framebuffer.

      - Changing READ_BUFFER or one of the DRAW_BUFFERS.

      - Associating a different window system-provided drawable, or no
        drawable, with the default framebuffer using a window system binding
        API such as GLX, WGL, CGL, or EGL.

    Although GL defines a wide variety of internal formats for
    framebuffer-attachable images, such as texture images and
    renderbuffer images, some implementations may not support rendering
    to particular combinations of internal formats.  If the combination
    of formats of the images attached to a framebuffer object are not
    supported by the implementation, then the framebuffer is not
    complete under the clause labeled FRAMEBUFFER_UNSUPPORTED. There
    must exist, however, at least one combination of internal formats
    for which the framebuffer cannot be FRAMEBUFFER_UNSUPPORTED.

    Because of the <implementation-dependent> clause of the framebuffer
    completeness test in particular, and because framebuffer
    completeness can change when the set of attached images is modified,
    it is strongly advised, though is not required, that an application
    check to see if the framebuffer is complete prior to rendering.  The
    status of the framebuffer object currently bound to <target> can be
    queried by calling

        enum CheckFramebufferStatus(enum target);

    <target> must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or
    FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER.
    If CheckFramebufferStatus is called within a Begin/End pair,
    an INVALID_OPERATION error is generated. If
    CheckFramebufferStatus generates an error, 0 is returned.

    Otherwise, an enum is returned that identifies whether
    or not the framebuffer bound to <target> is complete, and if not
    complete the enum identifies one of the rules of framebuffer
    completeness that is violated.  If the framebuffer is complete, then
    FRAMEBUFFER_COMPLETE is returned.

    The values of SAMPLE_BUFFERS and SAMPLES are derived from the
    attachments of the currently bound framebuffer object.  If the
    current DRAW_FRAMEBUFFER_BINDING is not framebuffer complete,
    then both SAMPLE_BUFFERS and SAMPLES are undefined.  Otherwise,
    SAMPLES is equal to the value of RENDERBUFFER_SAMPLES for the
    attached images (which all must have the same value for
    RENDERBUFFER_SAMPLES).  Further, SAMPLE_BUFFERS is one if
    SAMPLES is non-zero.  Otherwise, SAMPLE_BUFFERS is zero.

    4.4.4.3 Effects of Framebuffer Completeness on Framebuffer Operations

    Attempting to render to or read from a framebuffer which is not
    framebuffer complete will generate an INVALID_FRAMEBUFFER_OPERATION
    error.  This means that rendering commands such as Begin,
    RasterPos, any command that performs an implicit Begin, as well as
    commands that read the framebuffer such as ReadPixels and
    CopyTex{Sub}Image will generate the error
    INVALID_FRAMEBUFFER_OPERATION if called while the framebuffer is
    not framebuffer complete.

    4.4.5 Effects of Framebuffer State on Framebuffer Dependent Values

    The values of the state variables listed in table 9.nnn (Framebuffer
    Dependent Values) may change when a change is made to
    DRAW_FRAMEBUFFER_BINDING, to the state of the currently bound
    framebuffer object, or to an image attached to the currently bound
    framebuffer object.

    When DRAW_FRAMEBUFFER_BINDING is zero, the values of the state
    variables listed in table 9.nnn are implementation defined.

    When DRAW_FRAMEBUFFER_BINDING is non-zero, if the currently bound
    framebuffer object is not framebuffer complete, then the values of
    the state variables listed in table 9.nnn are undefined.

    When DRAW_FRAMEBUFFER_BINDING is non-zero and the currently bound
    framebuffer object is framebuffer complete, then the values of the
    state variables listed in table 9.nnn are completely determined by
    DRAW_FRAMEBUFFER_BINDING, the state of the currently bound
    framebuffer object, and the state of the images attached to the
    currently bound framebuffer object.
    The values of RED_BITS, GREEN_BITS, BLUE_BITS, and ALPHA_BITS are
    defined only if all color attachments of the draw framebuffer have
    identical formats, in which case the color component depths of color
    attachment zero are returned. The values returned for DEPTH_BITS and
    STENCIL_BITS are the depth or stencil component depth of the
    corresponding attachment of the draw framebuffer, respectively. The
    actual sizes of the color, depth, or stencil bit planes can be
    obtained by querying an attachment point using
    GetFramebufferAttachmentParameteriv,
    or querying the object attached at that point.  If the value of
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE at a particular attachment
    point is RENDERBUFFER, the sizes may be determined by calling
    GetRenderbufferParameteriv as described in section 6.1.3. If
    the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE at a particular
    attachment point is TEXTURE, the sizes may be determined by calling
    GetTexParameter, as described in section 6.1.3.


    4.4.6 Mapping between Pixel and Element in Attached Image

    When DRAW_FRAMEBUFFER_BINDING is non-zero, an operation that writes
    to the framebuffer modifies the image attached to the selected
    logical buffer, and an operation that reads from the framebuffer
    reads from the image attached to the selected logical buffer.

    If the attached image is a renderbuffer image, then the window
    coordinates (x[w], y[w]) corresponds to the value in the
    renderbuffer image at the same coordinates.

    If the attached image is a texture image, then the window
    coordinates (x[w], y[w]) correspond to the texel (i, j, k), from
    figure 3.10 as follows:

                           i = (x[w] - b)

                           j = (y[w] - b)

                           k = (layer - b)

    where <b> is the texture image's border width, and <layer> is the
    value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER for the selected
    logical buffer.  For a two-dimensional texture, <k> and <layer> are
    irrelevant; for a one-dimensional texture, <j>, <k>, and <layer> are
    both irrelevant.

    (x[w], y[w]) corresponds to a border texel if x[w], y[w], or
    <layer> is less than the border width, or if x[w], y[w], or <layer>
    is greater than or equal to the border width plus the width or height or
    depth, respectively, of the texture image.

    Conversion to Framebuffer-Attachable Image Components

    When an enabled color value is written to the framebuffer while the
    draw framebuffer binding is non-zero, for each draw buffer the R, G, B,
    and A values are converted to internal components as described in
    table 3.15, according to the table row corresponding to the internal
    format of the framebuffer-attachable image attached to the selected
    logical buffer, and the resulting internal components are written to
    the image attached to logical buffer.  The masking operations
    described in section 4.2.2 are also effective.

    Conversion to RGBA Values

    When a color value is read or is used as the source of a logical
    operation or blending while the read framebuffer binding is non-zero,
    the components of the framebuffer-attachable image that is attached to
    the logical buffer selected by READ_BUFFER are first converted to R, G,
    B, and A values according to table 3.21 and the internal format of the
    attached image."


Additions to Chapter 5 of the OpenGL 2.1 Specification (Special Functions)

    Added to section 5.4, as part of the discussion of which commands
    are not compiled into display lists:

    "Certain commands, when called while compiling a display list, are
    not compiled into the display list but are executed immediately.
    These are: ..., GenFramebuffers, BindFramebuffer,
    DeleteFramebuffers, CheckFramebufferStatus,
    GenRenderbuffers, BindRenderbuffer, DeleteRenderbuffers,
    RenderbufferStorage, RenderbufferStorageMultisample,
    FramebufferTexture1D, FramebufferTexture2D,
    FramebufferTexture3D, FramebufferRenderbuffer, BlitFramebuffer,
    GenerateMipmap..."


Additions to Chapter 6 of the OpenGL 2.1 Specification (State and State
Requests)

    In section 6.1.3 "Enumerated Queries", modify the seventh paragraph
    to say:

    "For texture images with uncompressed internal formats, queries of
    <value> of TEXTURE_RED_SIZE, TEXTURE_GREEN_SIZE, TEXTURE_BLUE_SIZE,
    TEXTURE_ALPHA_SIZE, TEXTURE_LUMINANCE_SIZE, TEXTURE_INTENSITY_SIZE,
    TEXTURE_DEPTH_SIZE, and TEXTURE_STENCIL_SIZE return the actual
    resolutions of the stored image array components..."

    Section 6.1.4 "Texture Queries", in the second paragraph, replace
    the first second and third sentences as follows:

        "Calling GetTexImage with a color format (one of RED, GREEN,
        BLUE, ALPHA, RGB, BGR, RGBA, BGRA, LUMINANCE, or
        LUMINANCE_ALPHA) when the internal format of the texture image
        is not a color format causes the error INVALID_OPERATION.

        Calling GetTexImage with a <format> of DEPTH_COMPONENT when the
        base internal format of the texture image is not DEPTH_COMPONENT
        or DEPTH_STENCIL causes the error INVALID_OPERATION.

        Calling GetTexImage with a <format> of DEPTH_STENCIL when
        the base internal format of the texture image is not
        DEPTH_STENCIL causes the error INVALID_OPERATION.

        GetTexImage obtains component groups from a texture image with
        the indicated level-of-detail.  If <format> is a color format,
        then the components are assigned among R, G, B, and A according
        to Table 6.1, starting with the first group in the first row,
        and continuing by obtaining groups in order from each row and
        proceeding from the first row to the last, and from the first
        image to the last for three-dimensional textures.  If <format>
        is DEPTH_COMPONENT, then each depth component is assigned with
        the same ordering of rows and images.  If <format> is
        DEPTH_STENCIL, then each depth component and each stencil
        index is assigned with the same ordering of rows and images."

    After section 6.1.14 and before section 6.1.15 (which should be
    renumbered 6.1.17), add two new sections:

   "6.1.15 Framebuffer Object Queries

        The command

            boolean IsFramebuffer( uint framebuffer );

        returns TRUE if <framebuffer> is the name of a framebuffer
        object.  If <framebuffer> is zero, or if <framebuffer> is a
        non-zero value that is not the name of a framebuffer object,
        IsFramebuffer return FALSE.

        The command

        void GetFramebufferAttachmentParameteriv(enum target,
                                                 enum attachment,
                                                 enum pname,
                                                 int *params);

        returns information about attachments of a bound framebuffer object.
        <target> must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or FRAMEBUFFER.
        FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER.

        If the default framebuffer is bound to <target>, then <attachment>
        must be one of FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, or
        AUXi, identifying a color buffer; DEPTH, identifying the depth
        buffer; or STENCIL, identifying the stencil buffer.

        If a framebuffer object is bound to <target>, then <attachment> must
        be one of the attachment points of the framebuffer listed in table
        1.nnn.

        If <attachment> is DEPTH_STENCIL_ATTACHMENT, and different objects
        are bound to the depth and stencil attachment points of <target>,
        the query will fail and generate an INVALID_OPERATION error. If the
        same object is bound to both attachment points, information about
        that object will be returned.

        Upon successful return from GetFramebufferAttachmentParameteriv, if
        <pname> is FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, then <param> will
        contain one of NONE, FRAMEBUFFER_DEFAULT, TEXTURE, or RENDERBUFFER,
        identifying the type of object which contains the attached image.
        Other values accepted for <pname> depend on the type of object, as
        described below.

        If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is
        NONE, no framebuffer is bound to <target>. In this case
        querying <pname> FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
        will return zero, and all other queries will generate an
        INVALID_OPERATION error.

        If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is not
        NONE, these queries apply to all other framebuffer types:

          * If <pname> is FRAMEBUFFER_ATTACHMENT_RED_SIZE,
            FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
            FRAMEBUFFER_ATTACHMENT_BLUE_SIZE,
            FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
            FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, or
            FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, then <param> will contain
            the number of bits in the corresponding red, green, blue, alpha,
            depth, or stencil component of the specified <attachment>. Zero
            is returned if the requested component is not present in
            <attachment>.

          * If <pname> is FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, <param>
            will contain the format of components of the specified
            attachment, one of FLOAT, INT, UNSIGNED_INT, UNSIGNED_NORMALIZED
            or INDEX for floating-point, signed integer, unsigned integer,
            unsigned fixed-point, or index components respectively. Only
            color buffers may have index or integer components.

          * If <pname> is FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, <param>
            will contain the encoding of components of the specified
            attachment, one of LINEAR or SRGB for linear or sRGB-encoded
            components, respectively. Only color buffer components may be
            sRGB-encoded; such components are treated as described in
            sections 4.1.8 "Blending" and 4.1.X "sRGB Conversion" (as
            modified by ARB_framebuffer_sRGB). For the default framebuffer,
            color encoding is determined by the implementation. For
            framebuffer objects, components are sRGB-encoded if the internal
            format of a color attachment is one of the color-renderable SRGB
            formats described in section 3.8.15 "sRGB Texture Color
            Conversion".

        If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is RENDERBUFFER,
        then

          * If <pname> is FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, <params> will
            contain the name of the renderbuffer object which contains the
            attached image.

        If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE, then

          * If <pname> is FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, then <params>
            will contain the name of the texture object which contains the
            attached image.

          * If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, then
            <params> will contain the mipmap level of the texture object
            which contains the attached image.

          * If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE and
            the texture object named FRAMEBUFFER_ATTACHMENT_OBJECT_NAME is a
            cube map texture, then <params> will contain the cube map face
            of the cubemap texture object which contains the attached image.
            Otherwise <params> will contain the value zero.

          * If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER and the
            texture object named FRAMEBUFFER_ATTACHMENT_OBJECT_NAME is a
            three-dimensional texture, then <params> will contain the layer
            of the 2D image of the 3D texture object which contains the
            attached image. Otherwise <params> will contain the value zero.

        Any combinations of framebuffer type and <pname> not described above
        will generate an INVALID_ENUM error."


    6.1.16 Renderbuffer Object Queries

       "The command

            boolean IsRenderbuffer( uint renderbuffer );

        returns TRUE if <renderbuffer> is the name of a renderbuffer
        object.  If <renderbuffer> is zero, or if <renderbuffer> is a
        non-zero value that is not the name of a renderbuffer object,
        IsRenderbuffer return FALSE.

        The command

        void GetRenderbufferParameteriv(enum target, enum pname,
                                        int* params);

        returns information about a bound renderbuffer object. <target> must
        be RENDERBUFFER and <pname> must be one of the symbolic values in
        table 8.nnn. If the renderbuffer currently bound to <target> is
        zero, then an INVALID_OPERATION error is generated.

        Upon successful return from GetRenderbufferParameteriv, if <pname>
        is RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT,
        RENDERBUFFER_INTERNAL_FORMAT, or RENDERBUFFER_SAMPLES, then <params>
        will contain the width in pixels, height in pixels, internal format,
        or number of samples, respectively, of the image of the renderbuffer
        currently bound to <target>.

        If <pname> is RENDERBUFFER_RED_SIZE, RENDERBUFFER_GREEN_SIZE,
        RENDERBUFFER_BLUE_SIZE, RENDERBUFFER_ALPHA_SIZE,
        RENDERBUFFER_DEPTH_SIZE, or RENDERBUFFER_STENCIL_SIZE, then <params>
        will contain the actual resolutions, (not the resolutions specified
        when the image array was defined), for the red, green, blue, alpha
        depth, or stencil components, respectively, of the image of the
        renderbuffer currently bound to <target>.

        Otherwise, an INVALID_ENUM error is generated."

    In section 6.2 "State Tables", add a row to table 6.18 "Textures
    (state per texture image)":

      Get value             Type    Get Cmd               IV  Description                           Sec.
      ------------------    ------  --------------------  --- ----------------------------------  -----
      ...                   ...     ...                   ... ...                                   ...
      TEXTURE_STENCIL_SIZE  n x Z+  GetTexLevelParameter  0   texture image's stencil resolution  3.8.3


Errors

    The error INVALID_OPERATION is generated if DRAW_FRAMEBUFFER_BINDING
    is zero and DrawBuffer or DrawBuffers is called with a <buf>
    constant (other than NONE) that does not correspond to a buffer
    allocated to the GL by the window-system, including the constants
    COLOR_ATTACHMENT0 through COLOR_ATTACHMENTn, where n is
    MAX_COLOR_ATTACHMENTS - 1.

    The error INVALID_OPERATION is generated if DRAW_FRAMEBUFFER_BINDING
    is non-zero and DrawBuffer or DrawBuffer is called
    with a <buf> constant (other than NONE) that is not in the range
    COLOR_ATTACHMENT0 through COLOR_ATTACHMENTn, where n is
    MAX_COLOR_ATTACHMENTS - 1.

    The error INVALID_OPERATION is generated if READ_FRAMEBUFFER_BINDING
    is non-zero and ReadBuffer is called
    with a <buf> constant (other than NONE) that is not in the range
    COLOR_ATTACHMENT0 through COLOR_ATTACHMENTn, where n is
    MAX_COLOR_ATTACHMENTS - 1.

    The error INVALID_ENUM is generated if DrawBuffer or ReadBuffer is
    called with a <buf> constant that is not listed in table 4.4 or
    10.nnn.

    The error INVALID_ENUM is generated if DrawBuffers is called with a
    <buf> constant that is not listed in table 10.nnn or 11.nnn.

    The error INVALID_FRAMEBUFFER_OPERATION is generated if
    BlitFramebuffer, DrawPixels, or CopyPixels is called while the
    draw framebuffer is not framebuffer complete.

    The error INVALID_FRAMEBUFFER_OPERATION is generated if
    BlitFramebuffer, ReadPixels, CopyPixels, CopyTex{Sub}Image*,
    CopyColor{Sub}Table, or CopyConvolutionFilter* is called while the
    read framebuffer is not framebuffer complete.

    The error INVALID_OPERATION is generated if
    GetFramebufferAttachmentParameteriv is called while the value of
    DRAW_FRAMEBUFFER_BINDING is zero.

    The error INVALID_OPERATION is generated if
    FramebufferRenderbuffer or FramebufferTexture{1D|2D|3D} is
    called  while the value of DRAW_FRAMEBUFFER_BINDING is zero.

    The error INVALID_OPERATION is generated if RenderbufferStorage
    or GetRenderbufferParameteriv is called while the value of
    RENDERBUFFER_BINDING is zero.

    The error INVALID_ENUM is generated if
    GetFramebufferAttachmentParameteriv is called with an
    <attachment> other than COLOR_ATTACHMENT0 through
    COLOR_ATTACHMENTn, where n is MAX_COLOR_ATTACHMENTS - 1.

    The error INVALID_ENUM is generated if
    GetFramebufferAttachmentParameteriv is called with a <pname>
    other than FRAMEBUFFER_ATTACHMENT_OBJECT_NAME when the type of
    the attached object at the named attachment point is
    RENDERBUFFER.

    The error INVALID_ENUM is generated if
    GetFramebufferAttachmentParameteriv is called with a <pname>
    other than FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,
    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL,
    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, or
    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER when the type of the
    attached object at the named attachment point is TEXTURE.

    The error INVALID_ENUM is generated if GetRenderbufferParameteriv
    is called with a <pname> other than RENDERBUFFER_WIDTH,
    RENDERBUFFER_HEIGHT, or RENDERBUFFER_INTERNAL_FORMAT,
    RENDERBUFFER_RED_SIZE, RENDERBUFFER_GREEN_SIZE,
    RENDERBUFFER_BLUE_SIZE, RENDERBUFFER_ALPHA_SIZE,
    RENDERBUFFER_DEPTH_SIZE, or RENDERBUFFER_STENCIL_SIZE.

    The error INVALID_VALUE is generated if RenderbufferStorage is
    called with a <width> or <height> that is greater than
    MAX_RENDERBUFFER_SIZE.

    The error INVALID_ENUM is generated if RenderbufferStorage is
    called with an <internalformat> that is not RGB, RGBA,
    DEPTH_COMPONENT, STENCIL_INDEX, DEPTH_STENCIL, or one of the
    internal formats from table 3.16 or table 2.nnn that has a base
    internal format of RGB, RGBA, DEPTH_COMPONENT, STENCIL_INDEX, r
    DEPTH_STENCIL.

    The error INVALID_OPERATION is generated if
    FramebufferRenderbuffer is called and <renderbuffer> is not the
    name of a renderbuffer object.

    The error INVALID_OPERATION is generated if
    FramebufferTexture{1D|2D|3D} is called and <texture> is not the
    name of a texture object.

    The error INVALID_VALUE is generated if
    FramebufferTexture{1D|2D|3D} is called with a <level> that is
    less than zero.

    The error INVALID_VALUE is generated if FramebufferTexture2D is
    called with a <level> that is not zero and <textarget> is
    TEXTURE_RECTANGLE_ARB.

    The error INVALID_VALUE is generated if FramebufferTexture{1D|2D}
    is called with a <level> that is greater than the log base 2 of
    MAX_TEXTURE_SIZE and <texture> is a 1D or 2D texture.

    The error INVALID_VALUE is generated if FramebufferTexture2D
    is called with a <level> that is greater than the log base 2 of
    MAX_CUBE_MAP_TEXTURE_SIZE and <texture> is a cubemap texture.

    The error INVALID_VALUE is generated if FramebufferTexture3D is
    called with a <level> greater than the log base 2 of the
    MAX_3D_TEXTURE_SIZE.

    The error INVALID_VALUE is generated if FramebufferTexture3D is
    called with a <layer> that is larger than MAX_3D_TEXTURE_SIZE-1.

    The error INVALID_VALUE is generated by BlitFramebuffer if
    <mask> has any bits set other than those named by
    COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT.

    The error INVALID_OPERATION is generated if BlitFramebuffer is
    called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
    and <filter> is not NEAREST.

    The error INVALID_OPERATION is generated if BlitFramebuffer is
    called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
    and the source and destination depth or stencil buffer formats do
    not match.

    The error INVALID_ENUM is generated by BlitFramebuffer if
    <filter> is not LINEAR or NEAREST.

    The error INVALID_OPERATION is generated if BlitFramebuffer
    is called within a Begin/End pair.

    The error INVALID_ENUM is generated if BindFramebuffer,
    CheckFramebufferStatus, FramebufferTexture{1D|2D|3D},
    FramebufferRenderbuffer, or
    GetFramebufferAttachmentParameteriv is called and <target> is
    not DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or FRAMEBUFFER.

    The error INVALID_OPERATION is generated if
    CheckFramebufferStatus is called within a Begin/End pair.

    The error OUT_OF_MEMORY is generated if the GL is unable to create a
    data store of the required size when calling RenderbufferStorage.

    The error INVALID_OPERATION is generated if GenerateMipmap is
    called with a <target> of TEXTURE_CUBE_MAP and the texture object
    currently bound to TEXTURE_CUBE_MAP is not "cube complete" as
    defined in section 3.8.10

    The error INVALID_OPERATION is generated if ReadPixels,
    CopyPixels, CopyTex{Sub}Image*, CopyColor{Sub}Table, or
    CopyConvolutionFilter* is called while READ_FRAMEBUFFER_BINDING
    is non-zero, the read framebuffer is framebuffer complete, and the
    value of SAMPLE_BUFFERS for the read framebuffer is greater than
    zero.

    The error OUT_OF_MEMORY is generated when
    RenderbufferStorageMultisample cannot create storage of the
    specified size.

    If both the draw and read framebuffers are framebuffer complete and
    both have a value of SAMPLE_BUFFERS that is greater than zero, then
    the error INVALID_OPERATION is generated if BlitFramebuffer is
    called and the values of SAMPLES for the draw and read framebuffers
    do not match.

    If both the draw and read framebuffers are framebuffer complete and
    either has a value of SAMPLE_BUFFERS that is greater than zero, then
    the error INVALID_OPERATION is generated if BlitFramebuffer is
    called and the formats of the draw and read framebuffers are not
    identical.

    If either the draw or read framebuffer is framebuffer complete and
    has a value of SAMPLE_BUFFERS that is greater than zero, then the
    error INVALID_OPERATION is generated if BlitFramebuffer is called
    and the specified source and destination dimensions are not
    identical.

    If RenderbufferStorageMultisample is called with a value of
    <samples> that is greater than MAX_SAMPLES, then the error
    INVALID_VALUE is generated.

    The error INVALID_ENUM is generated if DrawPixels or ReadPixels is
    called where format is DEPTH_STENCIL and type is not
    UNSIGNED_INT_24_8.

    The error INVALID_OPERATION is generated if DrawPixels or ReadPixels
    is called where type is UNSIGNED_INT_24_8 and format is not
    DEPTH_STENCIL.

    The error INVALID_OPERATION is generated if DrawPixels or ReadPixels
    is called where format is DEPTH_STENCIL and there is not both a
    depth buffer and a stencil buffer.

    The error INVALID_OPERATION is generated if CopyPixels is called
    where type is DEPTH_STENCIL and there is not both a depth buffer
    and a stencil buffer.


New State

    (add new table 3.nnn, "Framebuffer (state per framebuffer target binding point)")

    Get Value                 Type   Get Command   Initial Value    Description               Section       Attribute
    ------------------------  ----   -----------   --------------   -------------------       ------------  ---------
    DRAW_FRAMEBUFFER_BINDING   Z+    GetIntegerv   0                Framebuffer object bound  4.4.1         -
                                                                    to DRAW_FRAMEBUFFER
    READ_FRAMEBUFFER_BINDING   Z+    GetIntegerv   0                Framebuffer object        4.4.1         -
                                                                    to READ_FRAMEBUFFER

    (insert new table 4.nnn, "Framebuffer (state per framebuffer object)")

    Get Value            Type         Get Command        Initial Value  Description             Section       Attribute
    ----------------     ------       -------------      -------------  --------------------    ------------  ---------
    DRAW_BUFFERi [1]     1 + xZ(10*)  GetIntegerv        see 4.2.1      Draw buffer selected    4.2.1         color-buffer
                                                                        for color output i
    READ_BUFFER  [2]     Z(3)         GetIntegerv        see 4.3.2      Read source buffer      4.3.2         pixel

        [1] prior to this extension, the DRAW_BUFFERi state was
            described in table 6.21 "Framebuffer Control" of the OpenGL
            2.0 specification.
        [2] prior to this extension, the READ_BUFFER state was described
            in table 6.26 "Pixel" of the OpenGL 2.0 specification.



    (insert new table 5.nnn, "Framebuffer (state per framebuffer object attachment point)")

    Get Value                                     Type    Get Command                            Initial Value  Description             Section       Attribute
    --------------------------------------------  ----    -------------------------------------- -------------  --------------------    ------------  ---------
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE            Z       GetFramebufferAttachmentParameteriv    NONE           type of                 4.4.2.2 and   -
                                                                                                                image attached to       4.4.2.3
                                                                                                                framebuffer attachment
                                                                                                                point

    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME            Z       GetFramebufferAttachmentParameteriv    0              name of object          4.4.2.2 and   -
                                                                                                                attached to             4.4.2.3
                                                                                                                framebuffer attachment
                                                                                                                point

    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL          Z       GetFramebufferAttachmentParameteriv    0              mipmap level of         4.4.2.2 and   -
                                                                                                                texture image           4.4.2.3
                                                                                                                attached, if object
                                                                                                                attached is texture.

    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE  Z+      GetFramebufferAttachmentParameteriv    NONE           cubemap face of         4.4.2.2 and   -
                                                                                                                texture image           4.4.2.3
                                                                                                                attached, if object
                                                                                                                attached is cubemap
                                                                                                                texture.

    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER          Z       GetFramebufferAttachmentParameteriv    0              layer of                4.4.2.2 and   -
                                                                                                                texture image           4.4.2.3
                                                                                                                attached, if object
                                                                                                                attached is 3D texture.

    FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING         Z_2     GetFramebufferAttachmentParameteriv    -              Encoding of components  6.1.3         -
                                                                                                                in the attached image

    FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE         Z_4     GetFramebufferAttachmentParameteriv    -              Data type of components 6.1.3         -
                                                                                                                in the attached image

    FRAMEBUFFER_ATTACHMENT_RED_SIZE               Z+      GetFramebufferAttachmentParameteriv    -              Size in bits of att.    6.1.3         -
                                                                                                                image's red component

    FRAMEBUFFER_ATTACHMENT_GREEN_SIZE             Z+      GetFramebufferAttachmentParameteriv    -              Size in bits of att.    6.1.3         -
                                                                                                                image's green component

    FRAMEBUFFER_ATTACHMENT_BLUE_SIZE              Z+      GetFramebufferAttachmentParameteriv    -              Size in bits of att.    6.1.3         -
                                                                                                                image's blue component

    FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE             Z+      GetFramebufferAttachmentParameteriv    -              Size in bits of att.    6.1.3         -
                                                                                                                image's alpha component

    FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE             Z+      GetFramebufferAttachmentParameteriv    -              Size in bits of att.    6.1.3         -
                                                                                                                image's depth component

    FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE           Z+      GetFramebufferAttachmentParameteriv    -              Size in bits of att.    6.1.3         -
                                                                                                                image's stencil component




    (insert new table 7.nnn, "Renderbuffers (state per renderbuffer target and binding point)")

    Get Value                      Type    Get Command     Initial Value  Description             Section       Attribute
    ----------------------------   ------  -------------   -------------  --------------------    ------------  ---------
    RENDERBUFFER_BINDING           Z       GetIntegerv     0              renderbuffer object     4.4.2.1       -
                                                                          bound to RENDERBUFFER


    (insert new table 8.nnn, "Renderbuffers (state per renderbuffer object)")

    Get Value                      Type    Get Command                 Initial Value  Description             Section       Attribute
    ----------------------------   ------  -------------               -------------  --------------------    ------------  ---------
    RENDERBUFFER_WIDTH             Z       GetRenderbufferParameteriv  0              width of renderbuffer   4.4.2.1       -

    RENDERBUFFER_HEIGHT            Z       GetRenderbufferParameteriv  0              height of renderbuffer  4.4.2.1       -

    RENDERBUFFER_INTERNAL_FORMAT   Z+      GetRenderbufferParameteriv  RGBA           internal format         4.4.2.1       -
                                                                                      of renderbuffer

    RENDERBUFFER_RED_SIZE          Z       GetRenderbufferParameteriv  0              size in bits of         4.4.2.1       -
                                                                                      renderbuffer image's
                                                                                      red component

    RENDERBUFFER_GREEN_SIZE        Z       GetRenderbufferParameteriv  0              size in bits of         4.4.2.1       -
                                                                                      renderbuffer image's
                                                                                      green component

    RENDERBUFFER_BLUE_SIZE         Z       GetRenderbufferParameteriv  0              size in bits of         4.4.2.1       -
                                                                                      renderbuffer image's
                                                                                      blue component

    RENDERBUFFER_ALPHA_SIZE        Z       GetRenderbufferParameteriv  0              size in bits of         4.4.2.1       -
                                                                                      renderbuffer image's
                                                                                      alpha component

    RENDERBUFFER_DEPTH_SIZE        Z       GetRenderbufferParameteriv  0              size in bits of         4.4.2.1       -
                                                                                      renderbuffer image's
                                                                                      depth component

    RENDERBUFFER_STENCIL_SIZE      Z       GetRenderbufferParameteriv  0              size in bits of         4.4.2.1       -
                                                                                      renderbuffer image's
                                                                                      stencil component

    RENDERBUFFER_SAMPLES           Z+      GetRenderbufferParameteriv  0              number of samples       4.4.2.1       -





Move the following existing state from "Implementation Dependent
Values", tables 6.33-6.37 to into a new table called "Framebuffer
Dependent Values", table 9.nnn.

    Get Value
    ---------
    AUX_BUFFERS
    MAX_DRAW_BUFFERS
    RGBA_MODE
    INDEX_MODE
    DOUBLEBUFFER
    STEREO
    SAMPLE_BUFFERS
    SAMPLES
    RED_BITS
    GREEN_BITS
    BLUE_BITS
    ALPHA_BITS
    INDEX_BITS
    DEPTH_BITS
    STENCIL_BITS
    ACCUM_RED_BITS
    ACCUM_GREEN_BITS
    ACCUM_BLUE_BITS
    ACCUM_ALPHA_BITS

To the same table called "Framebuffer Dependent Values", table 9.nnn
add the following new framebuffer dependent state.

    Get Value               Type  Get Command     Minimum Value    Description             Section  Attribute
    ---------               ----  -----------     -------------    -------------------     -------  ---------
    MAX_COLOR_ATTACHMENTS   Z+    GetIntegerv     1                Maximum number of       4.4.2.2  -
                                                                   attachment points
                                                                   for color buffers
                                                                   when using framebuffer
                                                                   objects

    MAX_SAMPLES             Z+    GetIntegerv     0                Maximum number of       4.4.2.1  -
                                                                   samples supported
                                                                   for multisampling

New Implementation Dependent State

    Get Value               Type  Get Command     Minimum Value    Description             Section  Attribute
    ---------               ----  -----------     -------------    -------------------     -------  ---------
    MAX_RENDERBUFFER_SIZE   Z+    GetIntegerv     64               Maximum width and       4.4.2.1  -
                                                                   height of
                                                                   renderbuffers
                                                                   supported by
                                                                   the implementation

Additions to the AGL/GLX/WGL Specifications and dependencies on
WGL_ARB_make_current_read, GLX_SGI_make_current_read, and GLX 1.3

    The color, depth, stencil, aux, and accum logical buffers defined by
    the <draw> and <read> drawables passed to glXMakeContextCurrent,
    glXMakeCurrent, and glXMakeCurrentRead are ignored while the value
    of DRAW_FRAMEBUFFER_BINDING is non-zero.

Dependencies on ATI_draw_buffers and ARB_draw_buffers

    If neither ATI_draw_buffers nor ARB_draw_buffers are supported, then
    all discussions of DrawBuffers should be ignored.

    In addition, the language describing DrawBuffers are derived from a
    combination of the ARB_draw_buffers specification and section 4.2.1
    of the OpenGL 2.0 specification.

Dependencies on ARB_fragment_program, ARB_fragment_shader, and
ARB_vertex_shader

    If ARB_fragment_program, ARB_fragment_shader, and ARB_vertex_shader
    are all not supported, then all references to the currently bound
    program or shader should be ignored.

Dependencies on ARB_texture_rectangle

    If ARB_texture_rectangle is not supported, then all references to
    TEXTURE_RECTANGLE_ARB should be ignored.

Dependencies on ARB_color_buffer_float

    The reference to CLAMP_FRAGMENT_COLOR_ARB in section 4.3.3 applies
    only if ARB_color_buffer_float is supported.

Dependencies on ARB_texture_rg

    If ARB_texture_rg is not supported, delete the references to RED and
    RG from the list of color-renderable base internal formats from
    section 4.4.4.

Dependencies on NV_float_buffer

    If NV_float_buffer is not supported, delete the references to
    FLOAT_R_NV, FLOAT_RG_NV, FLOAT_RGB_NV and FLOAT_RGBA_NV from the list
    of color-renderable base internal formats from section 4.4.4

Dependencies on EXT_framebuffer_object

    Framebuffer objects created with the commands defined by the
    GL_EXT_framebuffer_object extension are defined to be shared, while
    FBOs created with commands defined by the OpenGL core or
    GL_ARB_framebuffer_object extension are defined *not* to be shared.
    However, the following functions are viewed as aliases (in particular
    the opcodes for X are also the same) between the functions of
    GL_EXT_framebuffer_object and GL_ARB_framebuffer_object:

      IsRenderbufferEXT             / IsRenderbuffer
      DeleteRenderbuffersEXT        / DeleteRenderbuffers
      GenRenderbuffersEXT           / GenRenderbuffers
      RenderbufferStorageEXT        / RenderbufferStorage
      GetRenderbufferParameterivEXT / GetRenderbufferParameteriv
      IsFramebufferEXT              / IsFramebuffer
      DeleteFramebuffersEXT         / DeleteFramebuffers
      GenFramebuffersEXT            / GenFramebuffers
      CheckFramebufferStatusEXT     / CheckFramebufferStatus
      FramebufferTexture1DEXT       / FramebufferTexture1D
      FramebufferTexture2DEXT       / FramebufferTexture2D
      FramebufferRenderbufferEXT    / FramebufferRenderbuffer
      GenerateMipmapEXT             / GenerateMipmap
      GetFramebufferAttachmentParameterivEXT / GetFramebufferAttachmentParameteriv

   Since the above pairs are aliases, the functions of a pair are
   equivalent.  Note that the functions BindFramebuffer and
   BindFramebufferEXT are not aliases and neither are the functions
   BindRenderbuffer and BindRenderbufferEXT.  Because object creation
   occurs when the framebuffer object is bound for the first time, a
   framebuffer object can be shared across contexts only if it was first
   bound with BindFramebufferEXT.  Framebuffers first bound with
   BindFramebuffer may not be shared across contexts.  Framebuffer
   objects created with BindFramebufferEXT may subsequently be bound
   using BindFramebuffer.  Framebuffer objects created with
   BindFramebuffer may be bound with BindFramebufferEXT provided they are
   bound to the same context they were created on.

Dependencies on EXT_texture_array

    If EXT_texture_array is not supported, delete all references to
    one- and two-dimensional array textures.

Dependencies on EXT_texture_integer

    If EXT_texture_integer is not supported, the following changes should
    be made:

    The definition of GetFramebufferAttachmentParameteriv should be
    modified to remove any references to signed and unsigned integer
    components for color buffers and the values of INT and UNSIGNED_INT
    should be removed from the list of possible values for <param> when
    <pname> is FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE.

Dependencies on ARB_framebuffer_sRGB

    If ARB_framebuffer_sRGB is not supported, the following changes should
    be made:

    The definition of GetFramebufferAttachmentParameteriv should be
    modified to remove any reference to sRGB-encoded components or
    color buffers and sRGB conversion. The value of SRGB should be
    removed from the list of possible values for <param> when <pname> is
    FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING.

GLX Protocol

        Nineteen new GL commands are added.

        The following thirteen rendering commands are sent to the server
        as part of a glXRender request:

        BindRenderbuffer
            2        12              rendering command length
            2        235             rendering command opcode
            4        ENUM            target
            4        CARD32          renderbuffer

        DeleteRenderbuffer
            2        8+n*4           rendering command length
            2        4317            rendering command opcode
            4        CARD32          n
            n*4      LISTofCARD32    renderbuffers

        RenderbufferStorage
            2        20              rendering command length
            2        4318            rendering command opcode
            4        ENUM            target
            4        ENUM            internalFormat
            4        CARD32          width
            4        CARD32          height

        RenderbufferStorageMultisample

            2       24              rendering command length
            2       4331            rendering command opcode
            4       ENUM            target
            4       CARD32          samples
            4       ENUM            internalformat
            4       CARD32          width
            4       CARD32          height

        BindFramebuffer
            2        12              rendering command length
            2        236             rendering command opcode
            4        ENUM            target
            4        CARD32          framebuffer

        DeleteFramebuffer
            2        8+n*4           rendering command length
            2        4320            rendering command opcode
            4        CARD32          n
            n*4      LISTofCARD32    framebuffers

        FramebufferTexture1D
            2        24              rendering command length
            2        4321            rendering command opcode
            4        ENUM            target
            4        ENUM            attachment
            4        ENUM            textarget
            4        CARD32          texture
            4        CARD32          level

        FramebufferTexture2D
            2        24              rendering command length
            2        4322            rendering command opcode
            4        ENUM            target
            4        ENUM            attachment
            4        ENUM            textarget
            4        CARD32          texture
            4        CARD32          level

        FramebufferTexture3D
            2        28              rendering command length
            2        4323            rendering command opcode
            4        ENUM            target
            4        ENUM            attachment
            4        ENUM            textarget
            4        CARD32          texture
            4        CARD32          level
            4        CARD32          layer

        FramebufferTextureLayer
            2        24              rendering command length
            2        237             rendering command opcode
            4        ENUM            target
            4        ENUM            attachment
            4        CARD32          texture
            4        CARD32          level
            4        CARD32          layer

        FramebufferRenderbuffer
            2        20              rendering command length
            2        4324            rendering command opcode
            4        ENUM            target
            4        ENUM            attachment
            4        ENUM            renderbuffertarget
            4        CARD32          renderbuffer

        BlitFramebuffer
            2        44              rendering command length
            2        4330            rendering command opcode
            4        CARD32          source X0
            4        CARD32          source Y0
            4        CARD32          source X1
            4        CARD32          source Y1
            4        CARD32          destination X0
            4        CARD32          destination Y0
            4        CARD32          destination X1
            4        CARD32          destination Y1
            4        CARD32          mask
            4        ENUM            filter

        GenerateMipmap
            2        8               rendering command length
            2        4325            rendering command opcode
            4        ENUM            target

        The remaining seven commands are non-rendering commands.  These
        commands are sent separately (i.e., not as part of a glXRender or
        glXRenderLarge request), using the glXVendorPrivateWithReply
        request:

        IsRenderbuffer
            1        CARD8           opcode (X assigned)
            1        17              GLX opcode (X_GLXVendorPrivateWithReply)
            2        4               request length
            4        1422            vendor specific opcode
            4        GLX_CONTEXT_TAG context tag
            4        CARD32          renderbuffer
          =>
            1        1               reply
            1                        unused
            2        CARD16          sequence number
            4        0               reply length
            4        BOOL32          return value
            20                       unused

        GenRenderbuffers
            1        CARD8           opcode (X assigned)
            1        17              GLX opcode (X_GLXVendorPrivateWithReply)
            2        4               request length
            4        1423            vendor specific opcode
            4        GLX_CONTEXT_TAG context tag
            4        CARD32          n
          =>
            1        1               reply
            1                        unused
            2        CARD16          sequence number
            4        m               reply length
            4                        unused
            4        CARD32          n
            16                       unused
            n*4      LISTofCARD32    renderbuffers

        GetRenderbufferParameteriv
            1        CARD8           opcode (X assigned)
            1        17              GLX opcode (X_GLXVendorPrivateWithReply)
            2        5               request length
            4        1424            vendor specific opcode
            4        GLX_CONTEXT_TAG context tag
            4        ENUM            target
            4        ENUM            pname
          =>
            1        1               reply
            1                        unused
            2        CARD16          sequence number
            4        m               reply length, m = (n == 1 ? 0 : n)
            4                        unused
            4        CARD32          n

            if (n = 1) this follows:

            4        CARD32          params
            12                       unused

            otherwise this follows:

            16                       unused
            n*4      LISTofCARD32    params

        IsFramebuffer
            1        CARD8           opcode (X assigned)
            1        17              GLX opcode (X_GLXVendorPrivateWithReply)
            2        4               request length
            4        1425            vendor specific opcode
            4        GLX_CONTEXT_TAG context tag
            4        CARD32          framebuffer
          =>
            1        1               reply
            1                        unused
            2        CARD16          sequence number
            4        0               reply length
            4        BOOL32          return value
            20                       unused

        GenFramebuffers
            1        CARD8           opcode (X assigned)
            1        17              GLX opcode (X_GLXVendorPrivateWithReply)
            2        4               request length
            4        1426            vendor specific opcode
            4        GLX_CONTEXT_TAG context tag
            4        CARD32          n
          =>
            1        1               reply
            1                        unused
            2        CARD16          sequence number
            4        n               reply length
            4                        unused
            4        CARD32          n
            16                       unused
            n*4      LISTofCARD32    framebuffers

        CheckFramebufferStatus
            1        CARD8           opcode (X assigned)
            1        17              GLX opcode (X_GLXVendorPrivateWithReply)
            2        4               request length
            4        1427            vendor specific opcode
            4        GLX_CONTEXT_TAG context tag
            4        ENUM            target
          =>
            1        1               reply
            1                        unused
            2        CARD16          sequence number
            4        0               reply length
            4        ENUM            return value
            20                       unused

        GetFramebufferAttachmentParameteriv
            1        CARD8           opcode (X assigned)
            1        17              GLX opcode (X_GLXVendorPrivateWithReply)
            2        6               request length
            4        1428            vendor specific opcode
            4        GLX_CONTEXT_TAG context tag
            4        ENUM            target
            4        ENUM            attachment
            4        ENUM            pname
          =>
            1        1               reply
            1                        unused
            2        CARD16          sequence number
            4        m               reply length, m = (n == 1 ? 0 : n)
            4                        unused
            4        CARD32          n

            if (n = 1) this follows:

            4        CARD32          params
            12                       unused

            otherwise this follows:

            16                       unused
            n*4      LISTofCARD32    params


Usage Examples

    The following examples use a helper macro for
    CHECK_FRAMEBUFFER_STATUS, defined below.

    Example (6) gives a (very slightly) more robust example of handling
    the possible return values for glCheckFramebufferStatus.

    #define CHECK_FRAMEBUFFER_STATUS()                            \
      {                                                           \
        GLenum status;                                            \
        status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);   \
        switch(status) {                                          \
          case GL_FRAMEBUFFER_COMPLETE:                           \
            break;                                                \
          case GL_FRAMEBUFFER_UNSUPPORTED:                        \
            /* choose different formats */                        \
            break;                                                \
          default:                                                \
            /* programming error; will fail on all hardware */    \
            assert(0);                                            \
        }
      }

    (1) Render to 2D texture with a depth buffer

        // Given:  color_tex - TEXTURE_2D color texture object
        //         depth_rb  - GL_DEPTH renderbuffer object
        //         fb        - framebuffer object

        // Enable render-to-texture
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

        // Set up color_tex and depth_rb for render-to-texture
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_COLOR_ATTACHMENT0,
                                  GL_TEXTURE_2D, color_tex, 0);
        glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
                                     GL_DEPTH_ATTACHMENT,
                                     GL_RENDERBUFFER, depth_rb);

        // Check framebuffer completeness at the end of initialization.
        CHECK_FRAMEBUFFER_STATUS();

        <draw to the texture and renderbuffer>

        // Re-enable rendering to the window
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

        glBindTexture(GL_TEXTURE_2D, color_tex);
        <draw to the window, reading from the color_tex>


    (2) Application that supports both RBBCTT (render back buffer, copy to
    texture) and RTT (render to texture).  The migration path from RBBCTT
    to RTT is easy.

        if (useFramebuffer) {
            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
            glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                      GL_COLOR_ATTACHMENT0,
                                      GL_TEXTURE_2D, color_tex, 0);
            CHECK_FRAMEBUFFER_STATUS();
        }

        draw_to_texture();

        glBindTexture (GL_TEXTURE_2D, color_tex);
        if (useFramebuffer) {
            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
        } else { // copy tex path
            glCopyTexSubImage(...);
        }


    (3) Simple render-to-texture loop with initialization.  Create an
    RGB8 texture, a 24-bit depth renderbuffer, and a stencil
    renderbuffer.  In a loop, alternate between rendering to, and
    texturing out of, the color texture.

        glGenFramebuffers(1, &fb);
        glGenTextures(1, &color_tex);
        glGenRenderbuffers(1, &depth_rb);
        glGenRenderbuffers(1, &stencil_rb);

        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

        // initialize color texture
        glBindTexture(GL_TEXTURE_2D, color_tex);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 512, 512, 0,
                     GL_RGB, GL_INT, NULL);
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_COLOR_ATTACHMENT0,
                                  GL_TEXTURE_2D, color_tex, 0);

        // initialize depth renderbuffer
        glBindRenderbuffer(GL_RENDERBUFFER, depth_rb);
        glRenderbufferStorage(GL_RENDERBUFFER,
                                 GL_DEPTH_COMPONENT24, 512, 512);
        glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
                                     GL_DEPTH_ATTACHMENT,
                                     GL_RENDERBUFFER, depth_rb);

        // initialize stencil renderbuffer
        glBindRenderbuffer(GL_RENDERBUFFER, stencil_rb);
        glRenderbufferStorage(GL_RENDERBUFFER,
                                 GL_STENCIL_INDEX, 512, 512);
        glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
                                     GL_STENCIL_ATTACHMENT,
                                     GL_RENDERBUFFER, stencil_rb);

        // Check framebuffer completeness at the end of initialization.
        CHECK_FRAMEBUFFER_STATUS();

        loop {
            glBindTexture(GL_TEXTURE_2D, 0);
            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

            <draw to the texture>

            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
            glBindTexture(GL_TEXTURE_2D, color_tex);

            <draw to the window, reading from the color texture>
        }


    (4) Render-to-texture loop with automatic mipmap generation.  There
    are N framebuffers, N mipmap color textures, and a single shared
    depth renderbuffer.  The depth renderbuffer is not a mipmap.

        GLuint fb_array[N];
        GLuint color_tex_array[N];
        GLuint depth_rb;

        glGenFramebuffers(N, fb_array);
        glGenTextures(N, color_tex_array);
        glGenRenderbuffers(1, &depth_rb);

        // initialize color textures
        for (int i=0; i<N; i++) {
          glBindTexture(GL_TEXTURE_2D, color_tex_array[N]);
          glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 512, 512, 0,
                       GL_RGB, GL_INT, NULL);

          // establish a mipmap chain for the texture
          glGenerateMipmap(GL_TEXTURE_2D);
        }

        // initialize depth renderbuffer
        glBindRenderbuffer(GL_RENDERBUFFER, depth_rb);
        glRenderbufferStorage(GL_RENDERBUFFER,
                                 GL_DEPTH_COMPONENT24, 512, 512);

        // setup framebuffers, sharing depth
        for (int i=0; i<N; i++) {
          glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb_array[i]);
          glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                    GL_COLOR_ATTACHMENT0,
                                    GL_TEXTURE_2D, color_tex_array[i], 0);
          glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
                                       GL_DEPTH_ATTACHMENT,
                                       GL_RENDERBUFFER, depth_rb);
        }

        // Check framebuffer completeness at the end of initialization.
        CHECK_FRAMEBUFFER_STATUS();

        loop {
            glBindTexture(GL_TEXTURE_2D, 0);

            for (int i=0; i<N; i++) {
              glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb_array[i]);
              <draw to texture i>
            }

            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

            // automatically generate mipmaps
            for (int i=0; i<N; i++) {
              glBindTexture(GL_TEXTURE_2D, color_tex_array[i]);
              glGenerateMipmap(GL_TEXTURE_2D);
            }

            <draw to the window, reading from the color textures>
        }


    (5) Render-to-texture loop with custom mipmap generation.
        The depth renderbuffer is not a mipmap.

        glGenFramebuffers(1, &fb);
        glGenTextures(1, &color_tex);
        glGenRenderbuffers(1, &depth_rb);

        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

        // initialize color texture and establish mipmap chain
        glBindTexture(GL_TEXTURE_2D, color_tex);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 512, 512, 0,
                     GL_RGB, GL_INT, NULL);
        glGenerateMipmap(GL_TEXTURE_2D);
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_COLOR_ATTACHMENT0,
                                  GL_TEXTURE_2D, color_tex, 0);

        // initialize depth renderbuffer
        glBindRenderbuffer(GL_RENDERBUFFER, depth_rb);
        glRenderbufferStorage(GL_RENDERBUFFER,
                                 GL_DEPTH_COMPONENT24, 512, 512);
        glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
                                     GL_DEPTH_ATTACHMENT,
                                     GL_RENDERBUFFER, depth_rb);

        // Check framebuffer completeness at the end of initialization.
        CHECK_FRAMEBUFFER_STATUS();

        loop {
            glBindTexture(GL_TEXTURE_2D, 0);

            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
            glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                      GL_COLOR_ATTACHMENT0,
                                      GL_TEXTURE_2D, color_tex, 0);
            glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
                                         GL_DEPTH_ATTACHMENT,
                                         GL_RENDERBUFFER, depth_rb);

            <draw to the base level of the color texture>

            // custom-generate successive mipmap levels
            glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
                                         GL_DEPTH_ATTACHMENT,
                                         GL_RENDERBUFFER, 0);
            glBindTexture(GL_TEXTURE_2D, color_tex);
            foreach (level > 0, in order of increasing values of level) {
                glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                          GL_COLOR_ATTACHMENT0,
                                          GL_TEXTURE_2D, color_tex, level);
                glTexParameteri(TEXTURE_2D, TEXTURE_BASE_LEVEL, level-1);
                glTexParameteri(TEXTURE_2D, TEXTURE_MAX_LEVEL, level-1);

                <draw to level>
            }
            glTexParameteri(TEXTURE_2D, TEXTURE_BASE_LEVEL, 0);
            glTexParameteri(TEXTURE_2D, TEXTURE_MAX_LEVEL, max);

            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
            <draw to the window, reading from the color texture>
        }


    (6) Pseudo-code example of one method of responding to
        FRAMEBUFFER_UNSUPPORTED

        bool done = false;
        bool success = false;
        int  configurationNumber = 0;
        GLenum status;

        while (!done)
        {
            for (each framebuffer-attachable image)
            {
                ChooseInternalFormatForFramebufferAttachableImage(configurationNumber);

                CreateFramebufferAttachableImage();

                AttachFramebufferAttachableImageToFramebuffer();
            }

            status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
            switch(status)
            {
                case GL_FRAMEBUFFER_COMPLETE:
                    success = true;
                    done = true;
                    break;

                case GL_FRAMEBUFFER_UNSUPPORTED:
                    if (configCount < MAX_NUM_CONFIGS_I_WANT_TO_TRY)
                    {
                        printf("current config not supported, trying again);
                        configurationNumber++;
                    }
                    else
                    {
                        printf("couldn't find a supported config\n");
                        success = false;
                        done = true;
                    }
                    break;

                default:
                    // programming error; will fail on all hardware
                    FatalError();
                    exit(1);
            }
        }

        if (!success)
        {
            printf("couldn't find a supported config\n");
            FatalError();
            exit(1);
        }

        // Current framebuffer is supported and complete!!
        Draw();


    (7) Render to depth texture with no color attachments

        // Given:  depth_tex - TEXTURE_2D depth texture object
        //         fb        - framebuffer object

        // Enable render-to-texture
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

        // Set up depth_tex for render-to-texture
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_DEPTH_ATTACHMENT,
                                  GL_TEXTURE_2D, depth_tex, 0);

        // No color buffer to draw to or read from
        glDrawBuffer(GL_NONE);
        glReadBuffer(GL_NONE);

        // Check framebuffer completeness at the end of initialization.
        CHECK_FRAMEBUFFER_STATUS();

        <draw something>

        // Re-enable rendering to the window
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

        glBindTexture(GL_TEXTURE_2D, depth_tex);
        <draw to the window, reading from the depth_tex>

    (8) FBO and ARB_draw_buffers

        // Given: color_texA - TEXTURE_2D color texture object
        // Given: color_texB - TEXTURE_2D color texture object
        //        depth_rb   - GL_DEPTH renderbuffer object
        //        fb         - framebuffer object

        // Set up the framebuffer object
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_COLOR_ATTACHMENT0,
                                  GL_TEXTURE_2D, color_texA, 0);
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_COLOR_ATTACHMENT1,
                                  GL_TEXTURE_2D, color_texB, 0);
        glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
                                     GL_DEPTH_ATTACHMENT,
                                     GL_RENDERBUFFER, depth_rb);

        // Enable both attachments as draw buffers
        GLenum drawbuffers = {GL_COLOR_ATTACHMENT0,
                              GL_COLOR_ATTACHMENT1};
        glDrawBuffers(2, drawbuffers);

        // Check framebuffer completeness at the end of initialization.
        CHECK_FRAMEBUFFER_STATUS();

        // Enable fragment program that writes to both gl_FragData[0]
        // and gl_FragData[1]

        <draw something>

        // Disable fragment program

        // Re-enable rendering to the window
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

        // Bind both textures, each to a different texture unit
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, color_texA);
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, color_texB);

        <draw to the window>

Sample Code (from framebuffer_blit)

    /* Render to framebuffer object 2 */
    glBindFramebuffer(DRAW_FRAMEBUFFER, 2);
    RenderScene();

    /* Blit contents of color buffer, depth buffer and stencil buffer
     * from framebuffer object 2 to framebuffer object 1.
     */
    glBindFramebuffer(GL_READ_FRAMEBUFFER, 2);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 1);
    glBlitFramebuffer(0, 0, 640, 480,
                       0, 0, 640, 480,
                       GL_COLOR_BUFFER_BIT |
                       GL_DEPTH_BUFFER_BIT |
                       GL_STENCIL_BUFFER_BIT,
                       GL_NEAREST);

    /* Blit contents of color buffer from framebuffer object 1 to
     * framebuffer object 2, inverting the image in the X direction.
     */
    glBindFramebuffer(GL_READ_FRAMEBUFFER, 1);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 2);
    glBlitFramebuffer(0, 0, 640, 480,
                       640, 0, 0, 480,
                       GL_COLOR_BUFFER_BIT,
                       GL_NEAREST);

    /* Blit color buffer from framebuffer object 1 to framebuffer
     * object 3 with a 2X zoom and linear filtering.
     */
    glBindFramebuffer(GL_READ_FRAMEBUFFER, 1);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 3);
    glBlitFramebuffer(0, 0, 640, 480,
                       0, 0, 1280, 960,
                       GL_COLOR_BUFFER_BIT, GL_LINEAR);

Usage Examples (from packed_depth_stencil)

    (1) Attach a DEPTH_STENCIL texture image to an FBO as both the
        depth and stencil buffers.

        glGenFramebuffers(1, &fb);
        glGenTextures(1, &tex_color);
        glGenTextures(1, &tex_depthstencil);

        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);

        // Setup color texture (mipmap)
        glBindTexture(GL_TEXTURE_2D, tex_color);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,
                     512, 512, 0, GL_RGBA, GL_INT, NULL);
        glGenerateMipmap(GL_TEXTURE_2D);
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_COLOR_ATTACHMENT0,
                                  GL_TEXTURE_2D, tex_color, 0);

        // Setup depth_stencil texture (not mipmap)
        glBindTexture(GL_TEXTURE_2D, tex_depthstencil);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8,
                     512, 512, 0, GL_DEPTH_STENCIL,
                      GL_UNSIGNED_INT_24_8, NULL);
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_DEPTH_ATTACHMENT,
                                  GL_TEXTURE_2D, tex_depthstencil, 0);
        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
                                  GL_STENCIL_ATTACHMENT,
                                  GL_TEXTURE_2D, tex_depthstencil, 0);

        // Check framebuffer completeness at the end of initialization.

        loop {
            glBindTexture(GL_TEXTURE_2D, 0);
            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
            <render to color, depth, and stencil textures>
            glBindFramebuffer(GL_FRAMEBUFFER, 0);

            glBindTexture(GL_TEXTURE_2D, tex_color);
            glGenerateMipmap(GL_TEXTURE_2D);
            <draw to the window, reading from the color texture>

            glBindTexture(GL_TEXTURE_2D, tex_depthstencil);
            <draw to the window, reading depth from the depthstencil texture>
        }


Issues

    (1) What should this extension be named?

        RESOLVED. We will call this ARB_framebuffer_object.

    (2) What additional functionality does this extension include over
        EXT_framebuffer_object?

        RESOLVED.

        Currently we incorporate the following layered extensions:

         * EXT_framebuffer_multisample
         * EXT_framebuffer_blit
         * EXT_packed_depth_stencil

        As well as the following features:

         * Permit attachments with different width and height (mixed
           dimensions)

         * Permit color attachments with different formats (mixed
           formats).

         * Render to 1 and 2 component R/RG formats that are provided
           via the ARB_texture_rg extension. L/A/LA/I will be
           left for a separate (trivial) extension.

         * Gen'ed names must be used for framebuffer objects and
           renderbuffers.

         * Added FramebufferTextureLayer.

        Other features we have considered include:

         * Render to Vertex Attrib (RTVA)

         * Format compatibility API that can guarantee a set of textures
           images have framebuffer-compatible formats.

         * Infolog or other means for communicating framebuffer
           incompleteness information to the application for debugging
           purposes.

         * A technique for page flipping framebuffer-attachable images.

         * Relaxing framebuffer completeness restrictions, possibly even
           remove FRAMEBUFFER_UNSUPPORTED.  Maybe go so far as to remove
           CheckFramebufferStatus.

        Features we have rejected include:

         * GetRenderbufferImage (benefit/demand does not seem to
           outweigh the additional complexity.)

         * READ_BUFFER == NONE for framebuffer zero.

         * Attach images from a window or from a pbuffer to an
           application-created framebuffer object.

    (3) What are the other differences from EXT_framebuffer_object.

         * Framebuffer completeness only considers the attachments named
           by DRAW_BUFFERi and READ_BUFFER.  Any other attachments do
           not affect framebuffer completeness.  (In
           EXT_framebuffer_object, all attachments affected framebuffer
           completeness, independent of the DRAW_BUFFERi and READ_BUFFER
           state.)
         * Added new queries for the sizes of the bit planes for color,
           depth and stencil attachments at a framebuffer attachment point.
         * Added new queries for framebuffer attachment component type and
           color encoding.
         * Many other minor tweaks to synchronize with the GL3 framebuffer
           objects.
         * ARB FBOs are not shareable.

    (4) Do we need new enum values, or can we re-use the ones from the EXT
        versions?

        RESOLVED. This extension is designed to be compatible with
        EXT_framebuffer_object, and thus we can reuse the enumerants. There
        are also a number of additional enumerants added in this extension.

    (5) What should a query of RED_BITS, GREEN_BITS, BLUE_BITS, ALPHA_BITS.
        return if the attached color-renderable images have different
        formats?

        RESOLVED. The values of RED_BITS, GREEN_BIT, BLUE_BITS and
        ALPHA_BITS are only defined if all color attachments of the draw
        framebuffer have identical formats, in which case the color
        component sizes of color attachment zero are return. This is
        necessary for backwards compatibility with EXT_framebuffer_object.
        The actual sizes of the color, depth, or stencil bit planes can be
        obtained by querying an attachment point using
        GetFramebufferAttachmentParameteriv using the new
        FRAMEBUFFER_ATTACHMENT_*_SIZE enumerants, or by querying the object
        attached at that point.

    (6) What are the proper names for the 1 and 2 component fixed-point,
        float, and pure integer texture formats?

        RESOLVED: as introduced in the 3.0 spec, using RED and RG base
        internal format terminology. The new RED/RG formats have also been
        spun out of 3.0 as the ARB_texture_rg extension.

    (7) This extension and EXT_framebuffer_object both have "bind
        framebuffer" functions (BindFramebuffer and BindFramebufferEXT). Are
        there any differences in functionality between the two functions?

        RESOLVED: Yes. Both extensions will create a new framebuffer object
        if called with an unused name. However, BindFramebuffer defined in
        this extension will generate an INVALID_OPERATION error if the name
        provided has not been generated by GenFramebuffer. That error did
        not exist in EXT_framebuffer_object, and this extension does not
        modify the behavior of BindFramebufferEXT. This difference also
        applies to BindRenderbuffer from this extension vs.
        BindRenderbufferEXT from EXT_framebuffer_object.

    (8) Why don't the new tokens and entry points in this extension have
       "ARB" suffixes like other ARB extensions?

        RESOLVED: Unlike most ARB extensions, this is a strict subset of
        functionality already approved in OpenGL 3.0. This extension
        exists only to support that functionality on older hardware that
        cannot implement a full OpenGL 3.0 driver. Since there are no
        possible behavior changes between the ARB extension and core
        features, source code compatibility is improved by not using
        suffixes on the extension.

    (9) Should color-renderable textures be limited to a subset of
        color base internal formats?

        RESOLVED:  No, all color base internal formats and
        sized internal formats should be supported by FBO; the FBO
        status can report what works and doesn't work.

        The glCheckFramebufferStatus provides a mechanism for FBOs to
        report whether or not the FBO configuration is supported or
        not (i.e. GL_FRAMEBUFFER_UNSUPPORTED).  If implementations
        have issues supporting certain color formats for rendering,
        the existing FBO mechanism is sufficient to report their lack
        of support.

        Prior to revision 29, the list of color-renderable base internal
        formats did not include LUMINANCE, LUMINANCE_ALPHA, or INTENSITY
        (and the EXT version of FBO did not list ALPHA either).

        This lead to inconsistent operation of FBO.  For example, you
        could use a glFramebufferTexture2D to attach a texture that
        was LUMINANCE, LUMINANCE_ALPHA, or INTENSITY to an FBO and find
        out via glCheckFramebufferStatus that this combination wasn't
        considered color-renderable, but if an internal format for one of
        these base internal formats was used with glRenderbufferStorage,
        then an OpenGL error would be generated according to the
        specification.  Such inconsistencies are undesirable and
        unnecessarily limit the render-to-texture functionality exposed by
        some implementations when hardware capable of rendering to
        LUMINANCE, LUMINANCE_ALPHA, and INTENSITY textures does exist.

        For this reason, revision 29 (specification version 1.1) adds
        these previously missing based internal formats.  Developers are
        warned that some implementations (specification version 1.0)
        will report OpenGL errors if glRenderbufferStorage is called for
        LUMINANCE, INTENSITY, LUMINANCE_ALPHA formats (or even possibly
        ALPHA in the case of the EXT version of FBO).

        Some thought was given to introducing a new, one-off extension
        (instead of a version 1.1) to allow the LUMINANCE, INTENSITY,
        LUMINANCE_ALPHA base internal formats and their respective
        sized formats to be color-renderable (both otherwise introduce
        no new API).  Given the existence of a mechanism for determine
        whether or not an FBO is supported, simply providing this version
        1.1 clarification was judged to be the most expedient approach.
        This approach also provides consistency with other approved
        ARB specifications such as ARB_framebuffer_sRGB which describes
        (see its issue #9) that formats such as GL_SLUMINANCE8.

   (10) Can ARB framebuffer objects be shared between contexts?
        ARB_framebuffer_object is supposed to be compatible with
        EXT_framebuffer_object, but also a subset of OpenGL 3.0.
        EXT_framebuffer_object (rev. 120) explicitly allows sharing in
        issue 76, but the 3.0 spec explicitly disallows it in Appendix D.

        Resolved: No. ARB_framebuffer_object is intended to capture the
        functionality that went into GL 3.0.  Furthermore, given that the
        entry points and tokens in this extension and the core are identical
        there is no way that an implementation could differentiate FBOs
        created with this extension from those created by core GL.

        ADDITIONAL COMMENTS:

        See the "Dependencies on EXT_framebuffer_object" section above for
        the interaction behaviour between EXT and non-EXT FBO interfaces.

Revision History

    #1, October 20, 2005: jjuliano
        - branch from EXT_framebuffer_object
        - Delete old issues and revision history

    #2, November 28, 2005: jjuliano
        - Add issues 1 and 2.
        - Describe RenderbufferStorage in terms of color/depth/stencil
          renderable with forward reference to 4.4.4.
        - Reword the definitions of color/depth/stencil renderable.
        - Explicitly state how framebuffer operations write to and read
          from texture images.
        - Incorporate feedback from Barthold.

    #3-draft2, January 16, 2006: jjuliano
        - Define the conversions to/from framebuffer in terms of the
          internal format(s) of the attached image(s).
        - Handle color mask in RGBA to internal component conversion.
        - Improve language in section 4.4.5.
        - Add dependencies on more extensions.

    #4c April 28, 2008: dgkoch
        - merge in framebuffer_blit and update other references to
          FRAMEBUFFER_EXT and FRAMEBUFFER_BINDING_EXT, eliminating all
          references to the obsolete bindings.

    #5 May 2, 2008: rbarris, dgkoch
        - merge in framebuffer_multisample

    #6 May 8, 2008: dgkoch
        - rebase against OpenGL 2.1 spec

    #7 May 8, 2008: dgkoch
        - merge in packed_depth_stencil

    #8 May 8, 2008: dgkoch
        - add caveat that MSAA to MSAA blit may have issues (khronos bug
          #3005)

    #9 May 9, 2008: dgkoch
        - renamed from EXT_fbo2 to ARB_fbo. Changed all suffixes to _ARB
          instead of _EXT.

   #10 May 19, 2008: rbarris
        - Bugzilla 3013: allow dimension mismatches (esp. depth)

   #11 May 21, 2008: dgkoch
        - Bugzilla 3014: allow different color formats when using MRT.
        - added Issues 4, 5
        - deleted FRAMEBUFFER_INCOMPLETE_FORMATS &
          FRAMEBUFFER_INCOMPLETE_DIMENSIONS
        - added text for proposed resolution of Issue (5)

   #12 May 22, 2008: dgkoch
        - Bugzilla 3015: define one- and two- component formats to be
          color-renderable
        - added Issue 6

   #13 May 29, 2008: Jon Leech
        - Many updates and minor fixes for consistency with the 3.0 spec
          draft. Replace DEPTH with DEPTH_COMPONENT in most uses. Increase
          MAX_RENDERBUFFER_SIZE to 64 matching MAX_TEXTURE_SIZE (pending
          resolution of bug 3454). Pose some open questions preceded by
          "***".

   #14 June 26: dgkoch
        - change MAX_SAMPLES to 0, to indicate the multisampling is not
          required. (bug 3551)

   #15 July 2: Jon Leech
        - More updates for 3.0 spec consistency. Define meaning of <src>
          NONE and FRONT_AND_BACK for ReadBuffer() - this was an
          oversight introduced with the original extension. Replace
          reference to nonexistent table 12.nnn with reference to
          table 3.15. Start introducing RED and RG formats from 3.0 spec.

   #16 July 10: dgkoch
        - backport error change for DrawBuffer in 4.2.1 (bug 3530)

   #17 July 12, 2008: Jon Leech
        - Use 'layer' instead of 'zoffset' terminology. Add
          FramebufferTextureLayer.
        - Add framebuffer attachment queries for attachment component
          size / type / color encoding.
        - Allow framebuffer incomplete if no default framebuffer is made
          current, with new framebuffer status error.
        - Allow multisample buffers in framebuffer objects.
        - Global renaming / simplification to "default framebuffer" and
          "framebuffer object". Did not yet re-flow those paragraphs for
          ease of comparison.
        - Add more introductory material about framebuffers in chapter 2.
        - Remove requirement that all color attachments have the same
          depth.
        - Restrict FBOs and renderbuffers to Gen'ed names as agreed for
          3.0.
        - Update clipping / buffer intersection / filtering rules for
          BlitFramebuffer.
        - Allow FRAMEBUFFER as a bind pseudotarget aliasing both read
          and draw framebuffer targets. Allow DEPTH_STENCIL_ATTACHMENT
          as an attachment alias for both depth and stencil attachments.
        - Add Pat's introductory paragraph describing feedback loops in
          section 4.4.3.
        - Make RED_BITS etc. context queries defined iff all draw color
          buffers have the same format.
        - Remove "Dependencies" sections for NV extensions since we no
          longer refer to their tokens. Need to add some dependencies
          sections for new ARB extensions and figure out which language
          goes here and which language with those extensions (e.g.
          texture_rg, framebuffer_sRGB,
        - Many minor non-functional language tweaks to match 3.0 core
          language.

    #18 July 14, 2008: Rob Barris
        - Tidy up introductory/overview section

    #19 July 16, 2008: Daniel Koch, Rob Barris
        - add interactions with ARB_texture_rg, EXT_texture_array and
          NV_float_buffer
        - restore FRAMEBUFFER enumerant and restore all the text where
          it had been accepted before (removed in version 4).
        - allow texture arrays via FramebufferTextureLayer
        - removed reference to required format list which we don't have here.
        - updated resolution of issue (6)

    #20 July 16, 2008: Daniel Koch, Rob Barris
        - simplification of language for logical operation when a FB-image
          is attached more than once
        - add interactions with EXT_texture_integer and ARB_framebuffer_sRGB
        - Resolved issues (2), (4) and (5)
        - Updated issue (3) (although the list is still not exhaustive)

    #21 July 17, 2008: Daniel Koch
        - add Issue (7) as suggested by pbrown
        - restore FRAMEBUFFER_BINDING alias
        - fix incorrect references to FRAMEBUFFER_BINDING

    #22 July 17, 2008: Jon Leech
        - minor language cleanup for consistency with the 3.0 core spec.

    #23 July 24, 2008: Jon Leech
        - Use new GLX rendering opcodes for BindRenderbuffer and
          BindFramebuffer so they can be semantically distinguished
          from the EXT entry points.
        - Add GLX protocol for FramebufferTextureLayer.

    #24 August 7, 2008: Jon Leech
        - Remove ARB suffixes.

    #25 August 8, 2008: Jon Leech
        - Add missing framebuffer attachment state for component type /
          encoding / size to state tables.

    #26 August 8, 2008: Jon Leech
        - Add missing INDEX token for legacy default framebuffer
          color buffer component types.

    #27 August 20, 2008: Jon Leech
        - Add ALPHA to list of color-renderable base internal formats to
          sync with 3.0 spec language.

    #28 November 17, 2008: Mark Kilgard & Nigel Stewart
        - glFramebufferTexturLayerARB -> glFramebufferTextureLayerARB
          (add final e to Texture)

    #29 March 12, 2009: Jon Leech
        - Edits in chapter 4 intro for consistency with GL core spec
          language, including removing the completeness requirement that all
          color buffers of an FBO be the same depth. Reflow some text for
          readability.

    #30 March 31, 2009: Mark Kilgard & Jeff Juliano
        - Change color-renderable to be any color texture format.
          Fix some typos.

    #31 May 27, 2009: Jon Leech
        - Change default value of FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
          to NONE (bug 4407).

    #32 July 21, 2010: Daniel Koch
        - Add issue 10 clarifying that ARB fbos cannot be shared.

    #33 July 22, 2011: Jon Leech
        - Remove error which disallowed non-multisample <-> sample blits
          (bug 7367).

    #34 October 2, 2011: Jon Leech
        - Bring chapter 6 language changes in sync with the OpenGL 3.0 API
          specification phrasing, and fix the description of
          GetFramebufferAttachmentParameteriv to use DEPTH and STENCIL as
          attachment names, rather than the nonexistent DEPTH_BUFFER and
          STENCIL_BUFFER tokens (Bug 8102).

    #35 June 29, 2013: Jon Leech
        - Rearrange New Tokens section to allow all simple queries to be
          queried with GetBooleanv as well, since it's defined to work for
          all of them (Bug 6838).

    #36, September 23, 2013: Jon Leech
        - Specify that undefined behavior results when mixing EXT and
          ARB_framebuffer_object / OpenGL 3.0 API framebuffer objects
          (Bug 10738).

    #37, June 20, 2016: Kevin Rogvin, James Jones
        - Specify behaviour of mixing EXT and ARB_framebuffer_object /
          OpenGL 3.0 framebuffer objects so that the aliases of the
          functions are correctly observed (Bug 1485)

    #38, October 6, 2016: Jon Leech
        - Remove STENCIL_REF from list of state moved to become framebuffer
          dependent (Bug 8422).
