blob: 98e1515e512dc005436889040d25627fc1e87253 [file] [log] [blame]
Name
EXT_framebuffer_blit
Name Strings
GL_EXT_framebuffer_blit
Contributors
Michael Gold
Evan Hart
Jeff Juliano
Jon Leech
Bill Licea-Kane
Barthold Lichtenbelt
Brian Paul
Ian Romanick
John Rosasco
Jeremy Sandmel
Eskil Steenberg
Contact
Michael Gold, NVIDIA Corporation (gold 'at' nvidia.com)
Status
Complete. Approved by the ARB "superbuffers" working group on
November 8, 2005.
Version
Last Modified Date: April 5, 2007
Author Revision: 15
Number
316
Dependencies
OpenGL 1.1 is required.
EXT_framebuffer_object is required.
The extension is written against the OpenGL 1.5 specification.
ARB_color_buffer_float affects the definition of this extension.
Overview
This extension modifies EXT_framebuffer_object by splitting the
framebuffer object binding point into separate DRAW and READ
bindings. 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.
IP Status
No known IP claims.
New Procedures and Functions
void BlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1,
int dstX0, int dstY0, int dstX1, int dstY1,
bitfield mask, enum filter);
New Tokens
Accepted by the <target> parameter of BindFramebufferEXT,
CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT,
FramebufferRenderbufferEXT, and
GetFramebufferAttachmentParameterivEXT:
READ_FRAMEBUFFER_EXT 0x8CA8
DRAW_FRAMEBUFFER_EXT 0x8CA9
Accepted by the <pname> parameters of GetIntegerv, GetFloatv, and GetDoublev:
DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 // alias FRAMEBUFFER_BINDING_EXT
READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
Additions to Chapter 2 of the OpenGL 1.5 Specification (OpenGL Operation)
Append the following to section 2.6.1:
"Calling Begin will result in an INVALID_FRAMEBUFFER_OPERATION_EXT
error if the object bound to DRAW_FRAMEBUFFER_BINDING_EXT is not
"framebuffer complete" (section 4.4.4.2)."
Additions to Chapter 3 of the OpenGL 1.5 Specification (Rasterization)
Add to section 3.6.3, at the end of the subsection titled
"Alternate Color Table Specification Commands":
"Calling CopyColorTable or CopyColorSubTable will result in an
INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to
READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"
(section 4.4.4.2)."
Add to section 3.6.3, at the end of the subsection titled
"Alternate Convolution Filter Specification Commands":
"Calling CopyConvolutionFilter1D or CopyConvolutionFilter2D will
result in an INVALID_FRAMEBUFFER_OPERATION_EXT error if the object
bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer
complete" (section 4.4.4.2)."
In section 3.6.4, modify the final paragraph of the definition of
DrawPixels as follows:
"Calling DrawPixels will result in an
INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to
DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"
(section 4.4.4.2)."
Add the following to section 3.7, following the description of
Bitmap:
"Calling Bitmap will result in an
INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to
DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"
(section 4.4.4.2)."
Append the following to section 3.8.2:
"Calling CopyTexSubImage3D, CopyTexImage2D,
CopyTexSubImage2D, CopyTexImage1D or CopyTexSubImage1D will result
in an INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound
to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"
(section 4.4.4.2)."
Additions to Chapter 4 of the OpenGL 1.5 Specification (Per-Fragment
Operations and the Frame Buffer)
Change the first word of Chapter 4 from "The" to "A".
Append to the introduction of Chapter 4:
"Conceptually, 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."
Modify the last paragraph of section 4.1.1 as follows:
"While an application-created framebuffer object is bound to
DRAW_FRAMEBUFFER_EXT, the pixel ownership test always passes."
Modify the last sentence of the second to last paragraph of
section 4.2.4 as follows:
"If there is no accumulation buffer, or if the DRAW_FRAMEBUFFER_EXT
and READ_FRAMEBUFFER_EXT bindings (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."
Add to 4.3.2 (Reading Pixels), right before the subsection titled
"Obtaining Pixels from the Framebuffer":
"Calling ReadPixels generates INVALID_FRAMEBUFFER_OPERATION_EXT if
the object bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer
complete" (section 4.4.4.2)."
In section 4.3.2, modify the definition of ReadBuffer 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 window-system-provided
framebuffer (i.e., READ_FRAMEBUFFER_BINDING_EXT is zero), or an
application-created framebuffer object (i.e.,
READ_FRAMEBUFFER_BINDING_EXT is non-zero). For more information
about application-created framebuffer objects, see section 4.4.
When READ_FRAMEBUFFER_BINDING_EXT is zero, i.e. the default
window-system-provided framebuffer, <src> must be one of the
values listed in table 4.4. 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
window-system-provided framebuffer, the initial setting for
ReadBuffer is FRONT if there is no back buffer and BACK
otherwise.
Modify the first sentence of section 4.3.3 as follows:
"CopyPixels transfers a rectangle of pixel values from one region
of the read framebuffer to another in the draw framebuffer."
Add the following text to section 4.3.3, page 194, 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*.
INVALID_FRAMEBUFFER_OPERATION_EXT will be generated if an attempt is
made to execute one of these operations, or CopyPixels, while the
object bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer
complete" (as defined in section 4.4.4.2). Furthermore, an attempt
to execute CopyPixels will generate
INVALID_FRAMEBUFFER_OPERATION_EXT while the object bound to
DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"."
Append to section 4.3.3:
"BlitFramebufferEXT 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.
BlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1,
int dstX0, int dstY0, int dstX1, int dstY1,
bitfield mask, enum filter);
<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, bound by the locations (srcX0,
srcY0) and (srcX1, srcY1), to the destination rectangle, bound by
the locations (dstX0, dstY0) and (dstX1, dstY1). The lower bounds
of the rectangle are inclusive, while the upper bounds are
exclusive.
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
dimension, 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 the source and destination buffers are identical, and the
source and destination rectangles overlap, the result of the blit
operation is undefined.
The pixel copy bypasses the fragment pipeline. The only fragment
operations which affect the 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, the pixel groups are
converted to match the destination format as in CopyPixels, except
that no pixel transfer operations apply and clamping behaves as if
CLAMP_FRAGMENT_COLOR_ARB is set to FIXED_ONLY_ARB.
Calling CopyPixels or BlitFramebufferEXT will result in an
INVALID_FRAMEBUFFER_OPERATION_EXT error if the objects bound to
DRAW_FRAMEBUFFER_BINDING_EXT and READ_FRAMEBUFFER_BINDING_EXT are
not "framebuffer complete" (section 4.4.4.2)."
Calling BlitFramebufferEXT 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.
Modify the beginning of section 4.4.1 as follows:
"The default framebuffer for rendering and readback operations is
provided by the windowing 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 an unused name to
DRAW_FRAMEBUFFER_EXT or READ_FRAMEBUFFER_EXT. The binding is
effected by calling
void BindFramebufferEXT(enum target, uint framebuffer);
with <target> set to the desired framebuffer target and
<framebuffer> set to the unused 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_EXT color attachment points, plus one each
for the depth and stencil attachment points.
BindFramebufferEXT may also be used to bind an existing
framebuffer object to DRAW_FRAMEBUFFER_EXT or
READ_FRAMEBUFFER_EXT. 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.
If a framebuffer object is bound to DRAW_FRAMEBUFFER_EXT or
READ_FRAMEBUFFER_EXT, 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
BindFramebufferEXT with <target> set to FRAMEBUFFER_EXT binds the
framebuffer to both DRAW_FRAMEBUFFER_EXT and READ_FRAMEBUFFER_EXT.
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_EXT.
The initial state of DRAW_FRAMEBUFFER_EXT and READ_FRAMEBUFFER_EXT
refers to the default framebuffer provided by the windowing
system. In order that access to the default framebuffer is not
lost, it is treated as a framebuffer object with the name of 0.
The default framebuffer is therefore rendered to and read from
while 0 is bound to the corresponding targets. On some
implementations, the properties of the default framebuffer can
change over time (e.g., in response to windowing system events
such as attaching the context to a new windowing system drawable.)"
Change the description of DeleteFramebuffersEXT as follows:
"<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_EXT or READ_FRAMEBUFFER_EXT is deleted, it is as
though BindFramebufferEXT had been executed with the corresponding
<target> and <framebuffer> zero. Unused names in <framebuffers>
are silently ignored, as is the value zero."
In section 4.4.2.2, modify the first two sentences of the
description of FramebufferRenderbufferEXT as follows:
"<target> must be DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT, or
FRAMEBUFFER_EXT. If <target> is FRAMEBUFFER_EXT, it behaves as
though DRAW_FRAMEBUFFER_EXT was specified. INVALID_OPERATION is
generated if the value of the corresponding binding is zero."
In section 4.4.2.3, modify the first two sentences of the
description of FramebufferTexturexDEXT as follows:
"In all three routines, <target> must be DRAW_FRAMEBUFFER_EXT,
READ_FRAMEBUFFER_EXT, or FRAMEBUFFER_EXT. If <target> is
FRAMEBUFFER_EXT, it behaves as though DRAW_FRAMEBUFFER_EXT was
specified. INVALID_OPERATION is generated if the value of the
corresponding binding is zero."
In section 4.4.4.2, modify the first sentence of the description
of CheckFramebufferStatusEXT as follows:
"If <target> is not DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or
FRAMEBUFFER_EXT, INVALID_ENUM is generated. If <target> is
FRAMEBUFFER_EXT, it behaves as though DRAW_FRAMEBUFFER_EXT was
specified."
Modify section 4.4.4.3 as follows:
"Attempting to render to or read from a framebuffer which is not
framebuffer complete will generate an
INVALID_FRAMEBUFFER_OPERATION_EXT error."
Additions to Chapter 6 of the OpenGL 1.5 Specification (State and State
Requests)
In section 6.1.3, modify the first sentence of the description of
GetFramebufferAttachmentParameterivEXT as follows:
"<target> must be DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or
FRAMEBUFFER_EXT. If <target> is FRAMEBUFFER_EXT, it behaves as
though DRAW_FRAMEBUFFER_EXT was specified."
GLX Protocol
BlitFramebufferEXT
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
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.
Errors
The error INVALID_FRAMEBUFFER_OPERATION_EXT is generated if
BlitFramebufferEXT, DrawPixels, or CopyPixels is called while the
draw framebuffer is not framebuffer complete.
The error INVALID_FRAMEBUFFER_OPERATION_EXT is generated if
BlitFramebufferEXT, ReadPixels, CopyPixels, CopyTex{Sub}Image*,
CopyColor{Sub}Table, or CopyConvolutionFilter* is called while the
read framebuffer is not framebuffer complete.
The error INVALID_VALUE is generated by BlitFramebufferEXT 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 BlitFramebufferEXT is
called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
and <filter> is not NEAREST.
The error INVALID_OPERATION is generated if BlitFramebufferEXT 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 BlitFramebufferEXT if
<filter> is not LINEAR or NEAREST.
The error INVALID_OPERATION is generated if BlitFramebufferEXT
is called within a Begin/End pair.
The error INVALID_ENUM is generated if BindFramebufferEXT,
CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT,
FramebufferRenderbufferEXT, or
GetFramebufferAttachmentParameterivEXT is called and <target> is
not DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or FRAMEBUFFER_EXT.
New State
(modify table 3.nnn, "Framebuffer (state per framebuffer target binding point)")
Get Value Type Get Command Initial Value Description Section Attribute
---------------------------- ---- ----------- -------------- ------------------- ------------ ---------
DRAW_FRAMEBUFFER_BINDING_EXT Z+ GetIntegerv 0 framebuffer object bound 4.4.1 -
to DRAW_FRAMEBUFFER_EXT
READ_FRAMEBUFFER_BINDING_EXT Z+ GetIntegerv 0 framebuffer object 4.4.1 -
to READ_FRAMEBUFFER_EXT
Remove reference to FRAMEBUFFER_BINDING_EXT.
Sample Code
/* Render to framebuffer object 2 */
BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 2);
RenderScene();
/* Blit contents of color buffer, depth buffer and stencil buffer
* from framebuffer object 2 to framebuffer object 1.
*/
BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 2);
BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 1);
BlitFramebufferEXT(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.
*/
BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 1);
BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 2);
BlitFramebufferEXT(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.
*/
BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 1);
BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 3);
BlitFramebufferEXT(0, 0, 640, 480,
0, 0, 1280, 960,
GL_COLOR_BUFFER_BIT, GL_LINEAR);
Issues
1) Should we pass in explicit source/dest rects instead of using
the rasterpos/pixelzoom?
Resolved: use explicit rects, so we don't need to perform
multiple state changes.
2) Should rects be (start,size) or (start,end)?
Resolved: use (start,end). This is a break from the past
(scissor, viewport) but is more intuitive than allowing a
negative size where mirrored zooms are desireable.
3) What should we call the blit function?
Resolved: BlitFramebufferEXT
4) Should filtering apply to depth or stencil values?
Resolved: No
5) What happens if LINEAR is specified and DEPTH or STENCIL is in
the mask?
Resolved: Generate ERROR_INVALID_OPERATION
6) What happens if READ_FRAMEBUFFER is NONE and a read is
attempted?
Resolved: Generate ERROR_INVALID_OPERATION
7) Should we generalize binding point assignment with a single
entry point and a parameter specifying read/write/whatever?
Resolved: concensus leans toward separate Read/Draw entry
points.
8) Should we define READ_FRAMEBUFFER and DRAW_FRAMEBUFFER targets
for BindFramebuffer instead of introducing a new level of
indirection?
Resolved: Yes. Binding to the legacy target FRAMEBUFFER sets
both DRAW_FRAMEBUFFER and READ_FRAMEBUFFER. Querying
FRAMEBUFFER_BINDING return the DRAW_FRAMEBUFFER_BINDING.
9) What happens when a user queries framebuffer attributes,
e.g. Get(RED_BITS)? Is the result returned from
READ_FRAMEBUFFER or DRAW_FRAMEBUFFER? Do we need a new query?
e.g.
GetFramebufferParameteriv(int target, enum pname, int* value)
Resolved: always return the value associated with the
DRAW_FRAMEBUFFER. Do not add a new query.
10) How does Accum behave in the presence of separate READ/DRAW
framebuffers?
Resolved: Accum returns INVALID_OPERATION if the
READ_FRAMEBUFFER and DRAW_FRAMEBUFFER bindings are not
identical.
11) Should blits be allowed between buffers of different bit sizes?
Resolved: Yes, for color buffers only. Attempting to blit
between depth or stencil buffers of different size generates
INVALID_OPERATION.
12) Should we add support for multiple ReadBuffers, so that
multiple color buffers may be copied with a single call to
BlitFramebuffer?
Resolved: No, we considered this but the behavior is awkward
to define and the functionality is of limited use.
13) How should BlitFramebuffer color space conversion be
specified? Do we allow context clamp state to affect the
blit?
Resolved: Blitting to a fixed point buffer always clamps,
blitting to a floating point buffer never clamps. The context
state is ignored.
14) Should overlapped blits be allowed? Should they be guaranteed
to work?
Resolved: Overlapping blits are allowed but are undefined.
Revision History
Revision 15, 2007/4/6
- Removed language left over from ReadBuffers.
- Removed reference to nonexistent 'CopyTexImage3D'.
Revision 14, 2006/09/29
- Changed the resolution of issue 12 to reflect the working
group decision to abandon ReadBuffers.
- Eliminated issues 15, 16 and 17 as they are no longer relevent.
- Changed the resolution of issue 14 and the corresponding spec
language to indicate that the result of an overlapping blit is
undefined.
- Changed the spec language to clarify that the lower bound of a
blit rectangle is inclusive while the upper bound is
exclusive.
- Added a sample showing an inverted blit, to clarify the pixel
addressing rules.
- Clarified spec language and error behavior to indicate that
blitting DEPTH and STENCIL buffers with LINEAR filtering is
always disallowed, whether or not the blit is scaling.
Revision 13, 2006/06/01 (Jeff Juliano)
- Clarify errors generated when read and draw framebuffers are
incomplete.
Revision 12, 2005/12/22 (Jon Leech)
- Assigned enumerant values. Add return type to BlitFramebufferEXT.
Note INVALID_ENUM error if filter is not LINEAR or NEAREST.
Revision 11, 2005/12/14
- Added several missing conditions to the Errors section.
- Changed status to "Complete".
Revision 10, 2005/11/6
- Removed all ReadBuffers discussion, as this functionality will
be deferred. Issues 15-17 are hereafter irrelevent.
Revision 9, 2005/10/31
- Resolved issue 16 and updated language to reflect this decision.
- Minor language changes per feedback.
- Added issue 17 and resolution, although language does not reflect this.
Revision 8, 2005/10/20
- Added ReadBuffersEXT language
- Removed some redundant language in ReadBuffer
- Re-opened issue 15 for further consideration
- Added issue 16
Revision 7, 2005/10/7
- Added issues 13 and 14, and resolution for 11, 13, and 14.
- Added dependency on ARB_color_buffer_float.
- Removed multisample language, now covered in EXT_framebuffer_multisample.
- Added framebuffer incomplete error language to spec proper.
- Alias DRAW_FRAMEBUFFER_BINDING_EXT to FRAMEBUFFER_BINDING_EXT.
- Updated Overview text to reflect the resolution to issue 8.
Revision 6, 2005/9/26
- Moved issues to the end, per new conventions.
- Added new language referring to DRAW_FRAMEBUFFER and
READ_FRAMEBUFFER bind points to sections 4.1.1, 4.4.1,
4.4.2.2, 4.4.2.3, 4.4.4.2, 6.1.3 and Errors, and updated the
example code, per resolution of issue 8.
- Added language in section 4.4.1 specifying Get behavior, per
resolution of issue 9.
- Added language to section 4.2.4 describing new error behavior
for Accum, per resolution of issue 10.
- Added language to section 4.3.3 describing color format
conversion, per resolution of issue 11.
Revision 5, 2005/9/6
- Added issues 8 - 11
- Minor edits from reviewer feedback
Revision 4, 2005/9/5
- Added chapter 4 intro section
- Added errors and state table information
- Added sample code
- fixed typos
Revision 3, 2005/8/29
- Converted to spec template
Revision 2, 2005/7/18
- Lots of new issues added and resolved
Revision 1, 2005/7/5
- Initial draft