Name

    EXT_draw_buffers

Name Strings

    GL_EXT_draw_buffers

Contributors

    Contributors to GL_NV_draw_buffers
    Contributors to GL_NV_fbo_color_attachments
    Contributors to the OpenGL ES 2.0 specification
    Contributors to the OpenGLSL ES 1.0.17 specification
    Contributors to the OpenGL ES 3.0 specification
    Nicolas Capens, TransGaming Inc.
    Daniel Koch, TransGaming Inc.
    Alastair Patrick, Google Inc.
    Kenneth Russell, Google Inc.
    Greg Roth, NVIDIA Corporation
    Ben Bowman, Imagination Technologies
    Members of the WebGL and OpenGL ES working groups

Contact

    Daniel Koch (daniel 'at' transgaming.com)

Status

    Draft Complete 

Version

    Last Modified Date: January 30, 2013
    Revision: #7

Number

    TBD

Dependencies

    OpenGL ES 2.0 is required.

    The extension is written against the OpenGL ES 2.0 specification.

    ANGLE_framebuffer_blit affects the definition of this extension.
    APPLE_framebuffer_multisample affects the definitin of this extension.

Overview

    This extension increases the number of available framebuffer object
    color attachment points, extends OpenGL ES 2.0 to allow multiple output
    colors, and provides a mechanism for directing those outputs to
    multiple color buffers.

    This extension is similar to the combination of the GL_NV_draw_buffers
    and GL_NV_fbo_color_attachments extensions, but imposes certain
    restrictions informed by the OpenGL ES 3.0 API.

New Procedures and Functions

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

New Tokens

    Accepted by the <pname> parameter of GetIntegerv:

        MAX_COLOR_ATTACHMENTS_EXT             0x8CDF

    Accepted by the <pname> parameters of GetIntegerv and GetFloatv:

        MAX_DRAW_BUFFERS_EXT                  0x8824
        DRAW_BUFFER0_EXT                      0x8825
        DRAW_BUFFER1_EXT                      0x8826
        DRAW_BUFFER2_EXT                      0x8827
        DRAW_BUFFER3_EXT                      0x8828
        DRAW_BUFFER4_EXT                      0x8829
        DRAW_BUFFER5_EXT                      0x882A
        DRAW_BUFFER6_EXT                      0x882B
        DRAW_BUFFER7_EXT                      0x882C
        DRAW_BUFFER8_EXT                      0x882D
        DRAW_BUFFER9_EXT                      0x882E
        DRAW_BUFFER10_EXT                     0x882F
        DRAW_BUFFER11_EXT                     0x8830
        DRAW_BUFFER12_EXT                     0x8831
        DRAW_BUFFER13_EXT                     0x8832
        DRAW_BUFFER14_EXT                     0x8833
        DRAW_BUFFER15_EXT                     0x8834

    Accepted by the <attachment> parameter of FramebufferRenderbuffer,
    FramebufferTexture2D and GetFramebufferAttachmentParameteriv, and by
    the <bufs> parameter of DrawBuffersEXT:

        COLOR_ATTACHMENT0_EXT                      0x8CE0
        COLOR_ATTACHMENT1_EXT                      0x8CE1
        COLOR_ATTACHMENT2_EXT                      0x8CE2
        COLOR_ATTACHMENT3_EXT                      0x8CE3
        COLOR_ATTACHMENT4_EXT                      0x8CE4
        COLOR_ATTACHMENT5_EXT                      0x8CE5
        COLOR_ATTACHMENT6_EXT                      0x8CE6
        COLOR_ATTACHMENT7_EXT                      0x8CE7
        COLOR_ATTACHMENT8_EXT                      0x8CE8
        COLOR_ATTACHMENT9_EXT                      0x8CE9
        COLOR_ATTACHMENT10_EXT                     0x8CEA
        COLOR_ATTACHMENT11_EXT                     0x8CEB
        COLOR_ATTACHMENT12_EXT                     0x8CEC
        COLOR_ATTACHMENT13_EXT                     0x8CED
        COLOR_ATTACHMENT14_EXT                     0x8CEE
        COLOR_ATTACHMENT15_EXT                     0x8CEF

    The COLOR_ATTACHMENT0_EXT constant is equal to the
    COLOR_ATTACHMENT0 constant.

    Each COLOR_ATTACHMENT<i>_EXT adheres to COLOR_ATTACHMENT<i>_EXT
    = COLOR_ATTACHMENT0_EXT + <i>.

