• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Name
2
3    EXT_draw_buffers
4
5Name Strings
6
7    GL_EXT_draw_buffers
8
9Contributors
10
11    Contributors to GL_NV_draw_buffers
12    Contributors to GL_NV_fbo_color_attachments
13    Contributors to the OpenGL ES 2.0 specification
14    Contributors to the OpenGLSL ES 1.0.17 specification
15    Contributors to the OpenGL ES 3.0 specification
16    Nicolas Capens, TransGaming Inc.
17    Daniel Koch, TransGaming Inc.
18    Alastair Patrick, Google Inc.
19    Kenneth Russell, Google Inc.
20    Greg Roth, NVIDIA Corporation
21    Ben Bowman, Imagination Technologies
22    Members of the WebGL and OpenGL ES working groups
23
24Contact
25
26    Daniel Koch (daniel 'at' transgaming.com)
27
28Status
29
30    Draft Complete
31
32Version
33
34    Last Modified Date: January 30, 2013
35    Revision: #7
36
37Number
38
39    TBD
40
41Dependencies
42
43    OpenGL ES 2.0 is required.
44
45    The extension is written against the OpenGL ES 2.0 specification.
46
47    ANGLE_framebuffer_blit affects the definition of this extension.
48    APPLE_framebuffer_multisample affects the definitin of this extension.
49
50Overview
51
52    This extension increases the number of available framebuffer object
53    color attachment points, extends OpenGL ES 2.0 to allow multiple output
54    colors, and provides a mechanism for directing those outputs to
55    multiple color buffers.
56
57    This extension is similar to the combination of the GL_NV_draw_buffers
58    and GL_NV_fbo_color_attachments extensions, but imposes certain
59    restrictions informed by the OpenGL ES 3.0 API.
60
61New Procedures and Functions
62
63      void DrawBuffersEXT(sizei n, const enum *bufs);
64
65New Tokens
66
67    Accepted by the <pname> parameter of GetIntegerv:
68
69        MAX_COLOR_ATTACHMENTS_EXT             0x8CDF
70
71    Accepted by the <pname> parameters of GetIntegerv and GetFloatv:
72
73        MAX_DRAW_BUFFERS_EXT                  0x8824
74        DRAW_BUFFER0_EXT                      0x8825
75        DRAW_BUFFER1_EXT                      0x8826
76        DRAW_BUFFER2_EXT                      0x8827
77        DRAW_BUFFER3_EXT                      0x8828
78        DRAW_BUFFER4_EXT                      0x8829
79        DRAW_BUFFER5_EXT                      0x882A
80        DRAW_BUFFER6_EXT                      0x882B
81        DRAW_BUFFER7_EXT                      0x882C
82        DRAW_BUFFER8_EXT                      0x882D
83        DRAW_BUFFER9_EXT                      0x882E
84        DRAW_BUFFER10_EXT                     0x882F
85        DRAW_BUFFER11_EXT                     0x8830
86        DRAW_BUFFER12_EXT                     0x8831
87        DRAW_BUFFER13_EXT                     0x8832
88        DRAW_BUFFER14_EXT                     0x8833
89        DRAW_BUFFER15_EXT                     0x8834
90
91    Accepted by the <attachment> parameter of FramebufferRenderbuffer,
92    FramebufferTexture2D and GetFramebufferAttachmentParameteriv, and by
93    the <bufs> parameter of DrawBuffersEXT:
94
95        COLOR_ATTACHMENT0_EXT                      0x8CE0
96        COLOR_ATTACHMENT1_EXT                      0x8CE1
97        COLOR_ATTACHMENT2_EXT                      0x8CE2
98        COLOR_ATTACHMENT3_EXT                      0x8CE3
99        COLOR_ATTACHMENT4_EXT                      0x8CE4
100        COLOR_ATTACHMENT5_EXT                      0x8CE5
101        COLOR_ATTACHMENT6_EXT                      0x8CE6
102        COLOR_ATTACHMENT7_EXT                      0x8CE7
103        COLOR_ATTACHMENT8_EXT                      0x8CE8
104        COLOR_ATTACHMENT9_EXT                      0x8CE9
105        COLOR_ATTACHMENT10_EXT                     0x8CEA
106        COLOR_ATTACHMENT11_EXT                     0x8CEB
107        COLOR_ATTACHMENT12_EXT                     0x8CEC
108        COLOR_ATTACHMENT13_EXT                     0x8CED
109        COLOR_ATTACHMENT14_EXT                     0x8CEE
110        COLOR_ATTACHMENT15_EXT                     0x8CEF
111
112    The COLOR_ATTACHMENT0_EXT constant is equal to the
113    COLOR_ATTACHMENT0 constant.
114
115    Each COLOR_ATTACHMENT<i>_EXT adheres to COLOR_ATTACHMENT<i>_EXT
116    = COLOR_ATTACHMENT0_EXT + <i>.
117
118Changes to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)
119
120    Section 3.2, (Multisampling). Replace the second paragraph:
121
122    An additional buffer, called the multisample buffer, is added to the
123    window system-provided framebuffer. Pixel sample values, including
124    color, depth, and stencil values, are stored in this buffer. Samples
125    contain separate color values for each fragment color. When the
126    window system-provided framebuffer includes a multisample buffer, it
127    does not include depth or stencil buffers, even if the multisample
128    buffer does not store depth or stencil values. Color buffers do
129    coexist with the multisample buffer, however.
130
131    Section 3.8.2, (Shader Execution) Replace subsection "Shader
132    Outputs":
133
134    The OpenGL ES Shading Language specification describes the values
135    that may be output by a fragment shader. These are gl_FragColor and
136    gl_FragData[n].  The final fragment color values or the final
137    fragment data values written by a fragment shader are clamped to the
138    range [0, 1] and then converted to fixed-point as described in
139    section 2.1.2 for framebuffer color components.
140
141    Writing to gl_FragColor specifies the fragment color (color number
142    zero) that will be used by subsequent stages of the pipeline.
143    Writing to gl_FragData[n] specifies the value of fragment color
144    number n. Any colors, or color components, associated with a
145    fragment that are not written by the fragment shader are undefined.
146    A fragment shader may not statically assign values to both
147    gl_FragColor and gl_FragData. In this case, a compile or link error
148    will result. A shader statically assigns a value to a variable if,
149    after preprocessing, it contains a statement that would write to the
150    variable, whether or not run-time flow of control will cause that
151    statement to be executed.
152
153Changes to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
154Operations and the Frame Buffer)
155
156    Modify the overview of Chapter 4 and replace the sentences
157    of the fifth paragraph which read:
158
159    "The name of the color buffer of an application-created framebuffer
160    object is COLOR_ATTACHMENT0. The names of the depth and stencil buffers
161    are DEPTH_ATTACHMENT and STENCIL_ATTACHMENT."
162
163    With the following:
164
165    "A framebuffer object has an array of color buffer attachment points,
166    numbered zero through <n>, a depth buffer attachment point, and a
167    stencil buffer attachment point."
168
169    Insert Table 4.3 to Section 4.2.1 (and renumber subsequent tables):
170
171    Symbolic Constant                       Meaning
172    -----------------                       ---------------------
173    NONE                                    No buffer
174
175    COLOR_ATTACHMENT<i>_EXT (see caption)   Output fragment color to image
176                                            attached at color attachment
177                                            point i
178
179    Table 4.3: Arguments to DrawBuffersEXT when the context is bound to a
180    framebuffer object, and the buffers they indicate. <i> in
181    COLOR_ATTACHMENT<i>_EXT may range from zero to the value of
182    MAX_COLOR_ATTACHMENTS_EXT minus one.
183
184    Replace Section 4.2.1, "Selecting a Buffer for Writing" with the following:
185
186    "By default, color values are written into the front buffer for
187    single buffered surfaces or into the back buffer for back buffered
188    surfaces as determined when making the context current. To control
189    the color buffer into which each of the fragment color values is
190    written, DrawBuffersEXT is used.
191
192    The command
193
194      void DrawBuffersEXT(sizei n, const enum *bufs);
195
196    defines the draw buffers to which all fragment colors are written.
197    <n> specifies the number of buffers in <bufs>. <bufs> is a pointer
198    to an array of symbolic constants specifying the buffer to which
199    each fragment color is written.
200
201    Each buffer listed in <bufs> must be BACK, NONE, or one of the
202    values from table 4.3. Further, acceptable values for the constants
203    in <bufs> depend on whether the GL is using the default framebuffer
204    (i.e., DRAW_FRAMEBUFFER_BINDING is zero), or a framebuffer object
205    (i.e., DRAW_FRAMEBUFFER_BINDING is non-zero). For more information
206    about framebuffer objects, see section 4.4.
207
208    If the GL is bound to the default framebuffer, then <n> must be 1
209    and the constant must be BACK or NONE. When draw buffer zero is
210    BACK, color values are written into the sole buffer for single-
211    buffered contexts, or into the back buffer for double-buffered
212    contexts. If DrawBuffersEXT is supplied with a constant other than
213    BACK and NONE, the error INVALID_OPERATION is generated.
214
215    If the GL is bound to a draw framebuffer object, then each of the
216    constants must be one of the values listed in table 4.3.
217
218    In both cases, the draw buffers being defined correspond in order to
219    the respective fragment colors. The draw buffer for fragment
220    colors beyond <n> is set to NONE.
221
222    The maximum number of draw buffers is implementation-dependent. The
223    number of draw buffers supported can be queried by calling
224    GetIntegerv with the symbolic constant MAX_DRAW_BUFFERS_EXT. An
225    INVALID_VALUE error is generated if <n> is greater than
226    MAX_DRAW_BUFFERS_EXT.
227
228    If the GL is bound to a draw framebuffer object, the <i>th buffer listed
229    in <bufs> must be COLOR_ATTACHMENT<i>_EXT or NONE. Specifying a
230    buffer out of order, BACK, or COLOR_ATTACHMENT<m>_EXT where <m> is
231    greater than or equal to the value of MAX_COLOR_ATTACHMENTS_EXT,
232    will generate the error INVALID_OPERATION.
233
234    If a fragment shader writes to "gl_FragColor", DrawBuffersEXT
235    specifies the set of draw buffers into which the color
236    written to "gl_FragColor" is written. If a fragment shader writes to
237    "gl_FragData", DrawBuffersEXT specifies a set of draw buffers
238    into which each of the multiple output colors defined by these
239    variables are separately written. If a fragment shader writes to
240    neither "gl_FragColor" nor "gl_FragData" the values of the
241    fragment colors following shader execution are undefined, and may
242    differ for each fragment color.
243
244    Indicating a buffer or buffers using DrawBuffersEXT causes
245    subsequent pixel color value writes to affect the indicated
246    buffers. If the GL is bound to a draw framebuffer object and a draw
247    buffer selects an attachment that has no image attached, then that
248    fragment color is not written.
249
250    Specifying NONE as the draw buffer for a fragment color will inhibit
251    that fragment color from being written.
252
253    The state required to handle color buffer selection for each
254    framebuffer is an integer for each supported fragment color. For the
255    default framebuffer, in the initial state the draw buffer for
256    fragment color zero is BACK if there is a default framebuffer
257    associated with the context, otherwise NONE. For framebuffer
258    objects, in the initial state the draw buffer for fragment color
259    zero is COLOR_ATTACHMENT0_EXT.
260
261    For both the default framebuffer and framebuffer objects, the
262    initial state of draw buffers for fragment colors other than zero is
263    NONE.
264
265    The value of the draw buffer selected for fragment color <i> can be
266    queried by calling GetIntegerv with the symbolic constant
267    DRAW_BUFFER<i>_EXT."
268
269    Modify Section 4.2.3 (Clearing the Buffers) and replace the first
270    two paragraphs with the following:
271
272    "The GL provides a means for setting portions of every pixel in a
273    particular buffer to the same value.  The argument to
274
275        void Clear(bitfield buf);
276
277    is the bitwise OR of a number of values indicating which buffers are
278    to be cleared. The values are COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT, and
279    STENCIL_BUFFER_BIT, indicating the buffers currently enabled for color
280    writing, the depth buffer, and the stencil buffer (see below),
281    respectively. The value to which each buffer is cleared depends on
282    the setting of the clear value for that buffer.  If the mask is not a
283    bitwise OR of the specified values, then the error INVALID_VALUE is
284    generated.
285
286        void ClearColor(clampf r, clampf, g, clampf b, clampf a);
287
288    sets the clear value for fixed-point color buffers.  Each of the
289    specified components is clamped to [0, 1] and converted to fixed-point
290    as described in section 2.1.2 for framebuffer color components."
291
292    Replace the second paragraph of Section 4.4.1 (Binding and Managing
293    Framebuffer Objects) with the following:
294
295    "The namespace for framebuffer objects is the unsigned integers, with
296    zero reserved by OpenGL ES to refer to the default framebuffer. A
297    framebuffer object is created by binding an unused name to the
298    target FRAMEBUFFER, DRAW_FRAMEBUFFER, or READ_FRAMEBUFFER. The binding
299    is effected by calling
300
301        void BindFramebuffer(enum target, uint framebuffer);
302
303    with <target> set the desired framebuffer target and <framebuffer> set
304    to the unused name. The resulting framebuffer object is a new state
305    vector. There is a number of color attachment points, plus one each
306    for the depth and stencil attachment points. The number of color attachment
307    points is equal to the value of MAX_COLOR_ATTACHMENTS_EXT."
308
309    Replace the third item in the bulleted list in Section 4.4.1 (Binding
310    and Managing Framebuffer Objects) with the following:
311
312    " * The only color buffer bitplanes are the ones defined by the
313    framebuffer attachments points named COLOR_ATTACHMENT0_EXT through
314    COLOR_ATTACHMENT<n>_EXT."
315
316    Modify Section 4.4.3 (Renderbuffer Objects) in the
317    "Attaching Renderbuffer Images to a Framebuffer" subsection as follows:
318
319    Insert the following table:
320
321    Name of attachment
322    ---------------------------------------
323    COLOR_ATTACHMENT<i>_EXT (see caption)
324    DEPTH_ATTACHMENT
325    STENCIL_ATTACHMENT
326
327    Table 4.x: Framebuffer attachment points. <i> in COLOR_ATTACHMENT<i>_EXT
328    may range from zero to the value of MAX_COLOR_ATTACHMENTS_EXT minus 1.
329
330    Modify the third sentence of the paragraph following the definition of
331    FramebufferRenderbuffer to be as follows:
332
333    "<attachment> should be set to one of the attachment points of the
334    framebuffer listed in Table 4.x."
335
336    Modify Section 4.4.3 (Renderbuffer Objects) in the "Attaching Texture
337    Images to a Framebuffer" subsection as follows:
338
339    Modify the last sentence of the paragraph following the definition of
340    FramebufferTexture2D to be as follows:
341
342    "<attachment> must be one of the attachment points of the framebuffer
343    listed in Table 4.x."
344
345    Modify Section 4.4.5 (Framebuffer Completeness) and replace the 3rd
346    item in the bulleted list in the "Framebuffer Attachment Completeness"
347    subsection with the following:
348
349    " * If <attachment> is COLOR_ATTACHMENT<i>_EXT, then <image> must
350    have a color-renderable internal format."
351
352Changes to Chapter 6 of the OpenGL ES 2.0 Specification (State and
353State Requests)
354
355    In section 6.1.3 (Enumerated Queries) modify the third sentence in
356    the definition of GetFramebufferAttachmentParameteriv to be as follows:
357
358    "<attachment> must be one of the attachment points of the framebuffer
359    listed in Table 4.x."
360
361Changes to Chapter 3 of the OpenGL ES Shading Language 1.0.17 Specification (Basics)
362
363    Add a new section:
364
365    3.4.1 GL_EXT_draw_buffers Extension
366
367    To use the GL_EXT_draw_buffers extension in a shader it
368    must be enabled using the #extension directive.
369
370    The shading language preprocessor #define
371    GL_EXT_draw_buffers will be defined to 1, if the
372    GL_EXT_draw_buffers extension is supported.
373
374Dependencies on ANGLE_framebuffer_blit and APPLE_framebuffer_multisample:
375
376    If neither ANGLE_framebuffer_blit nor APPLE_framebuffer_multisample are
377    supported, then all references to "draw framebuffers" should be replaced
378    with references to "framebuffers". References to DRAW_FRAMEBUFFER_BINDING
379    should be replaced with references to FRAMEBUFFER_BINDING. References to
380    DRAW_FRAMEBUFFER and READ_FRAMEBUFFER should be removed.
381
382    If ANGLE_framebuffer_blit is supported, DRAW_FRAMEBUFFER_BINDING, DRAW_FRAMEBUFFER
383    and READ_FRAMEBUFFER all refer to corresponding _ANGLE suffixed names
384    (they have the same token values).
385
386    If APPLE_framebuffer_multisample is supported, DRAW_FRAMEBUFFER_BINDING,
387    DRAW_FRAMEBUFFER and READ_FRAMEBUFFER all refer to the corresponding _APPLE
388    suffixed names (they have the same token values).
389
390Errors
391
392    The INVALID_OPERATION error is generated if DrawBuffersEXT is called
393    when the default framebuffer is bound and any of the following conditions
394    hold:
395     - <n> is greater than 1 and less than MAX_DRAW_BUFFERS_EXT,
396     - <bufs> contains a value other than BACK or NONE.
397
398    The INVALID_OPERATION error is generated if DrawBuffersEXT is called
399    when bound to a draw framebuffer object and any of the following
400    conditions hold:
401     - the <i>th value in <bufs> is not COLOR_ATTACHMENT<i>_EXT or NONE.
402
403    The INVALID_VALUE error is generated if DrawBuffersEXT is called
404    with a value of <n> which is greater than MAX_DRAW_BUFFERS_EXT.
405
406    The INVALID_ENUM error is generated by FramebufferRenderbuffer if
407    the <attachment> parameter is not one of the values listed in Table 4.x.
408
409    The INVALID_ENUM error is generated by FramebufferTexture2D if
410    the <attachment> parameter is not one of the values listed in Table 4.x.
411
412    The INVALID_ENUM error is generated by GetFramebufferAttachmentParameteriv
413    if the <attachment> parameter is not one of the values listed in Table 4.x.
414
415New State
416
417    Add Table 6.X Framebuffer (State per framebuffer object):
418
419    State               Type Get Command  Initial Value Description
420    ------------------  ---- ------------ ------------- -----------
421    DRAW_BUFFER<i>_EXT  Z10* GetIntegerv  see 4.2.1     Draw buffer selected
422							  for fragment color i
423
424    Add to Table 6.18 (Implementation Dependent Values)
425
426    Get value                 Type Get Cmnd    Minimum Value Description             Sec.
427    --------------------      ---- ----------- ------------- -----------             -----
428    MAX_DRAW_BUFFERS_EXT      Z+   GetIntegerv 1             Maximum number of       4.2.1
429                                                             active draw buffers
430    MAX_COLOR_ATTACHMENTS_EXT Z+   GetIntegerv 1             Number of framebuffer   4.4.1
431                                                             color attachment points
432Issues
433
434    See ARB_draw_buffers for relevant issues.
435
436  1) What are the differences between this extension and NV_draw_buffers
437    + NV_fbo_color_attachments?
438
439    RESOLVED. This extension:
440     - adds interactions with blit_framebuffer and the separate
441       draw/read binding points
442     - The draw buffer and color attachment limits are global instead
443       of per-fbo (see Issue 2)
444     - can be used to with default framebuffer to set NONE/BACK (see Issue 4)
445     - retains the ordering restrictions on color attachments that are
446       imposed by ES 3.0.
447
448   2) Should the MAX_DRAW_BUFFERS_EXT and MAX_COLOR_ATTACHMENTS_EXT limits
449    be per-framebuffer values or implementation dependent constants?
450
451    DISCUSSION: In ARB_draw_buffers this was per-context (see Issue 2).
452    EXT_framebuffer_object (and subsequently ARB_framebuffer_object, and GL 3.0
453    through GL 4.2) made these queries framebuffer-dependent.
454    However in GL 4.3 and GLES 3.0, these limits were changed from
455    framebuffer-dependent state to implementation-dependent state after
456    much discussion (Bug 7990).
457
458    NV_draw_buffers has MAX_DRAW_BUFFERS listed as per-framebuffer state,
459    but NV_fbo_color_attachments has MAX_COLOR_ATTACHMENTS as an
460    implementation-dependent constant.
461
462    This is relevant because some implementations are not able to support
463    multisampling in conjuction with multiple color attachments.  If the
464    query is per-framebuffer, they can report a maximum of one attachment
465    when there are multisampled attachments, but a higher limit when only
466    single-sampled attachments are present.
467
468    RESOLVED. Make this global context state as this is most consistent
469    with GLES 3.0 and updated GL drivers. In an implementation cannot
470    support multisampling in conjunction with multiple color attachments,
471    perhaps such an implementation could report FBO incomplete in this
472    situation, but this is less than desirable.
473
474   3) Should we support broadcast from gl_FragColor to all gl_FragData[x]
475    or should it be synonymous with gl_FragData[0]?
476
477    DISCUSSION: With NV_draw_buffers, writing to gl_FragColor writes to all
478    the enabled draw buffers (ie broadcast). In OpenGL ES 3.0 when using
479    ESSL 1.0, gl_FragColor is equivalent to writing a single output to
480    gl_FragData[0] and multiple outputs are not possible. When using ESSL 3.0,
481    only user-defined out variables may be used.
482
483    If broadcast is supported, some implementations may have to replace
484    writes to gl_FragColor with replicated writes to all possible gl_FragData
485    locations when this extension is enabled.
486
487    RESOLVED: Writes to gl_FragColor are broadcast to all enabled color
488    buffers. ES 3.0 using ESSL 1.0 doesn't support broadcast because
489    ESSL 1.0 was not extended to have multiple color outputs (but that is
490    what this extension adds). ESSL 3.0 doesn't support the broadcast because
491    it doesn't have the gl_FragColor variable at all, and only has user-
492    defined out variables. This extension extends ESSL 1.0 to have multiple
493    color outputs. Broadcasting from gl_FragColor to all enabled color
494    buffers is the most consistent with existing draw buffer extensions to
495    date (both NV_draw_buffers and desktop GL).
496
497   4) Should we allow DrawBuffersEXT to be called when the default FBO is
498    bound?
499
500    DISCUSSION: NV_draw_buffers specifies that DrawBuffersNV errors with
501    INVALID_OPERATION when the default FBO is bound. OpenGL ES 3.0 allows
502    DrawBuffers to toggle between BACK and NONE on the default FBO.
503
504    An implementation that does not natively support disabling the drawbuffer
505    on the default FBO could emulate this by disabling color writes.
506
507    RESOLVED: Allow DrawBuffersEXT to be called for the default FBO. This
508    is more forward looking and is compatible with ES 3.0.
509
510   5) What are the requirements on the color attachment sizes and formats?
511
512    RESOLVED: ES 2.0 requires that all color buffers attached to application-
513    created framebuffer objects must have the same number of bitplanes
514    (Chapter 4 overview p91). ES 2.0 also requires that all attached images
515    have the same width and height (Section 4.4.5 Framebuffer Completeness).
516    This extension does not lift those requirements, and failing to meet
517    them will result in an incomplete FBO.
518
519   6) Does this have any interactions with glClear?
520
521    RESOLVED: Yes. When multiple color buffers are enabled for writing,
522    glClear clears all of the color buffers.  Added language clarifying
523    that glClear and glClearColor may affect multiple color buffers.
524
525Revision History
526
527    01/30/2013  dgkoch  add issue 6 and clear interactions
528                        renamed to EXT_draw_buffers based on feedback
529                        changed resolution of issue 3.
530    01/23/2013  dgkoch  add resolutions to issues 2-4.
531                        add issue 5.
532                        Add Table 4.x and update various explicit
533                        references to COLOR_ATTACHMENT0.
534                        Add errors.
535    11/13/2012  dgkoch  add revision history
536                        add text from updated ES 3.0 spec
537                        add issues for discussion
538    10/16/2012  kbr     update name string
539    10/16/2012  kbr     remove restrition requiring draw buffer 0 to be non-NULL
540    10/12/2012  kbr     remove references to GetDoublev and ReadBuffer
541    10/11/2012  kbr     initial draft extension
542
543