Home | History | Annotate | Download | only in extensions
      1 Name
      2 
      3     ANGLE_framebuffer_blit
      4 
      5 Name Strings
      6 
      7     GL_ANGLE_framebuffer_blit
      8 
      9 Contributors
     10 
     11     Contributors to EXT_framebuffer_blit
     12     Daniel Koch, TransGaming Inc.
     13     Shannon Woods, TransGaming Inc.
     14     Kenneth Russell, Google Inc.
     15     Vangelis Kokkevis, Google Inc.
     16 
     17 Contact
     18 
     19     Daniel Koch, TransGaming Inc. (daniel 'at' transgaming 'dot' com)
     20 
     21 Status
     22 
     23     Implemented in ANGLE ES2
     24 
     25 Version
     26 
     27     Last Modified Date: Sept 22, 2012
     28     Author Revision: 4
     29 
     30 Number
     31 
     32     OpenGL ES Extension #83
     33 
     34 Dependencies
     35 
     36     OpenGL ES 2.0 is required.
     37 
     38     The extension is written against the OpenGL ES 2.0 specification.
     39 
     40     OES_texture_3D affects the definition of this extension.
     41 
     42 Overview
     43 
     44     This extension modifies framebuffer objects by splitting the
     45     framebuffer object binding point into separate DRAW and READ
     46     bindings.  This allows copying directly from one framebuffer to
     47     another.  In addition, a new high performance blit function is
     48     added to facilitate these blits and perform some data conversion
     49     where allowed.
     50 
     51 IP Status
     52 
     53     No known IP claims.
     54 
     55 New Procedures and Functions
     56 
     57     void BlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1,
     58                               int dstX0, int dstY0, int dstX1, int dstY1,
     59                               bitfield mask, enum filter);
     60 
     61 New Tokens
     62 
     63     Accepted by the <target> parameter of BindFramebuffer,
     64     CheckFramebufferStatus, FramebufferTexture2D, FramebufferTexture3DOES,
     65     FramebufferRenderbuffer, and
     66     GetFramebufferAttachmentParameteriv:
     67 
     68     // (reusing the tokens from EXT_framebuffer_blit)
     69     READ_FRAMEBUFFER_ANGLE                0x8CA8
     70     DRAW_FRAMEBUFFER_ANGLE                0x8CA9
     71 
     72     Accepted by the <pname> parameters of GetIntegerv and GetFloatv:
     73 
     74     // (reusing the tokens from EXT_framebuffer_blit)
     75     DRAW_FRAMEBUFFER_BINDING_ANGLE        0x8CA6 // alias FRAMEBUFFER_BINDING
     76     READ_FRAMEBUFFER_BINDING_ANGLE        0x8CAA
     77 
     78 
     79 Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)
     80 
     81     Change the last paragraph of section 3.7.2 (Alternate Texture Image
     82     Specification Commands) to:
     83 
     84     "Calling CopyTexSubImage3DOES, CopyTexImage2D or CopyTexSubImage2D will
     85     result in an INVALID_FRAMEBUFFER_OPERATION error if the object bound
     86     to READ_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer complete"
     87     (section 4.4.4.2)."
     88 
     89 Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
     90 Operations and the Framebuffer)
     91 
     92     Change the first word of Chapter 4 from "The" to "A".
     93 
     94     Append to the introduction of Chapter 4:
     95 
     96     "Conceptually, the GL has two active framebuffers; the draw
     97     framebuffer is the destination for rendering operations, and the
     98     read framebuffer is the source for readback operations.  The same
     99     framebuffer may be used for both drawing and reading.  Section
    100     4.4.1 describes the mechanism for controlling framebuffer usage."
    101 
    102     Modify the first sentence of the last paragraph of section 4.1.1 as follows:
    103 
    104     "While an application-created framebuffer object is bound to
    105     DRAW_FRAMEBUFFER_ANGLE, the pixel ownership test always passes."
    106 
    107     Add to 4.3.1 (Reading Pixels), right before the subsection titled
    108     "Obtaining Pixels from the Framebuffer":
    109 
    110     "Calling ReadPixels generates INVALID_FRAMEBUFFER_OPERATION if
    111     the object bound to READ_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer
    112     complete" (section 4.4.4.2). GetIntegerv generates an INVALID_OPERATION
    113     error if the object bound to READ_FRAMEBUFFER_BINDING_ANGLE is not
    114     framebuffer complete, or if the GL is using a framebuffer object 
    115     (i.e. READ_FRAMEBUFFER_BINDING_ANGLE is non-zero) and there is no color
    116     attachment."
    117 
    118     Insert a new section 4.3.2 titled "Copying Pixels" and renumber the
    119     subsequent sections.  Add the following text:
    120 
    121     "BlitFramebufferANGLE transfers a rectangle of pixel values from one
    122     region of the read framebuffer to another in the draw framebuffer.
    123 
    124     BlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1,
    125                          int dstX0, int dstY0, int dstX1, int dstY1,
    126                          bitfield mask, enum filter);
    127 
    128     <mask> is the bitwise OR of a number of values indicating which
    129     buffers are to be copied. The values are COLOR_BUFFER_BIT,
    130     DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT, which are described in
    131     section 4.2.3.  The pixels corresponding to these buffers are
    132     copied from the source rectangle, bound by the locations (srcX0,
    133     srcY0) and (srcX1, srcY1), to the destination rectangle, bound by
    134     the locations (dstX0, dstY0) and (dstX1, dstY1).  The lower bounds
    135     of the rectangle are inclusive, while the upper bounds are
    136     exclusive.
    137 
    138     The actual region taken from the read framebuffer is limited to the
    139     intersection of the source buffers being transferred, which may include
    140     the color buffer, the depth buffer, and/or the stencil buffer depending on
    141     <mask>. The actual region written to the draw framebuffer is limited to the
    142     intersection of the destination buffers being written, which may include
    143     the color buffer, the depth buffer, and/or the stencil buffer
    144     depending on <mask>. Whether or not the source or destination regions are
    145     altered due to these limits, the offset applied to pixels being transferred
    146     is performed as though no such limits were present.
    147 
    148     Stretching and scaling during a copy are not supported. If the source
    149     and destination rectangle dimensions do not match, no copy is
    150     performed and an INVALID_OPERATION error is generated.
    151     Because stretching is not supported, <filter> must be NEAREST and
    152     no filtering is applied. 
    153 
    154     Flipping during a copy is not supported. If either the source or 
    155     destination rectangle specifies a negative dimension, the error 
    156     INVALID_OPERATION is generated. If both the source and 
    157     destination rectangles specify a negative dimension for the same 
    158     direction, no reversal is required and the operation is supported.
    159 
    160     If the source and destination buffers are identical, and the
    161     source and destination rectangles overlap, the result of the blit
    162     operation is undefined.
    163 
    164     The pixel copy bypasses the fragment pipeline.  The only fragment
    165     operations which affect the blit are the pixel ownership test and
    166     the scissor test.
    167 
    168     If a buffer is specified in <mask> and does not exist in both the
    169     read and draw framebuffers, the corresponding bit is silently
    170     ignored.
    171 
    172     Calling BlitFramebufferANGLE will result in an
    173     INVALID_FRAMEBUFFER_OPERATION error if the objects bound to
    174     DRAW_FRAMEBUFFER_BINDING_ANGLE and READ_FRAMEBUFFER_BINDING_ANGLE are
    175     not "framebuffer complete" (section 4.4.4.2)."
    176 
    177     Calling BlitFramebufferANGLE will result in an INVALID_OPERATION
    178     error if <mask> includes COLOR_BUFFER_BIT and the source and 
    179     destination color formats to not match.
    180 
    181     Calling BlitFramebufferANGLE will result in an INVALID_OPERATION
    182     error if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
    183     and the source and destination depth and stencil buffer formats do
    184     not match.
    185 
    186     If <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, only 
    187     complete buffers can be copied.  If the source rectangle does not 
    188     specify the complete source buffer or the destination rectangle 
    189     (after factoring the scissor region, if applicable) does not specify 
    190     the complete destination buffer, an INVALID_OPERATION
    191     error is generated.
    192 
    193     Modify the beginning of section 4.4.1 as follows:
    194 
    195     "The default framebuffer for rendering and readback operations is
    196     provided by the windowing system.  In addition, named framebuffer
    197     objects can be created and operated upon.  The namespace for
    198     framebuffer objects is the unsigned integers, with zero reserved
    199     by the GL for the default framebuffer.
    200 
    201     A framebuffer object is created by binding an unused name to
    202     DRAW_FRAMEBUFFER_ANGLE or READ_FRAMEBUFFER_ANGLE.  The binding is
    203     effected by calling
    204 
    205         void BindFramebuffer(enum target, uint framebuffer);
    206 
    207     with <target> set to the desired framebuffer target and
    208     <framebuffer> set to the unused name.  The resulting framebuffer
    209     object is a new state vector, comprising one set of the state values
    210     listed in table 6.23 for each attachment point of the
    211     framebuffer, set to the same initial values.  There is one
    212     color attachment point, plus one each
    213     for the depth and stencil attachment points.
    214 
    215     BindFramebuffer may also be used to bind an existing
    216     framebuffer object to DRAW_FRAMEBUFFER_ANGLE or
    217     READ_FRAMEBUFFER_ANGLE.  If the bind is successful no change is made
    218     to the state of the bound framebuffer object, and any previous
    219     binding to <target> is broken.
    220 
    221     If a framebuffer object is bound to DRAW_FRAMEBUFFER_ANGLE or
    222     READ_FRAMEBUFFER_ANGLE, it becomes the target for rendering or
    223     readback operations, respectively, until it is deleted or another
    224     framebuffer is bound to the corresponding bind point.  Calling
    225     BindFramebuffer with <target> set to FRAMEBUFFER binds the
    226     framebuffer to both DRAW_FRAMEBUFFER_ANGLE and READ_FRAMEBUFFER_ANGLE.
    227 
    228     While a framebuffer object is bound, GL operations on the target
    229     to which it is bound affect the images attached to the bound
    230     framebuffer object, and queries of the target to which it is bound
    231     return state from the bound object.  Queries of the values
    232     specified in table 6.20 (Implementation Dependent Pixel Depths)
    233     and table 6.yy (Framebuffer Dependent Values) are
    234     derived from the framebuffer object bound to DRAW_FRAMEBUFFER_ANGLE.
    235 
    236     The initial state of DRAW_FRAMEBUFFER_ANGLE and READ_FRAMEBUFFER_ANGLE
    237     refers to the default framebuffer provided by the windowing
    238     system.  In order that access to the default framebuffer is not
    239     lost, it is treated as a framebuffer object with the name of 0.
    240     The default framebuffer is therefore rendered to and read from
    241     while 0 is bound to the corresponding targets.  On some
    242     implementations, the properties of the default framebuffer can
    243     change over time (e.g., in response to windowing system events
    244     such as attaching the context to a new windowing system drawable.)"
    245 
    246     Change the description of DeleteFramebuffers as follows:
    247 
    248     "<framebuffers> contains <n> names of framebuffer objects to be
    249     deleted.  After a framebuffer object is deleted, it has no
    250     attachments, and its name is again unused.  If a framebuffer that
    251     is currently bound to one or more of the targets
    252     DRAW_FRAMEBUFFER_ANGLE or READ_FRAMEBUFFER_ANGLE is deleted, it is as
    253     though BindFramebuffer had been executed with the corresponding
    254     <target> and <framebuffer> zero.  Unused names in <framebuffers>
    255     are silently ignored, as is the value zero."
    256 
    257 
    258     In section 4.4.3 (Renderbuffer Objects), modify the first two sentences
    259     of the description of FramebufferRenderbuffer as follows:
    260 
    261     "<target> must be DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE, or
    262     FRAMEBUFFER.  If <target> is FRAMEBUFFER, it behaves as
    263     though DRAW_FRAMEBUFFER_ANGLE was specified.  The INVALID_OPERATION 
    264     error is generated if the value of the corresponding binding is zero."
    265 
    266     In section 4.4.3 (Renderbuffer Objects), modify the first two sentences
    267     of the description of FramebufferTexture2D as follows:
    268 
    269     "<target> must be DRAW_FRAMEBUFFER_ANGLE,
    270     READ_FRAMEBUFFER_ANGLE, or FRAMEBUFFER.  If <target> is
    271     FRAMEBUFFER, it behaves as though DRAW_FRAMEBUFFER_ANGLE was
    272     specified.  The INVALID_OPERATION error is generated if the value of the
    273     corresponding binding is zero."
    274 
    275     In section 4.4.5 (Framebuffer Completeness), modify the first sentence 
    276     of the description of CheckFramebufferStatus as follows:
    277 
    278     "If <target> is not DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or
    279     FRAMEBUFFER, the error INVALID_ENUM is generated.  If <target> is
    280     FRAMEBUFFER, it behaves as though DRAW_FRAMEBUFFER_ANGLE was
    281     specified."
    282 
    283     Modify the first sentence of the subsection titled "Effects of Framebuffer
    284     Completeness on Framebuffer Operations" to be:
    285 
    286     "Attempting to render to or read from a framebuffer which is not
    287     framebuffer complete will generate an
    288     INVALID_FRAMEBUFFER_OPERATION error."
    289     
    290 
    291 
    292 Additions to Chapter 6 of the OpenGL 1.5 Specification (State and State
    293 Requests)
    294 
    295     In section 6.1.3, modify the first sentence of the description of
    296     GetFramebufferAttachmentParameteriv as follows:
    297 
    298     "<target> must be DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or
    299     FRAMEBUFFER.  If <target> is FRAMEBUFFER, it behaves as
    300     though DRAW_FRAMEBUFFER_ANGLE was specified."
    301 
    302     Modify the title of Table 6.23 (Framebuffer State) to be "Framebuffer 
    303     (state per attachment point)". 
    304 
    305 
    306 Dependencies on OES_texture_3D
    307 
    308     On an OpenGL ES implementation, in the absense of OES_texture_3D,
    309     omit references to FramebufferTexture3DOES and CopyTexSubImage3DOES.
    310 
    311 Errors
    312 
    313     The error INVALID_FRAMEBUFFER_OPERATION is generated if
    314     BlitFramebufferANGLE is called while the
    315     draw framebuffer is not framebuffer complete.
    316 
    317     The error INVALID_FRAMEBUFFER_OPERATION is generated if
    318     BlitFramebufferANGLE, ReadPixels, CopyTex{Sub}Image*, is called while the
    319     read framebuffer is not framebuffer complete.
    320 
    321     The error INVALID_OPERATION is generated if GetIntegerv is called
    322     while the read framebuffer is not framebuffer complete, or if there
    323     is no color attachment present on the read framebuffer object.
    324 
    325     The error INVALID_VALUE is generated by BlitFramebufferANGLE if
    326     <mask> has any bits set other than those named by
    327     COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT.
    328 
    329     The error INVALID_OPERATION is generated if BlitFramebufferANGLE is
    330     called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
    331     and the source and destination depth or stencil buffer formats do
    332     not match.
    333 
    334     The error INVALID_OPERATION is generated if BlitFramebufferANGLE is 
    335     called and any of the following conditions are true:
    336      - the source and destination rectangle dimensions do not match
    337        (ie scaling or flipping is required).
    338      - <mask> includes COLOR_BUFFER_BIT and the source and destination 
    339        buffer formats do not match.
    340      - <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT and the
    341        source or destination rectangles do not specify the entire source
    342        or destination buffer (after applying any scissor region).
    343 
    344     The error INVALID_ENUM is generated by BlitFramebufferANGLE if
    345     <filter> is not NEAREST.
    346 
    347     The error INVALID_ENUM is generated if BindFramebuffer,
    348     CheckFramebufferStatus, FramebufferTexture{2D|3DOES},
    349     FramebufferRenderbuffer, or
    350     GetFramebufferAttachmentParameteriv is called and <target> is
    351     not DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or FRAMEBUFFER.
    352 
    353 New State
    354 
    355     (Add a new table 6.xx, "Framebuffer (state per framebuffer target binding point)")
    356 
    357     Get Value                     Type   Get Command   Initial Value    Description               Section
    358     ------------------------------  ----   -----------   --------------   -------------------       ------------
    359     DRAW_FRAMEBUFFER_BINDING_ANGLE   Z+    GetIntegerv   0                framebuffer object bound  4.4.1
    360                                                                           to DRAW_FRAMEBUFFER_ANGLE
    361     READ_FRAMEBUFFER_BINDING_ANGLE   Z+    GetIntegerv   0                framebuffer object        4.4.1
    362                                                                           to READ_FRAMEBUFFER_ANGLE
    363 
    364     Remove reference to FRAMEBUFFER_BINDING from Table 6.23.
    365 
    366     (Add a new table 6.yy, "Framebuffer Dependent Values") 
    367 
    368     Get Value                     Type   Get Command   Initial Value    Description               Section
    369     ----------------------------  ----   -----------   --------------   -------------------       ------------
    370     SAMPLE_BUFFERS                 Z+    GetIntegerv   0                Number of multisample     3.2
    371                                                                         buffers
    372     SAMPLES                        Z+    GetIntegerv   0                Coverage mask size        3.2
    373 
    374     Remove the references to SAMPLE_BUFFERS and SAMPLES from Table 6.17.
    375 
    376 
    377 Issues
    378 
    379     1) What should we call this extension?
    380   
    381        Resolved: ANGLE_framebuffer_blit.  
    382 
    383        This extension is a result of a collaboration between Google and 
    384        TransGaming for the open-source ANGLE project. Typically one would
    385        label a multi-vendor extension as EXT, but EXT_framebuffer_blit 
    386        is already the name for this on Desktop GL.  Additionally this
    387        isn't truely a multi-vendor extension because there is only one
    388        implementation of this.  We'll follow the example of the open-source
    389        MESA project which uses the project name for the vendor suffix.
    390 
    391     2) Why is this done as a separate extension instead of just supporting
    392        EXT_framebuffer_blit?
    393 
    394        To date, EXT_framebuffer_blit has not had interactions with OpenGL ES
    395        specified and, as far as we know, it has not previously been exposed on 
    396        an ES 1.1 or ES 2.0 implementation. Because there are enough 
    397        differences between Desktop GL and OpenGL ES, and since OpenGL ES 2.0 
    398        has already subsumed the EXT_framebuffer_object functionality (with 
    399        some changes) it was deemed a worthwhile exercise to fully specify the
    400        interactions.  Additionally, some of the choices in exactly which 
    401        functionality is supported by BlitFramebufferANGLE is dictated by
    402        what is reasonable to support on a implementation which is 
    403        layered on Direct3D9.  It is not expected that other implementations 
    404        will necessary have the same set of restrictions or requirements. 
    405 
    406     3) How does this extension differ from EXT_framebuffer_blit?
    407 
    408        This extension is designed to be a pure subset of the 
    409        EXT_framebuffer_blit functionality as applicable to OpenGL ES 2.0.
    410 
    411        Functionality that is unchanged:
    412         - the split DRAW and READ framebuffer attachment points and related sematics.
    413         - the token values for the DRAW/READ_FRAMEBUFFER and DRAW/READ_FRAMBUFFER_BINDING
    414         - the signature of the BlitFramebuffer entry-point.
    415        
    416        Additional restrictions imposed by BlitFramebufferANGLE:
    417         - no color conversions are supported
    418         - no scaling, stretching or flipping are supported
    419         - no filtering is supported (a consequence of no stretching)
    420         - only whole depth and/or stencil buffers can be copied
    421 
    422 Revision History
    423 
    424     Revision 1, 2010/07/06
    425       - copied from revision 15 of EXT_framebuffer_object
    426       - removed language that was clearly not relevant to ES2
    427       - rebased changes against the OpenGL ES 2.0 specification
    428       - added ANGLE-specific restrictions
    429     Revision 2, 2010/07/15
    430       - clarifications of implicit clamping to buffer sizes (from ARB_fbo)
    431       - clarify that D/S restricts apply after the scissor is applied
    432       - improve some error language
    433     Revision 3, 2010/08/06
    434       - add additional contributors, update implementation status
    435     Revision 4, 2012/09/22
    436       - document errors for GetIntegerv.
    437 
    438