Changes to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)

    Section 3.2, (Multisampling). Replace the second paragraph:

    An additional buffer, called the multisample buffer, is added to the
    window system-provided framebuffer. Pixel sample values, including
    color, depth, and stencil values, are stored in this buffer. Samples
    contain separate color values for each fragment color. When the
    window system-provided framebuffer includes a multisample buffer, it
    does not include depth or stencil buffers, even if the multisample
    buffer does not store depth or stencil values. Color buffers do
    coexist with the multisample buffer, however.

    Section 3.8.2, (Shader Execution) Replace subsection "Shader
    Outputs":

    The OpenGL ES Shading Language specification describes the values
    that may be output by a fragment shader. These are gl_FragColor and
    gl_FragData[n].  The final fragment color values or the final
    fragment data values written by a fragment shader are clamped to the
    range [0, 1] and then converted to fixed-point as described in
    section 2.1.2 for framebuffer color components.

    Writing to gl_FragColor specifies the fragment color (color number
    zero) that will be used by subsequent stages of the pipeline.
    Writing to gl_FragData[n] specifies the value of fragment color
    number n. Any colors, or color components, associated with a
    fragment that are not written by the fragment shader are undefined.
    A fragment shader may not statically assign values to both
    gl_FragColor and gl_FragData. In this case, a compile or link error
    will result. A shader statically assigns a value to a variable if,
    after preprocessing, it contains a statement that would write to the
    variable, whether or not run-time flow of control will cause that
    statement to be executed.

