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