• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Name
2
3    EXT_framebuffer_blit
4
5Name Strings
6
7    GL_EXT_framebuffer_blit
8
9Contributors
10
11    Michael Gold
12    Evan Hart
13    Jeff Juliano
14    Jon Leech
15    Bill Licea-Kane
16    Barthold Lichtenbelt
17    Brian Paul
18    Ian Romanick
19    John Rosasco
20    Jeremy Sandmel
21    Eskil Steenberg
22
23Contact
24
25    Michael Gold, NVIDIA Corporation (gold 'at' nvidia.com)
26
27Status
28
29    Complete.  Approved by the ARB "superbuffers" working group on
30    November 8, 2005.
31
32Version
33
34    Last Modified Date: April 5, 2007
35    Author Revision: 15
36
37Number
38
39    316
40
41Dependencies
42
43    OpenGL 1.1 is required.
44
45    EXT_framebuffer_object is required.
46
47    The extension is written against the OpenGL 1.5 specification.
48
49    ARB_color_buffer_float affects the definition of this extension.
50
51Overview
52
53    This extension modifies EXT_framebuffer_object by splitting the
54    framebuffer object binding point into separate DRAW and READ
55    bindings.  This allows copying directly from one framebuffer to
56    another.  In addition, a new high performance blit function is
57    added to facilitate these blits and perform some data conversion
58    where allowed.
59
60IP Status
61
62    No known IP claims.
63
64New Procedures and Functions
65
66    void BlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1,
67                            int dstX0, int dstY0, int dstX1, int dstY1,
68                            bitfield mask, enum filter);
69
70New Tokens
71
72    Accepted by the <target> parameter of BindFramebufferEXT,
73    CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT,
74    FramebufferRenderbufferEXT, and
75    GetFramebufferAttachmentParameterivEXT:
76
77    READ_FRAMEBUFFER_EXT                0x8CA8
78    DRAW_FRAMEBUFFER_EXT                0x8CA9
79
80    Accepted by the <pname> parameters of GetIntegerv, GetFloatv, and GetDoublev:
81
82    DRAW_FRAMEBUFFER_BINDING_EXT        0x8CA6 // alias FRAMEBUFFER_BINDING_EXT
83    READ_FRAMEBUFFER_BINDING_EXT        0x8CAA
84
85
86Additions to Chapter 2 of the OpenGL 1.5 Specification (OpenGL Operation)
87
88    Append the following to section 2.6.1:
89
90    "Calling Begin will result in an INVALID_FRAMEBUFFER_OPERATION_EXT
91    error if the object bound to DRAW_FRAMEBUFFER_BINDING_EXT is not
92    "framebuffer complete" (section 4.4.4.2)."
93
94Additions to Chapter 3 of the OpenGL 1.5 Specification (Rasterization)
95
96    Add to section 3.6.3, at the end of the subsection titled
97    "Alternate Color Table Specification Commands":
98
99    "Calling CopyColorTable or CopyColorSubTable will result in an
100    INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to
101    READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"
102    (section 4.4.4.2)."
103
104    Add to section 3.6.3, at the end of the subsection titled
105    "Alternate Convolution Filter Specification Commands":
106
107    "Calling CopyConvolutionFilter1D or CopyConvolutionFilter2D will
108    result in an INVALID_FRAMEBUFFER_OPERATION_EXT error if the object
109    bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer
110    complete" (section 4.4.4.2)."
111
112    In section 3.6.4, modify the final paragraph of the definition of
113    DrawPixels as follows:
114
115    "Calling DrawPixels will result in an
116    INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to
117    DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"
118    (section 4.4.4.2)."
119
120    Add the following to section 3.7, following the description of
121    Bitmap:
122
123    "Calling Bitmap will result in an
124    INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to
125    DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"
126    (section 4.4.4.2)."
127
128    Append the following to section 3.8.2:
129
130    "Calling CopyTexSubImage3D, CopyTexImage2D,
131    CopyTexSubImage2D, CopyTexImage1D or CopyTexSubImage1D will result
132    in an INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound
133    to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"
134    (section 4.4.4.2)."
135
136Additions to Chapter 4 of the OpenGL 1.5 Specification (Per-Fragment
137Operations and the Frame Buffer)
138
139    Change the first word of Chapter 4 from "The" to "A".
140
141    Append to the introduction of Chapter 4:
142
143    "Conceptually, the GL has two active framebuffers; the draw
144    framebuffer is the destination for rendering operations, and the
145    read framebuffer is the source for readback operations.  The same
146    framebuffer may be used for both drawing and reading.  Section
147    4.4.1 describes the mechanism for controlling framebuffer usage."
148
149    Modify the last paragraph of section 4.1.1 as follows:
150
151    "While an application-created framebuffer object is bound to
152    DRAW_FRAMEBUFFER_EXT, the pixel ownership test always passes."
153
154    Modify the last sentence of the second to last paragraph of
155    section 4.2.4 as follows:
156
157    "If there is no accumulation buffer, or if the DRAW_FRAMEBUFFER_EXT
158    and READ_FRAMEBUFFER_EXT bindings (section 4.4.4.2) do not refer to
159    the same object, or if the GL is in color index mode, Accum
160    generates the error INVALID_OPERATION."
161
162    Add to 4.3.2 (Reading Pixels), right before the subsection titled
163    "Obtaining Pixels from the Framebuffer":
164
165    "Calling ReadPixels generates INVALID_FRAMEBUFFER_OPERATION_EXT if
166    the object bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer
167    complete" (section 4.4.4.2)."
168
169    In section 4.3.2, modify the definition of ReadBuffer as follows:
170
171    "The command
172
173         void ReadBuffer( enum src );
174
175    takes a symbolic constant as argument.  <src> must be one of the
176    values from tables 4.4 or 10.nnn.  Otherwise, INVALID_ENUM is
177    generated.  Further, the acceptable values for <src> depend on
178    whether the GL is using the default window-system-provided
179    framebuffer (i.e., READ_FRAMEBUFFER_BINDING_EXT is zero), or an
180    application-created framebuffer object (i.e.,
181    READ_FRAMEBUFFER_BINDING_EXT is non-zero).  For more information
182    about application-created framebuffer objects, see section 4.4.
183
184    When READ_FRAMEBUFFER_BINDING_EXT is zero, i.e. the default
185    window-system-provided framebuffer, <src> must be one of the
186    values listed in table 4.4. FRONT and LEFT refer to the front left
187    buffer, BACK refers to the back left buffer, and RIGHT refers to
188    the front right buffer.  The other constants correspond directly
189    to the buffers that they name. If the requested buffer is missing,
190    then the error INVALID_OPERATION is generated.  For the default
191    window-system-provided framebuffer, the initial setting for
192    ReadBuffer is FRONT if there is no back buffer and BACK
193    otherwise.
194
195    Modify the first sentence of section 4.3.3 as follows:
196
197    "CopyPixels transfers a rectangle of pixel values from one region
198    of the read framebuffer to another in the draw framebuffer."
199
200    Add the following text to section 4.3.3, page 194, inside the
201    definition of CopyPixels:
202
203    "Finally, the behavior of several GL operations is specified "as if
204    the arguments were passed to CopyPixels."  These operations include:
205    CopyTex{Sub}Image*, CopyColor{Sub}Table, and CopyConvolutionFilter*.
206    INVALID_FRAMEBUFFER_OPERATION_EXT will be generated if an attempt is
207    made to execute one of these operations, or CopyPixels, while the
208    object bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer
209    complete" (as defined in section 4.4.4.2).  Furthermore, an attempt
210    to execute CopyPixels will generate
211    INVALID_FRAMEBUFFER_OPERATION_EXT while the object bound to
212    DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"."
213
214    Append to section 4.3.3:
215
216    "BlitFramebufferEXT transfers a rectangle of pixel values from one
217    region of the read framebuffer to another in the draw framebuffer.
218    There are some important distinctions from CopyPixels, as
219    described below.
220
221    BlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1,
222                       int dstX0, int dstY0, int dstX1, int dstY1,
223                       bitfield mask, enum filter);
224
225    <mask> is the bitwise OR of a number of values indicating which
226    buffers are to be copied. The values are COLOR_BUFFER_BIT,
227    DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT, which are described in
228    section 4.2.3.  The pixels corresponding to these buffers are
229    copied from the source rectangle, bound by the locations (srcX0,
230    srcY0) and (srcX1, srcY1), to the destination rectangle, bound by
231    the locations (dstX0, dstY0) and (dstX1, dstY1).  The lower bounds
232    of the rectangle are inclusive, while the upper bounds are
233    exclusive.
234
235    If the source and destination rectangle dimensions do not match,
236    the source image is stretched to fit the destination
237    rectangle. <filter> must be LINEAR or NEAREST and specifies the
238    method of interpolation to be applied if the image is
239    stretched. LINEAR filtering is allowed only for the color buffer;
240    if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, and
241    filter is not NEAREST, no copy is performed and an
242    INVALID_OPERATION error is generated.  If the source and
243    destination dimensions are identical, no filtering is applied.  If
244    either the source or destination rectangle specifies a negative
245    dimension, the image is reversed in the corresponding direction.
246    If both the source and destination rectangles specify a negative
247    dimension for the same direction, no reversal is performed.
248
249    If the source and destination buffers are identical, and the
250    source and destination rectangles overlap, the result of the blit
251    operation is undefined.
252
253    The pixel copy bypasses the fragment pipeline.  The only fragment
254    operations which affect the blit are the pixel ownership test and
255    the scissor test.
256
257    If a buffer is specified in <mask> and does not exist in both the
258    read and draw framebuffers, the corresponding bit is silently
259    ignored.
260
261    If the color formats of the read and draw framebuffers do not
262    match, and <mask> includes COLOR_BUFFER_BIT, the pixel groups are
263    converted to match the destination format as in CopyPixels, except
264    that no pixel transfer operations apply and clamping behaves as if
265    CLAMP_FRAGMENT_COLOR_ARB is set to FIXED_ONLY_ARB.
266
267    Calling CopyPixels or BlitFramebufferEXT will result in an
268    INVALID_FRAMEBUFFER_OPERATION_EXT error if the objects bound to
269    DRAW_FRAMEBUFFER_BINDING_EXT and READ_FRAMEBUFFER_BINDING_EXT are
270    not "framebuffer complete" (section 4.4.4.2)."
271
272    Calling BlitFramebufferEXT will result in an INVALID_OPERATION
273    error if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
274    and the source and destination depth and stencil buffer formats do
275    not match.
276
277    Modify the beginning of section 4.4.1 as follows:
278
279    "The default framebuffer for rendering and readback operations is
280    provided by the windowing system.  In addition, named framebuffer
281    objects can be created and operated upon.  The namespace for
282    framebuffer objects is the unsigned integers, with zero reserved
283    by the GL for the default framebuffer.
284
285    A framebuffer object is created by binding an unused name to
286    DRAW_FRAMEBUFFER_EXT or READ_FRAMEBUFFER_EXT.  The binding is
287    effected by calling
288
289        void BindFramebufferEXT(enum target, uint framebuffer);
290
291    with <target> set to the desired framebuffer target and
292    <framebuffer> set to the unused name.  The resulting framebuffer
293    object is a new state vector, comprising all the state values
294    listed in table 4.nnn, as well as one set of the state values
295    listed in table 5.nnn for each attachment point of the
296    framebuffer, set to the same initial values.  There are
297    MAX_COLOR_ATTACHMENTS_EXT color attachment points, plus one each
298    for the depth and stencil attachment points.
299
300    BindFramebufferEXT may also be used to bind an existing
301    framebuffer object to DRAW_FRAMEBUFFER_EXT or
302    READ_FRAMEBUFFER_EXT.  If the bind is successful no change is made
303    to the state of the bound framebuffer object, and any previous
304    binding to <target> is broken.
305
306    If a framebuffer object is bound to DRAW_FRAMEBUFFER_EXT or
307    READ_FRAMEBUFFER_EXT, it becomes the target for rendering or
308    readback operations, respectively, until it is deleted or another
309    framebuffer is bound to the corresponding bind point.  Calling
310    BindFramebufferEXT with <target> set to FRAMEBUFFER_EXT binds the
311    framebuffer to both DRAW_FRAMEBUFFER_EXT and READ_FRAMEBUFFER_EXT.
312
313    While a framebuffer object is bound, GL operations on the target
314    to which it is bound affect the images attached to the bound
315    framebuffer object, and queries of the target to which it is bound
316    return state from the bound object.  Queries of the values
317    specified in table 6.31 (Implementation Dependent Pixel Depths)
318    and table 8.nnn (Framebuffer-Dependent State Variables) are
319    derived from the framebuffer object bound to DRAW_FRAMEBUFFER_EXT.
320
321    The initial state of DRAW_FRAMEBUFFER_EXT and READ_FRAMEBUFFER_EXT
322    refers to the default framebuffer provided by the windowing
323    system.  In order that access to the default framebuffer is not
324    lost, it is treated as a framebuffer object with the name of 0.
325    The default framebuffer is therefore rendered to and read from
326    while 0 is bound to the corresponding targets.  On some
327    implementations, the properties of the default framebuffer can
328    change over time (e.g., in response to windowing system events
329    such as attaching the context to a new windowing system drawable.)"
330
331    Change the description of DeleteFramebuffersEXT as follows:
332
333    "<framebuffers> contains <n> names of framebuffer objects to be
334    deleted.  After a framebuffer object is deleted, it has no
335    attachments, and its name is again unused.  If a framebuffer that
336    is currently bound to one or more of the targets
337    DRAW_FRAMEBUFFER_EXT or READ_FRAMEBUFFER_EXT is deleted, it is as
338    though BindFramebufferEXT had been executed with the corresponding
339    <target> and <framebuffer> zero.  Unused names in <framebuffers>
340    are silently ignored, as is the value zero."
341
342
343    In section 4.4.2.2, modify the first two sentences of the
344    description of FramebufferRenderbufferEXT as follows:
345
346    "<target> must be DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT, or
347    FRAMEBUFFER_EXT.  If <target> is FRAMEBUFFER_EXT, it behaves as
348    though DRAW_FRAMEBUFFER_EXT was specified.  INVALID_OPERATION is
349    generated if the value of the corresponding binding is zero."
350
351    In section 4.4.2.3, modify the first two sentences of the
352    description of FramebufferTexturexDEXT as follows:
353
354    "In all three routines, <target> must be DRAW_FRAMEBUFFER_EXT,
355    READ_FRAMEBUFFER_EXT, or FRAMEBUFFER_EXT.  If <target> is
356    FRAMEBUFFER_EXT, it behaves as though DRAW_FRAMEBUFFER_EXT was
357    specified.  INVALID_OPERATION is generated if the value of the
358    corresponding binding is zero."
359
360    In section 4.4.4.2, modify the first sentence of the description
361    of CheckFramebufferStatusEXT as follows:
362
363    "If <target> is not DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or
364    FRAMEBUFFER_EXT, INVALID_ENUM is generated.  If <target> is
365    FRAMEBUFFER_EXT, it behaves as though DRAW_FRAMEBUFFER_EXT was
366    specified."
367
368    Modify section 4.4.4.3 as follows:
369
370    "Attempting to render to or read from a framebuffer which is not
371    framebuffer complete will generate an
372    INVALID_FRAMEBUFFER_OPERATION_EXT error."
373
374
375
376Additions to Chapter 6 of the OpenGL 1.5 Specification (State and State
377Requests)
378
379    In section 6.1.3, modify the first sentence of the description of
380    GetFramebufferAttachmentParameterivEXT as follows:
381
382    "<target> must be DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or
383    FRAMEBUFFER_EXT.  If <target> is FRAMEBUFFER_EXT, it behaves as
384    though DRAW_FRAMEBUFFER_EXT was specified."
385
386
387GLX Protocol
388
389    BlitFramebufferEXT
390        2        44              rendering command length
391        2        4330            rendering command opcode
392        4        CARD32          source X0
393        4        CARD32          source Y0
394        4        CARD32          source X1
395        4        CARD32          source Y1
396        4        CARD32          destination X0
397        4        CARD32          destination Y0
398        4        CARD32          destination X1
399        4        CARD32          destination Y1
400        4        CARD32          mask
401        4        ENUM            filter
402
403Dependencies on ARB_color_buffer_float
404
405    The reference to CLAMP_FRAGMENT_COLOR_ARB in section 4.3.3 applies
406    only if ARB_color_buffer_float is supported.
407
408Errors
409
410    The error INVALID_FRAMEBUFFER_OPERATION_EXT is generated if
411    BlitFramebufferEXT, DrawPixels, or CopyPixels is called while the
412    draw framebuffer is not framebuffer complete.
413
414    The error INVALID_FRAMEBUFFER_OPERATION_EXT is generated if
415    BlitFramebufferEXT, ReadPixels, CopyPixels, CopyTex{Sub}Image*,
416    CopyColor{Sub}Table, or CopyConvolutionFilter* is called while the
417    read framebuffer is not framebuffer complete.
418
419    The error INVALID_VALUE is generated by BlitFramebufferEXT if
420    <mask> has any bits set other than those named by
421    COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT.
422
423    The error INVALID_OPERATION is generated if BlitFramebufferEXT is
424    called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
425    and <filter> is not NEAREST.
426
427    The error INVALID_OPERATION is generated if BlitFramebufferEXT is
428    called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
429    and the source and destination depth or stencil buffer formats do
430    not match.
431
432    The error INVALID_ENUM is generated by BlitFramebufferEXT if
433    <filter> is not LINEAR or NEAREST.
434
435    The error INVALID_OPERATION is generated if BlitFramebufferEXT
436    is called within a Begin/End pair.
437
438    The error INVALID_ENUM is generated if BindFramebufferEXT,
439    CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT,
440    FramebufferRenderbufferEXT, or
441    GetFramebufferAttachmentParameterivEXT is called and <target> is
442    not DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or FRAMEBUFFER_EXT.
443
444New State
445
446    (modify table 3.nnn, "Framebuffer (state per framebuffer target binding point)")
447
448    Get Value                     Type   Get Command   Initial Value    Description               Section       Attribute
449    ----------------------------  ----   -----------   --------------   -------------------       ------------  ---------
450    DRAW_FRAMEBUFFER_BINDING_EXT   Z+    GetIntegerv   0                framebuffer object bound  4.4.1         -
451                                                                        to DRAW_FRAMEBUFFER_EXT
452    READ_FRAMEBUFFER_BINDING_EXT   Z+    GetIntegerv   0                framebuffer object        4.4.1         -
453                                                                        to READ_FRAMEBUFFER_EXT
454
455    Remove reference to FRAMEBUFFER_BINDING_EXT.
456
457
458Sample Code
459
460    /* Render to framebuffer object 2 */
461    BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 2);
462    RenderScene();
463
464    /* Blit contents of color buffer, depth buffer and stencil buffer
465     * from framebuffer object 2 to framebuffer object 1.
466     */
467    BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 2);
468    BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 1);
469    BlitFramebufferEXT(0, 0, 640, 480,
470                       0, 0, 640, 480,
471                       GL_COLOR_BUFFER_BIT |
472                       GL_DEPTH_BUFFER_BIT |
473                       GL_STENCIL_BUFFER_BIT,
474                       GL_NEAREST);
475
476    /* Blit contents of color buffer from framebuffer object 1 to
477     * framebuffer object 2, inverting the image in the X direction.
478     */
479    BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 1);
480    BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 2);
481    BlitFramebufferEXT(0, 0, 640, 480,
482                       640, 0, 0, 480,
483                       GL_COLOR_BUFFER_BIT,
484                       GL_NEAREST);
485
486    /* Blit color buffer from framebuffer object 1 to framebuffer
487     * object 3 with a 2X zoom and linear filtering.
488     */
489    BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 1);
490    BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 3);
491    BlitFramebufferEXT(0, 0, 640, 480,
492                       0, 0, 1280, 960,
493                       GL_COLOR_BUFFER_BIT, GL_LINEAR);
494
495
496Issues
497
498    1) Should we pass in explicit source/dest rects instead of using
499       the rasterpos/pixelzoom?
500
501        Resolved: use explicit rects, so we don't need to perform
502        multiple state changes.
503
504    2) Should rects be (start,size) or (start,end)?
505
506        Resolved: use (start,end).  This is a break from the past
507        (scissor, viewport) but is more intuitive than allowing a
508        negative size where mirrored zooms are desireable.
509
510    3) What should we call the blit function?
511
512        Resolved: BlitFramebufferEXT
513
514    4) Should filtering apply to depth or stencil values?
515
516        Resolved: No
517
518    5) What happens if LINEAR is specified and DEPTH or STENCIL is in
519       the mask?
520
521        Resolved: Generate ERROR_INVALID_OPERATION
522
523    6) What happens if READ_FRAMEBUFFER is NONE and a read is
524       attempted?
525
526        Resolved: Generate ERROR_INVALID_OPERATION
527
528    7) Should we generalize binding point assignment with a single
529       entry point and a parameter specifying read/write/whatever?
530
531        Resolved: concensus leans toward separate Read/Draw entry
532        points.
533
534    8) Should we define READ_FRAMEBUFFER and DRAW_FRAMEBUFFER targets
535       for BindFramebuffer instead of introducing a new level of
536       indirection?
537
538        Resolved: Yes.  Binding to the legacy target FRAMEBUFFER sets
539        both DRAW_FRAMEBUFFER and READ_FRAMEBUFFER.  Querying
540        FRAMEBUFFER_BINDING return the DRAW_FRAMEBUFFER_BINDING.
541
542    9) What happens when a user queries framebuffer attributes,
543       e.g. Get(RED_BITS)?  Is the result returned from
544       READ_FRAMEBUFFER or DRAW_FRAMEBUFFER?  Do we need a new query?
545       e.g.
546
547       GetFramebufferParameteriv(int target, enum pname, int* value)
548
549        Resolved: always return the value associated with the
550        DRAW_FRAMEBUFFER.  Do not add a new query.
551
552    10) How does Accum behave in the presence of separate READ/DRAW
553        framebuffers?
554
555        Resolved: Accum returns INVALID_OPERATION if the
556        READ_FRAMEBUFFER and DRAW_FRAMEBUFFER bindings are not
557        identical.
558
559    11) Should blits be allowed between buffers of different bit sizes?
560
561        Resolved: Yes, for color buffers only.  Attempting to blit
562        between depth or stencil buffers of different size generates
563        INVALID_OPERATION.
564
565    12) Should we add support for multiple ReadBuffers, so that
566        multiple color buffers may be copied with a single call to
567        BlitFramebuffer?
568
569        Resolved: No, we considered this but the behavior is awkward
570        to define and the functionality is of limited use.
571
572    13) How should BlitFramebuffer color space conversion be
573        specified?  Do we allow context clamp state to affect the
574        blit?
575
576        Resolved: Blitting to a fixed point buffer always clamps,
577        blitting to a floating point buffer never clamps.  The context
578        state is ignored.
579
580    14) Should overlapped blits be allowed?  Should they be guaranteed
581        to work?
582
583        Resolved: Overlapping blits are allowed but are undefined.
584
585
586Revision History
587
588    Revision 15, 2007/4/6
589      - Removed language left over from ReadBuffers.
590      - Removed reference to nonexistent 'CopyTexImage3D'.
591    Revision 14, 2006/09/29
592      - Changed the resolution of issue 12 to reflect the working
593        group decision to abandon ReadBuffers.
594      - Eliminated issues 15, 16 and 17 as they are no longer relevent.
595      - Changed the resolution of issue 14 and the corresponding spec
596        language to indicate that the result of an overlapping blit is
597        undefined.
598      - Changed the spec language to clarify that the lower bound of a
599        blit rectangle is inclusive while the upper bound is
600        exclusive.
601      - Added a sample showing an inverted blit, to clarify the pixel
602        addressing rules.
603      - Clarified spec language and error behavior to indicate that
604        blitting DEPTH and STENCIL buffers with LINEAR filtering is
605        always disallowed, whether or not the blit is scaling.
606    Revision 13, 2006/06/01 (Jeff Juliano)
607      - Clarify errors generated when read and draw framebuffers are
608        incomplete.
609    Revision 12, 2005/12/22 (Jon Leech)
610      - Assigned enumerant values. Add return type to BlitFramebufferEXT.
611        Note INVALID_ENUM error if filter is not LINEAR or NEAREST.
612    Revision 11, 2005/12/14
613      - Added several missing conditions to the Errors section.
614      - Changed status to "Complete".
615    Revision 10, 2005/11/6
616      - Removed all ReadBuffers discussion, as this functionality will
617        be deferred.  Issues 15-17 are hereafter irrelevent.
618    Revision 9, 2005/10/31
619      - Resolved issue 16 and updated language to reflect this decision.
620      - Minor language changes per feedback.
621      - Added issue 17 and resolution, although language does not reflect this.
622    Revision 8, 2005/10/20
623      - Added ReadBuffersEXT language
624      - Removed some redundant language in ReadBuffer
625      - Re-opened issue 15 for further consideration
626      - Added issue 16
627    Revision 7, 2005/10/7
628      - Added issues 13 and 14, and resolution for 11, 13, and 14.
629      - Added dependency on ARB_color_buffer_float.
630      - Removed multisample language, now covered in EXT_framebuffer_multisample.
631      - Added framebuffer incomplete error language to spec proper.
632      - Alias DRAW_FRAMEBUFFER_BINDING_EXT to FRAMEBUFFER_BINDING_EXT.
633      - Updated Overview text to reflect the resolution to issue 8.
634    Revision 6, 2005/9/26
635      - Moved issues to the end, per new conventions.
636      - Added new language referring to DRAW_FRAMEBUFFER and
637        READ_FRAMEBUFFER bind points to sections 4.1.1, 4.4.1,
638        4.4.2.2, 4.4.2.3, 4.4.4.2, 6.1.3 and Errors, and updated the
639        example code, per resolution of issue 8.
640      - Added language in section 4.4.1 specifying Get behavior, per
641        resolution of issue 9.
642      - Added language to section 4.2.4 describing new error behavior
643        for Accum, per resolution of issue 10.
644      - Added language to section 4.3.3 describing color format
645        conversion, per resolution of issue 11.
646    Revision 5, 2005/9/6
647      - Added issues 8 - 11
648      - Minor edits from reviewer feedback
649    Revision 4, 2005/9/5
650      - Added chapter 4 intro section
651      - Added errors and state table information
652      - Added sample code
653      - fixed typos
654    Revision 3, 2005/8/29
655      - Converted to spec template
656    Revision 2, 2005/7/18
657      - Lots of new issues added and resolved
658    Revision 1, 2005/7/5
659      - Initial draft
660