Changes to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)

    Modify the overview of Chapter 4 and replace the sentences
    of the fifth paragraph which read: 

    "The name of the color buffer of an application-created framebuffer
    object is COLOR_ATTACHMENT0. The names of the depth and stencil buffers
    are DEPTH_ATTACHMENT and STENCIL_ATTACHMENT." 

    With the following:

    "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." 

    Insert Table 4.3 to Section 4.2.1 (and renumber subsequent tables):

    Symbolic Constant                       Meaning
    -----------------                       ---------------------
    NONE                                    No buffer

    COLOR_ATTACHMENT<i>_EXT (see caption)   Output fragment color to image 
                                            attached at color attachment
                                            point i

    Table 4.3: Arguments to DrawBuffersEXT when the context is bound to a
    framebuffer object, and the buffers they indicate. <i> in
    COLOR_ATTACHMENT<i>_EXT may range from zero to the value of
    MAX_COLOR_ATTACHMENTS_EXT minus one.

    Replace Section 4.2.1, "Selecting a Buffer for Writing" with the following:

    "By default, color values are written into the front buffer for
    single buffered surfaces or into the back buffer for back buffered
    surfaces as determined when making the context current. To control
    the color buffer into which each of the fragment color values is
    written, DrawBuffersEXT is used.

    The command

      void DrawBuffersEXT(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 BACK, NONE, or one of the
    values from table 4.3. 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 a framebuffer object
    (i.e., DRAW_FRAMEBUFFER_BINDING is non-zero). For more information
    about framebuffer objects, see section 4.4.

    If the GL is bound to the default framebuffer, then <n> must be 1
    and the constant must be BACK or NONE. When draw buffer zero is
    BACK, color values are written into the sole buffer for single-
    buffered contexts, or into the back buffer for double-buffered
    contexts. If DrawBuffersEXT is supplied with a constant other than
    BACK and NONE, the error INVALID_OPERATION is generated.

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

    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. The
    number of draw buffers supported can be queried by calling
    GetIntegerv with the symbolic constant MAX_DRAW_BUFFERS_EXT. An
    INVALID_VALUE error is generated if <n> is greater than
    MAX_DRAW_BUFFERS_EXT.

    If the GL is bound to a draw framebuffer object, the <i>th buffer listed
    in <bufs> must be COLOR_ATTACHMENT<i>_EXT or NONE. Specifying a
    buffer out of order, BACK, or COLOR_ATTACHMENT<m>_EXT where <m> is
    greater than or equal to the value of MAX_COLOR_ATTACHMENTS_EXT,
    will generate the error INVALID_OPERATION.

    If a fragment shader writes to "gl_FragColor", DrawBuffersEXT 
    specifies the set of draw buffers into which the color 
    written to "gl_FragColor" is written. If a fragment shader writes to
    "gl_FragData", DrawBuffersEXT specifies a set of draw buffers
    into which each of the multiple output colors defined by these
    variables 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.

    Indicating a buffer or buffers using DrawBuffersEXT causes
    subsequent pixel color value writes to affect the indicated
    buffers. If the GL is bound to a draw framebuffer object and a draw
    buffer selects an attachment that has no image attached, then that
    fragment color is not written.

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

    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 BACK if there is a default framebuffer
    associated with the context, otherwise NONE. For framebuffer
    objects, in the initial state the draw buffer for fragment color
    zero is COLOR_ATTACHMENT0_EXT.

    For both the default framebuffer and framebuffer objects, the
    initial state of draw buffers for fragment colors other than 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_BUFFER<i>_EXT."

    Modify Section 4.2.3 (Clearing the Buffers) and replace the first
    two paragraphs with the following:

    "The GL provides a means for setting portions of every pixel in a
    particular buffer to the same value.  The argument to
    
        void Clear(bitfield buf);

    is the bitwise OR of a number of values indicating which buffers are
    to be cleared. The values are COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT, and
    STENCIL_BUFFER_BIT, indicating the buffers currently enabled for color
    writing, the depth buffer, and the stencil buffer (see below), 
    respectively. The value to which each buffer is cleared depends on
    the setting of the clear value for that buffer.  If the mask is not a
    bitwise OR of the specified values, then the error INVALID_VALUE is
    generated.

        void ClearColor(clampf r, clampf, g, clampf b, clampf a);
   
    sets the clear value for fixed-point color buffers.  Each of the
    specified components is clamped to [0, 1] and converted to fixed-point
    as described in section 2.1.2 for framebuffer color components."

    Replace the second paragraph of Section 4.4.1 (Binding and Managing
    Framebuffer Objects) with the following:

    "The namespace for framebuffer objects is the unsigned integers, with
    zero reserved by OpenGL ES to refer to the default framebuffer. A
    framebuffer object is created by binding an unused name to the
    target FRAMEBUFFER, DRAW_FRAMEBUFFER, or READ_FRAMEBUFFER. The binding
    is effected by calling

        void BindFramebuffer(enum target, uint framebuffer);

    with <target> set the desired framebuffer target and <framebuffer> set 
    to the unused name. The resulting framebuffer object is a new state 
    vector. There is a number of color attachment points, plus one each
    for the depth and stencil attachment points. The number of color attachment
    points is equal to the value of MAX_COLOR_ATTACHMENTS_EXT."

    Replace the third item in the bulleted list in Section 4.4.1 (Binding
    and Managing Framebuffer Objects) with the following:

    " * The only color buffer bitplanes are the ones defined by the
    framebuffer attachments points named COLOR_ATTACHMENT0_EXT through
    COLOR_ATTACHMENT<n>_EXT."

    Modify Section 4.4.3 (Renderbuffer Objects) in the 
    "Attaching Renderbuffer Images to a Framebuffer" subsection as follows:

    Insert the following table:

    Name of attachment
    ---------------------------------------
    COLOR_ATTACHMENT<i>_EXT (see caption)
    DEPTH_ATTACHMENT
    STENCIL_ATTACHMENT

    Table 4.x: Framebuffer attachment points. <i> in COLOR_ATTACHMENT<i>_EXT
    may range from zero to the value of MAX_COLOR_ATTACHMENTS_EXT minus 1.

    Modify the third sentence of the paragraph following the definition of
    FramebufferRenderbuffer to be as follows:

    "<attachment> should be set to one of the attachment points of the 
    framebuffer listed in Table 4.x." 

    Modify Section 4.4.3 (Renderbuffer Objects) in the "Attaching Texture
    Images to a Framebuffer" subsection as follows:

    Modify the last sentence of the paragraph following the definition of
    FramebufferTexture2D to be as follows:

    "<attachment> must be one of the attachment points of the framebuffer
    listed in Table 4.x."

    Modify Section 4.4.5 (Framebuffer Completeness) and replace the 3rd
    item in the bulleted list in the "Framebuffer Attachment Completeness"
    subsection with the following:

    " * If <attachment> is COLOR_ATTACHMENT<i>_EXT, then <image> must
    have a color-renderable internal format."

Changes to Chapter 6 of the OpenGL ES 2.0 Specification (State and
State Requests)

    In section 6.1.3 (Enumerated Queries) modify the third sentence in
    the definition of GetFramebufferAttachmentParameteriv to be as follows:

    "<attachment> must be one of the attachment points of the framebuffer
    listed in Table 4.x."

Changes to Chapter 3 of the OpenGL ES Shading Language 1.0.17 Specification (Basics)

    Add a new section:

    3.4.1 GL_EXT_draw_buffers Extension

    To use the GL_EXT_draw_buffers extension in a shader it
    must be enabled using the #extension directive.

    The shading language preprocessor #define
    GL_EXT_draw_buffers will be defined to 1, if the
    GL_EXT_draw_buffers extension is supported.

Dependencies on ANGLE_framebuffer_blit and APPLE_framebuffer_multisample:

    If neither ANGLE_framebuffer_blit nor APPLE_framebuffer_multisample are
    supported, then all references to "draw framebuffers" should be replaced
    with references to "framebuffers". References to DRAW_FRAMEBUFFER_BINDING
    should be replaced with references to FRAMEBUFFER_BINDING. References to
    DRAW_FRAMEBUFFER and READ_FRAMEBUFFER should be removed.

    If ANGLE_framebuffer_blit is supported, DRAW_FRAMEBUFFER_BINDING, DRAW_FRAMEBUFFER
    and READ_FRAMEBUFFER all refer to corresponding _ANGLE suffixed names
    (they have the same token values).

    If APPLE_framebuffer_multisample is supported, DRAW_FRAMEBUFFER_BINDING,
    DRAW_FRAMEBUFFER and READ_FRAMEBUFFER all refer to the corresponding _APPLE
    suffixed names (they have the same token values).

Errors

    The INVALID_OPERATION error is generated if DrawBuffersEXT is called
    when the default framebuffer is bound and any of the following conditions
    hold: 
     - <n> is greater than 1 and less than MAX_DRAW_BUFFERS_EXT,
     - <bufs> contains a value other than BACK or NONE.

    The INVALID_OPERATION error is generated if DrawBuffersEXT is called
    when bound to a draw framebuffer object and any of the following
    conditions hold:
     - the <i>th value in <bufs> is not COLOR_ATTACHMENT<i>_EXT or NONE.

    The INVALID_VALUE error is generated if DrawBuffersEXT is called
    with a value of <n> which is greater than MAX_DRAW_BUFFERS_EXT.

    The INVALID_ENUM error is generated by FramebufferRenderbuffer if
    the <attachment> parameter is not one of the values listed in Table 4.x.

    The INVALID_ENUM error is generated by FramebufferTexture2D if
    the <attachment> parameter is not one of the values listed in Table 4.x.

    The INVALID_ENUM error is generated by GetFramebufferAttachmentParameteriv
    if the <attachment> parameter is not one of the values listed in Table 4.x.

New State

    Add Table 6.X Framebuffer (State per framebuffer object):

    State               Type Get Command  Initial Value Description 
    ------------------  ---- ------------ ------------- -----------
    DRAW_BUFFER<i>_EXT  Z10* GetIntegerv  see 4.2.1     Draw buffer selected 
							  for fragment color i

    Add to Table 6.18 (Implementation Dependent Values)

    Get value                 Type Get Cmnd    Minimum Value Description             Sec.
    --------------------      ---- ----------- ------------- -----------             -----
    MAX_DRAW_BUFFERS_EXT      Z+   GetIntegerv 1             Maximum number of       4.2.1
                                                             active draw buffers
    MAX_COLOR_ATTACHMENTS_EXT Z+   GetIntegerv 1             Number of framebuffer   4.4.1
                                                             color attachment points
Issues

    See ARB_draw_buffers for relevant issues.

  1) What are the differences between this extension and NV_draw_buffers
    + NV_fbo_color_attachments?

    RESOLVED. This extension:
     - adds interactions with blit_framebuffer and the separate 
       draw/read binding points
     - The draw buffer and color attachment limits are global instead
       of per-fbo (see Issue 2)
     - can be used to with default framebuffer to set NONE/BACK (see Issue 4)
     - retains the ordering restrictions on color attachments that are 
       imposed by ES 3.0.

   2) Should the MAX_DRAW_BUFFERS_EXT and MAX_COLOR_ATTACHMENTS_EXT limits
    be per-framebuffer values or implementation dependent constants?

    DISCUSSION: In ARB_draw_buffers this was per-context (see Issue 2).
    EXT_framebuffer_object (and subsequently ARB_framebuffer_object, and GL 3.0
    through GL 4.2) made these queries framebuffer-dependent. 
    However in GL 4.3 and GLES 3.0, these limits were changed from 
    framebuffer-dependent state to implementation-dependent state after
    much discussion (Bug 7990).

    NV_draw_buffers has MAX_DRAW_BUFFERS listed as per-framebuffer state,
    but NV_fbo_color_attachments has MAX_COLOR_ATTACHMENTS as an 
    implementation-dependent constant.

    This is relevant because some implementations are not able to support 
    multisampling in conjuction with multiple color attachments.  If the
    query is per-framebuffer, they can report a maximum of one attachment
    when there are multisampled attachments, but a higher limit when only
    single-sampled attachments are present.

    RESOLVED. Make this global context state as this is most consistent 
    with GLES 3.0 and updated GL drivers. In an implementation cannot
    support multisampling in conjunction with multiple color attachments,
    perhaps such an implementation could report FBO incomplete in this 
    situation, but this is less than desirable.

   3) Should we support broadcast from gl_FragColor to all gl_FragData[x]
    or should it be synonymous with gl_FragData[0]?

    DISCUSSION: With NV_draw_buffers, writing to gl_FragColor writes to all
    the enabled draw buffers (ie broadcast). In OpenGL ES 3.0 when using 
    ESSL 1.0, gl_FragColor is equivalent to writing a single output to 
    gl_FragData[0] and multiple outputs are not possible. When using ESSL 3.0,
    only user-defined out variables may be used.

    If broadcast is supported, some implementations may have to replace
    writes to gl_FragColor with replicated writes to all possible gl_FragData
    locations when this extension is enabled.

    RESOLVED: Writes to gl_FragColor are broadcast to all enabled color
    buffers. ES 3.0 using ESSL 1.0 doesn't support broadcast because
    ESSL 1.0 was not extended to have multiple color outputs (but that is
    what this extension adds). ESSL 3.0 doesn't support the broadcast because
    it doesn't have the gl_FragColor variable at all, and only has user-
    defined out variables. This extension extends ESSL 1.0 to have multiple
    color outputs. Broadcasting from gl_FragColor to all enabled color 
    buffers is the most consistent with existing draw buffer extensions to
    date (both NV_draw_buffers and desktop GL).
    
   4) Should we allow DrawBuffersEXT to be called when the default FBO is
    bound?

    DISCUSSION: NV_draw_buffers specifies that DrawBuffersNV errors with 
    INVALID_OPERATION when the default FBO is bound. OpenGL ES 3.0 allows
    DrawBuffers to toggle between BACK and NONE on the default FBO.

    An implementation that does not natively support disabling the drawbuffer
    on the default FBO could emulate this by disabling color writes.

    RESOLVED: Allow DrawBuffersEXT to be called for the default FBO. This
    is more forward looking and is compatible with ES 3.0.

   5) What are the requirements on the color attachment sizes and formats?
    
    RESOLVED: ES 2.0 requires that all color buffers attached to application-
    created framebuffer objects must have the same number of bitplanes
    (Chapter 4 overview p91). ES 2.0 also requires that all attached images
    have the same width and height (Section 4.4.5 Framebuffer Completeness).
    This extension does not lift those requirements, and failing to meet
    them will result in an incomplete FBO.

   6) Does this have any interactions with glClear?

    RESOLVED: Yes. When multiple color buffers are enabled for writing,
    glClear clears all of the color buffers.  Added language clarifying
    that glClear and glClearColor may affect multiple color buffers.

Revision History

    01/30/2013  dgkoch  add issue 6 and clear interactions
                        renamed to EXT_draw_buffers based on feedback
                        changed resolution of issue 3.
    01/23/2013  dgkoch  add resolutions to issues 2-4.
                        add issue 5.
                        Add Table 4.x and update various explicit
                        references to COLOR_ATTACHMENT0.
                        Add errors.
    11/13/2012  dgkoch  add revision history
                        add text from updated ES 3.0 spec
                        add issues for discussion
    10/16/2012  kbr     update name string
    10/16/2012  kbr     remove restrition requiring draw buffer 0 to be non-NULL
    10/12/2012  kbr     remove references to GetDoublev and ReadBuffer
    10/11/2012  kbr     initial draft extension

