summaryrefslogtreecommitdiff
path: root/extensions/ANGLE_framebuffer_blit.txt
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/ANGLE_framebuffer_blit.txt')
-rw-r--r--extensions/ANGLE_framebuffer_blit.txt437
1 files changed, 437 insertions, 0 deletions
diff --git a/extensions/ANGLE_framebuffer_blit.txt b/extensions/ANGLE_framebuffer_blit.txt
new file mode 100644
index 00000000..53056c44
--- /dev/null
+++ b/extensions/ANGLE_framebuffer_blit.txt
@@ -0,0 +1,437 @@
+Name
+
+ ANGLE_framebuffer_blit
+
+Name Strings
+
+ GL_ANGLE_framebuffer_blit
+
+Contributors
+
+ Contributors to EXT_framebuffer_blit
+ Daniel Koch, TransGaming Inc.
+ Shannon Woods, TransGaming Inc.
+ Kenneth Russell, Google Inc.
+ Vangelis Kokkevis, Google Inc.
+
+Contact
+
+ Daniel Koch, TransGaming Inc. (daniel 'at' transgaming 'dot' com)
+
+Status
+
+ Implemented in ANGLE ES2
+
+Version
+
+ Last Modified Date: Sept 22, 2012
+ Author Revision: 4
+
+Number
+
+ OpenGL ES Extension #83
+
+Dependencies
+
+ OpenGL ES 2.0 is required.
+
+ The extension is written against the OpenGL ES 2.0 specification.
+
+ OES_texture_3D affects the definition of this extension.
+
+Overview
+
+ This extension modifies framebuffer objects 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 BlitFramebufferANGLE(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 BindFramebuffer,
+ CheckFramebufferStatus, FramebufferTexture2D, FramebufferTexture3DOES,
+ FramebufferRenderbuffer, and
+ GetFramebufferAttachmentParameteriv:
+
+ // (reusing the tokens from EXT_framebuffer_blit)
+ READ_FRAMEBUFFER_ANGLE 0x8CA8
+ DRAW_FRAMEBUFFER_ANGLE 0x8CA9
+
+ Accepted by the <pname> parameters of GetIntegerv and GetFloatv:
+
+ // (reusing the tokens from EXT_framebuffer_blit)
+ DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 // alias FRAMEBUFFER_BINDING
+ READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA
+
+
+Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)
+
+ Change the last paragraph of section 3.7.2 (Alternate Texture Image
+ Specification Commands) to:
+
+ "Calling CopyTexSubImage3DOES, CopyTexImage2D or CopyTexSubImage2D will
+ result in an INVALID_FRAMEBUFFER_OPERATION error if the object bound
+ to READ_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer complete"
+ (section 4.4.4.2)."
+
+Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
+Operations and the Framebuffer)
+
+ 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 first sentence of the last paragraph of section 4.1.1 as follows:
+
+ "While an application-created framebuffer object is bound to
+ DRAW_FRAMEBUFFER_ANGLE, the pixel ownership test always passes."
+
+ Add to 4.3.1 (Reading Pixels), right before the subsection titled
+ "Obtaining Pixels from the Framebuffer":
+
+ "Calling ReadPixels generates INVALID_FRAMEBUFFER_OPERATION if
+ the object bound to READ_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer
+ complete" (section 4.4.4.2). GetIntegerv generates an INVALID_OPERATION
+ error if the object bound to READ_FRAMEBUFFER_BINDING_ANGLE is not
+ framebuffer complete, or if the GL is using a framebuffer object
+ (i.e. READ_FRAMEBUFFER_BINDING_ANGLE is non-zero) and there is no color
+ attachment."
+
+ Insert a new section 4.3.2 titled "Copying Pixels" and renumber the
+ subsequent sections. Add the following text:
+
+ "BlitFramebufferANGLE transfers a rectangle of pixel values from one
+ region of the read framebuffer to another in the draw framebuffer.
+
+ BlitFramebufferANGLE(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.
+
+ The actual region taken from the read framebuffer is limited to the
+ intersection of the source buffers being transferred, which may include
+ the color buffer, the depth buffer, and/or the stencil buffer depending on
+ <mask>. The actual region written to the draw framebuffer is limited to the
+ intersection of the destination buffers being written, which may include
+ the color buffer, the depth buffer, and/or the stencil buffer
+ depending on <mask>. Whether or not the source or destination regions are
+ altered due to these limits, the offset applied to pixels being transferred
+ is performed as though no such limits were present.
+
+ Stretching and scaling during a copy are not supported. If the source
+ and destination rectangle dimensions do not match, no copy is
+ performed and an INVALID_OPERATION error is generated.
+ Because stretching is not supported, <filter> must be NEAREST and
+ no filtering is applied.
+
+ Flipping during a copy is not supported. If either the source or
+ destination rectangle specifies a negative dimension, the error
+ INVALID_OPERATION is generated. If both the source and
+ destination rectangles specify a negative dimension for the same
+ direction, no reversal is required and the operation is supported.
+
+ 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.
+
+ Calling BlitFramebufferANGLE will result in an
+ INVALID_FRAMEBUFFER_OPERATION error if the objects bound to
+ DRAW_FRAMEBUFFER_BINDING_ANGLE and READ_FRAMEBUFFER_BINDING_ANGLE are
+ not "framebuffer complete" (section 4.4.4.2)."
+
+ Calling BlitFramebufferANGLE will result in an INVALID_OPERATION
+ error if <mask> includes COLOR_BUFFER_BIT and the source and
+ destination color formats to not match.
+
+ Calling BlitFramebufferANGLE will result in an INVALID_OPERATION
+ error if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
+ and the source and destination depth and stencil buffer formats do
+ not match.
+
+ If <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, only
+ complete buffers can be copied. If the source rectangle does not
+ specify the complete source buffer or the destination rectangle
+ (after factoring the scissor region, if applicable) does not specify
+ the complete destination buffer, an INVALID_OPERATION
+ error is generated.
+
+ 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_ANGLE or READ_FRAMEBUFFER_ANGLE. The binding is
+ effected by calling
+
+ void BindFramebuffer(enum target, uint framebuffer);
+
+ with <target> set to the desired framebuffer target and
+ <framebuffer> set to the unused name. The resulting framebuffer
+ object is a new state vector, comprising one set of the state values
+ listed in table 6.23 for each attachment point of the
+ framebuffer, set to the same initial values. There is one
+ color attachment point, plus one each
+ for the depth and stencil attachment points.
+
+ BindFramebuffer may also be used to bind an existing
+ framebuffer object to DRAW_FRAMEBUFFER_ANGLE or
+ READ_FRAMEBUFFER_ANGLE. 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_ANGLE or
+ READ_FRAMEBUFFER_ANGLE, it becomes the target for rendering or
+ readback operations, respectively, until it is deleted or another
+ framebuffer is bound to the corresponding bind point. Calling
+ BindFramebuffer with <target> set to FRAMEBUFFER binds the
+ framebuffer to both DRAW_FRAMEBUFFER_ANGLE and READ_FRAMEBUFFER_ANGLE.
+
+ 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.20 (Implementation Dependent Pixel Depths)
+ and table 6.yy (Framebuffer Dependent Values) are
+ derived from the framebuffer object bound to DRAW_FRAMEBUFFER_ANGLE.
+
+ The initial state of DRAW_FRAMEBUFFER_ANGLE and READ_FRAMEBUFFER_ANGLE
+ 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 DeleteFramebuffers 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_ANGLE or READ_FRAMEBUFFER_ANGLE is deleted, it is as
+ though BindFramebuffer had been executed with the corresponding
+ <target> and <framebuffer> zero. Unused names in <framebuffers>
+ are silently ignored, as is the value zero."
+
+
+ In section 4.4.3 (Renderbuffer Objects), modify the first two sentences
+ of the description of FramebufferRenderbuffer as follows:
+
+ "<target> must be DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE, or
+ FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as
+ though DRAW_FRAMEBUFFER_ANGLE was specified. The INVALID_OPERATION
+ error is generated if the value of the corresponding binding is zero."
+
+ In section 4.4.3 (Renderbuffer Objects), modify the first two sentences
+ of the description of FramebufferTexture2D as follows:
+
+ "<target> must be DRAW_FRAMEBUFFER_ANGLE,
+ READ_FRAMEBUFFER_ANGLE, or FRAMEBUFFER. If <target> is
+ FRAMEBUFFER, it behaves as though DRAW_FRAMEBUFFER_ANGLE was
+ specified. The INVALID_OPERATION error is generated if the value of the
+ corresponding binding is zero."
+
+ In section 4.4.5 (Framebuffer Completeness), modify the first sentence
+ of the description of CheckFramebufferStatus as follows:
+
+ "If <target> is not DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or
+ FRAMEBUFFER, the error INVALID_ENUM is generated. If <target> is
+ FRAMEBUFFER, it behaves as though DRAW_FRAMEBUFFER_ANGLE was
+ specified."
+
+ Modify the first sentence of the subsection titled "Effects of Framebuffer
+ Completeness on Framebuffer Operations" to be:
+
+ "Attempting to render to or read from a framebuffer which is not
+ framebuffer complete will generate an
+ INVALID_FRAMEBUFFER_OPERATION 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
+ GetFramebufferAttachmentParameteriv as follows:
+
+ "<target> must be DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or
+ FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as
+ though DRAW_FRAMEBUFFER_ANGLE was specified."
+
+ Modify the title of Table 6.23 (Framebuffer State) to be "Framebuffer
+ (state per attachment point)".
+
+
+Dependencies on OES_texture_3D
+
+ On an OpenGL ES implementation, in the absense of OES_texture_3D,
+ omit references to FramebufferTexture3DOES and CopyTexSubImage3DOES.
+
+Errors
+
+ The error INVALID_FRAMEBUFFER_OPERATION is generated if
+ BlitFramebufferANGLE is called while the
+ draw framebuffer is not framebuffer complete.
+
+ The error INVALID_FRAMEBUFFER_OPERATION is generated if
+ BlitFramebufferANGLE, ReadPixels, CopyTex{Sub}Image*, is called while the
+ read framebuffer is not framebuffer complete.
+
+ The error INVALID_OPERATION is generated if GetIntegerv is called
+ while the read framebuffer is not framebuffer complete, or if there
+ is no color attachment present on the read framebuffer object.
+
+ The error INVALID_VALUE is generated by BlitFramebufferANGLE 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 BlitFramebufferANGLE 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_OPERATION is generated if BlitFramebufferANGLE is
+ called and any of the following conditions are true:
+ - the source and destination rectangle dimensions do not match
+ (ie scaling or flipping is required).
+ - <mask> includes COLOR_BUFFER_BIT and the source and destination
+ buffer formats do not match.
+ - <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT and the
+ source or destination rectangles do not specify the entire source
+ or destination buffer (after applying any scissor region).
+
+ The error INVALID_ENUM is generated by BlitFramebufferANGLE if
+ <filter> is not NEAREST.
+
+ The error INVALID_ENUM is generated if BindFramebuffer,
+ CheckFramebufferStatus, FramebufferTexture{2D|3DOES},
+ FramebufferRenderbuffer, or
+ GetFramebufferAttachmentParameteriv is called and <target> is
+ not DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or FRAMEBUFFER.
+
+New State
+
+ (Add a new table 6.xx, "Framebuffer (state per framebuffer target binding point)")
+
+ Get Value Type Get Command Initial Value Description Section
+ ------------------------------ ---- ----------- -------------- ------------------- ------------
+ DRAW_FRAMEBUFFER_BINDING_ANGLE Z+ GetIntegerv 0 framebuffer object bound 4.4.1
+ to DRAW_FRAMEBUFFER_ANGLE
+ READ_FRAMEBUFFER_BINDING_ANGLE Z+ GetIntegerv 0 framebuffer object 4.4.1
+ to READ_FRAMEBUFFER_ANGLE
+
+ Remove reference to FRAMEBUFFER_BINDING from Table 6.23.
+
+ (Add a new table 6.yy, "Framebuffer Dependent Values")
+
+ Get Value Type Get Command Initial Value Description Section
+ ---------------------------- ---- ----------- -------------- ------------------- ------------
+ SAMPLE_BUFFERS Z+ GetIntegerv 0 Number of multisample 3.2
+ buffers
+ SAMPLES Z+ GetIntegerv 0 Coverage mask size 3.2
+
+ Remove the references to SAMPLE_BUFFERS and SAMPLES from Table 6.17.
+
+
+Issues
+
+ 1) What should we call this extension?
+
+ Resolved: ANGLE_framebuffer_blit.
+
+ This extension is a result of a collaboration between Google and
+ TransGaming for the open-source ANGLE project. Typically one would
+ label a multi-vendor extension as EXT, but EXT_framebuffer_blit
+ is already the name for this on Desktop GL. Additionally this
+ isn't truely a multi-vendor extension because there is only one
+ implementation of this. We'll follow the example of the open-source
+ MESA project which uses the project name for the vendor suffix.
+
+ 2) Why is this done as a separate extension instead of just supporting
+ EXT_framebuffer_blit?
+
+ To date, EXT_framebuffer_blit has not had interactions with OpenGL ES
+ specified and, as far as we know, it has not previously been exposed on
+ an ES 1.1 or ES 2.0 implementation. Because there are enough
+ differences between Desktop GL and OpenGL ES, and since OpenGL ES 2.0
+ has already subsumed the EXT_framebuffer_object functionality (with
+ some changes) it was deemed a worthwhile exercise to fully specify the
+ interactions. Additionally, some of the choices in exactly which
+ functionality is supported by BlitFramebufferANGLE is dictated by
+ what is reasonable to support on a implementation which is
+ layered on Direct3D9. It is not expected that other implementations
+ will necessary have the same set of restrictions or requirements.
+
+ 3) How does this extension differ from EXT_framebuffer_blit?
+
+ This extension is designed to be a pure subset of the
+ EXT_framebuffer_blit functionality as applicable to OpenGL ES 2.0.
+
+ Functionality that is unchanged:
+ - the split DRAW and READ framebuffer attachment points and related sematics.
+ - the token values for the DRAW/READ_FRAMEBUFFER and DRAW/READ_FRAMBUFFER_BINDING
+ - the signature of the BlitFramebuffer entry-point.
+
+ Additional restrictions imposed by BlitFramebufferANGLE:
+ - no color conversions are supported
+ - no scaling, stretching or flipping are supported
+ - no filtering is supported (a consequence of no stretching)
+ - only whole depth and/or stencil buffers can be copied
+
+Revision History
+
+ Revision 1, 2010/07/06
+ - copied from revision 15 of EXT_framebuffer_object
+ - removed language that was clearly not relevant to ES2
+ - rebased changes against the OpenGL ES 2.0 specification
+ - added ANGLE-specific restrictions
+ Revision 2, 2010/07/15
+ - clarifications of implicit clamping to buffer sizes (from ARB_fbo)
+ - clarify that D/S restricts apply after the scissor is applied
+ - improve some error language
+ Revision 3, 2010/08/06
+ - add additional contributors, update implementation status
+ Revision 4, 2012/09/22
+ - document errors for GetIntegerv.
+