Home | History | Annotate | Download | only in extensions
      1 Name
      2 
      3     ANGLE_framebuffer_multisample
      4 
      5 Name Strings
      6 
      7     GL_ANGLE_framebuffer_multisample
      8 
      9 Contributors
     10 
     11     Contributors to EXT_framebuffer_multisample
     12     Daniel Koch, TransGaming Inc.
     13     Shannon Woods, TransGaming Inc.
     14     Kenneth Russell, Google Inc.
     15     Vangelis Kokkevis, Google Inc.
     16 
     17 Contacts
     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: Aug 6, 2010 
     28     Author Revision: #3
     29 
     30 Number
     31 
     32     OpenGL ES Extension #84
     33 
     34 Dependencies
     35 
     36     Requires OpenGL ES 2.0.
     37 
     38     Requires GL_ANGLE_framebuffer_blit (or equivalent functionality).
     39 
     40     The extension is written against the OpenGL ES 2.0 specification. 
     41 
     42     OES_texture_3D affects the definition of this extension.
     43 
     44 Overview
     45 
     46     This extension extends the framebuffer object framework to
     47     enable multisample rendering.
     48 
     49     The new operation RenderbufferStorageMultisampleANGLE() allocates
     50     storage for a renderbuffer object that can be used as a multisample
     51     buffer.  A multisample render buffer image differs from a
     52     single-sample render buffer image in that a multisample image has a
     53     number of SAMPLES that is greater than zero.  No method is provided
     54     for creating multisample texture images.
     55 
     56     All of the framebuffer-attachable images attached to a framebuffer
     57     object must have the same number of SAMPLES or else the framebuffer
     58     object is not "framebuffer complete".  If a framebuffer object with
     59     multisample attachments is "framebuffer complete", then the
     60     framebuffer object behaves as if SAMPLE_BUFFERS is one.
     61 
     62     The resolve operation is affected by calling 
     63     BlitFramebufferANGLE (provided by the ANGLE_framebuffer_blit
     64     extension) where the source is a multisample application-created
     65     framebuffer object and the destination is a single-sample
     66     framebuffer object (either application-created or window-system
     67     provided).
     68 
     69 New Procedures and Functions
     70 
     71     void RenderbufferStorageMultisampleANGLE(
     72             enum target, sizei samples,
     73             enum internalformat,
     74             sizei width, sizei height);
     75 
     76 New Types
     77 
     78     None.
     79 
     80 New Tokens
     81 
     82     Accepted by the <pname> parameter of GetRenderbufferParameteriv:
     83 
     84         RENDERBUFFER_SAMPLES_ANGLE                  0x8CAB
     85 
     86     Returned by CheckFramebufferStatus:
     87 
     88         FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE    0x8D56
     89 
     90     Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
     91     and GetFloatv:
     92 
     93         MAX_SAMPLES_ANGLE                           0x8D57
     94 
     95 Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)
     96 
     97 Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)
     98 
     99     Add to the last paragraph of 3.7.2 (Alternate Texture Image Specification)
    100     (as modified by ANGLE_framebuffer_blit) the following:
    101 
    102     "Calling CopyTexSubImage3DOES, CopyTexImage2D or CopyTexSubImage2D will
    103     result in INVALID_OPERATION being generated if the object bound to
    104     READ_FRAMEBUFFER_BINDING_ANGLE is "framebuffer complete" and the value
    105     of SAMPLE_BUFFERS is greater than zero."
    106 
    107 Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
    108 Operations and the Framebuffer)
    109 
    110     Add to 4.3.1 (Reading Pixels), right before the subsection titled
    111     "Obtaining Pixels from the Framebuffer":
    112 
    113     "ReadPixels generates INVALID_OPERATION if READ_FRAMEBUFFER_BINDING_ANGLE
    114     (section 4.4) is non-zero, the read framebuffer is framebuffer
    115     complete, and the value of SAMPLE_BUFFERS for the read framebuffer
    116     is greater than zero."
    117 
    118     In 4.3.2 (Copying Pixels), add to the section describing BlitFramebuffer
    119     that was added by ANGLE_framebuffer_blit.
    120 
    121     "If SAMPLE_BUFFERS for the read framebuffer is greater than zero and
    122     SAMPLE_BUFFERS for the draw framebuffer is zero, the samples
    123     corresponding to each pixel location in the source are converted to
    124     a single sample before being written to the destination.
    125 
    126     If SAMPLE_BUFFERS for the draw framebuffer is greater than zero, 
    127     no copy is performed and an INVALID_OPERATION error is generated.
    128 
    129     If SAMPLE_BUFFERS for the read framebuffer is greater than zero and
    130     <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, no copy is 
    131     performed and an INVALID_OPERATION error is generated.
    132 
    133     If SAMPLE_BUFFERS for the read framebuffer is greater than zero and 
    134     the format of the read and draw framebuffers are not identical, no
    135     copy is performed and an INVALID_OPERATION error is generated.
    136 
    137     If SAMPLE_BUFFERS for the read framebuffer is greater than zero, the
    138     dimensions of the source and destination rectangles provided to 
    139     BlitFramebufferANGLE must be identical and must specify the complete 
    140     source and destination buffers, otherwise no copy is performed and 
    141     an INVALID_OPERATION error is generated."
    142 
    143     Modification to 4.4.3 (Renderbuffer Objects)
    144 
    145     Add, just above the definition of RenderbufferStorage:
    146 
    147     "The command
    148 
    149         void RenderbufferStorageMultisampleANGLE(
    150             enum target, sizei samples,
    151             enum internalformat,
    152             sizei width, sizei height);
    153 
    154     establishes the data storage, format, dimensions, and number of
    155     samples of a renderbuffer object's image.  <target> must be
    156     RENDERBUFFER.  <internalformat> must be one of the color-renderable,
    157     depth-renderable, or stencil-renderable formats described in table 4.5.
    158     <width> and <height> are the dimensions in pixels of the renderbuffer.  If
    159     either <width> or <height> is greater than the value of 
    160     MAX_RENDERBUFFER_SIZE, or if <samples> is greater than MAX_SAMPLES_ANGLE, 
    161     then the error INVALID_VALUE is generated. If OpenGL ES is unable to 
    162     create a data store of the requested size, the error OUT_OF_MEMORY 
    163     is generated.
    164 
    165     Upon success, RenderbufferStorageMultisampleANGLE deletes any existing
    166     data store for the renderbuffer image and the contents of the data
    167     store after calling RenderbufferStorageMultisampleANGLE are undefined.
    168     RENDERBUFFER_WIDTH is set to <width>, RENDERBUFFER_HEIGHT is
    169     set to <height>, and RENDERBUFFER_INTERNAL_FORMAT is set to
    170     <internalformat>.
    171 
    172     If <samples> is zero, then RENDERBUFFER_SAMPLES_ANGLE is set to zero.
    173     Otherwise <samples> represents a request for a desired minimum
    174     number of samples. Since different implementations may support
    175     different sample counts for multisampled rendering, the actual
    176     number of samples allocated for the renderbuffer image is
    177     implementation dependent.  However, the resulting value for
    178     RENDERBUFFER_SAMPLES_ANGLE is guaranteed to be greater than or equal
    179     to <samples> and no more than the next larger sample count supported
    180     by the implementation.
    181 
    182     An OpenGL ES implementation may vary its allocation of internal component
    183     resolution based on any RenderbufferStorageMultisampleANGLE parameter (except
    184     target), but the allocation and chosen internal format must not be a
    185     function of any other state and cannot be changed once they are
    186     established. The actual resolution in bits of each component of the 
    187     allocated image can be queried with GetRenderbufferParameteriv."
    188 
    189     Modify the definiton of RenderbufferStorage as follows:
    190 
    191     "The command
    192 
    193         void RenderbufferStorage(enum target, enum internalformat,
    194                                     sizei width, sizei height);
    195 
    196      is equivalent to calling RenderbufferStorageMultisampleANGLE with
    197      <samples> equal to zero."
    198 
    199     In section 4.4.5 (Framebuffer Completeness) in the subsection
    200     titled "Framebuffer Completeness" add an entry to the bullet list:
    201 
    202     * The value of RENDERBUFFER_SAMPLES_ANGLE is the same for all attached
    203       images.
    204       { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE }
    205 
    206     Also add a paragraph to the end of the section after the definition
    207     of CheckFramebufferStatus:
    208 
    209     "The values of SAMPLE_BUFFERS and SAMPLES are derived from the
    210     attachments of the currently bound framebuffer object.  If the
    211     current DRAW_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer complete",
    212     then both SAMPLE_BUFFERS and SAMPLES are undefined.  Otherwise,
    213     SAMPLES is equal to the value of RENDERBUFFER_SAMPLES_ANGLE for the
    214     attached images (which all must have the same value for
    215     RENDERBUFFER_SAMPLES_ANGLE).  Further, SAMPLE_BUFFERS is one if
    216     SAMPLES is non-zero.  Otherwise, SAMPLE_BUFFERS is zero.
    217 
    218 Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special Functions)
    219 
    220 
    221 Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State
    222 Requests)
    223 
    224     In section 6.1.3 (Enumeraged Queries), modify the third paragraph 
    225     of the description of GetRenderbufferParameteriv as follows:
    226 
    227     "Upon successful return from GetRenderbufferParameteriv, if
    228     <pname> is RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT,
    229     RENDERBUFFER_INTERNAL_FORMAT, or RENDERBUFFER_SAMPLES_ANGLE, then <params> 
    230     will contain the width in pixels, height in pixels, internal format, or 
    231     number of samples, respectively, of the image of the renderbuffer 
    232     currently bound to <target>."
    233 
    234 
    235 Dependencies on ANGLE_framebuffer_blit    
    236 
    237     ANGLE_framebuffer_blit is required.  Technically, ANGLE_framebuffer_blit
    238     would not be required to support multisampled rendering, except for
    239     the fact that it provides the only method of doing a multisample
    240     resovle from a multisample renderbuffer.
    241 
    242 Dependencies on OES_texture_3D
    243 
    244     On an OpenGL ES implementation, in the absense of OES_texture_3D,
    245     omit references to CopyTexSubImage3DOES.
    246 
    247 Errors
    248 
    249     The error INVALID_OPERATION is generated if ReadPixels or 
    250     CopyTex{Sub}Image* is called while READ_FRAMEBUFFER_BINDING_ANGLE
    251     is non-zero, the read framebuffer is framebuffer complete, and the
    252     value of SAMPLE_BUFFERS for the read framebuffer is greater than
    253     zero.
    254 
    255     If both the draw and read framebuffers are framebuffer complete and
    256     the draw framebuffer has a value of SAMPLE_BUFFERS that is greater 
    257     than zero, then the error INVALID_OPERATION is generated if 
    258     BlitFramebufferANGLE is called.
    259 
    260     If both the draw and read framebuffers are framebuffer complete and
    261     the read framebuffer has a value of SAMPLE_BUFFERS that is greater
    262     than zero, the error INVALID_OPERATION is generated if 
    263     BlitFramebufferANGLE is called and any of the following conditions
    264     are true:
    265      - <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT.
    266      - the source or destination rectangles do not specify the entire
    267        source or destination buffer.
    268 
    269     If both the draw and read framebuffers are framebuffer complete and
    270     either has a value of SAMPLE_BUFFERS that is greater than zero, then
    271     the error INVALID_OPERATION is generated if BlitFramebufferANGLE is
    272     called and the formats of the draw and read framebuffers are not
    273     identical.
    274 
    275     If either the draw or read framebuffer is framebuffer complete and
    276     has a value of SAMPLE_BUFFERS that is greater than zero, then the
    277     error INVALID_OPERATION is generated if BlitFramebufferANGLE is called
    278     and the specified source and destination dimensions are not
    279     identical.
    280 
    281     If RenderbufferStorageMultisampleANGLE is called with <target> not
    282     equal to RENDERBUFFER, the error INVALID_ENUM is generated.
    283 
    284     If RenderbufferStorageMultisampleANGLE is called with an 
    285     <internalformat> that is not listed as one of the color-, depth- 
    286     or stencil-renderable formats in Table 4.5, then the error
    287     INVALID_ENUM is generated.
    288 
    289     If RenderbufferStorageMultisampleANGLE is called with <width> or 
    290     <height> greater than MAX_RENDERBUFFER_SIZE, then the error 
    291     INVALID_VALUE is generated.
    292 
    293     If RenderbufferStorageMultisampleANGLE is called with a value of
    294     <samples> that is greater than MAX_SAMPLES_ANGLE or less than zero,
    295     then the error INVALID_VALUE is generated.
    296 
    297     The error OUT_OF_MEMORY is generated when
    298     RenderbufferStorageMultisampleANGLE cannot create storage of the
    299     specified size.
    300 
    301 New State
    302 
    303     Add to table 6.22 (Renderbuffer State)
    304 
    305     Get Value                          Type    Get Command                 Initial Value  Description             Section
    306     -------------------------------    ------  --------------------------  -------------  --------------------    -------
    307     RENDERBUFFER_SAMPLES_ANGLE         Z+      GetRenderbufferParameteriv  0              number of samples       4.4.3
    308 
    309 
    310     Add to table 6.yy (Framebuffer Dependent Vaues) (added by 
    311     ANGLE_framebuffer_blit), the following new framebuffer dependent state.
    312 
    313     Get Value          Type  Get Command     Minimum Value    Description             Section
    314     -----------------  ----  -----------     -------------    -------------------     -------
    315     MAX_SAMPLES_ANGLE  Z+    GetIntegerv     1                Maximum number of       4.4.3
    316                                                               samples supported
    317                                                               for multisampling
    318                                                             
    319 
    320 
    321 Issues
    322     
    323     Issues from EXT_framebuffer_multisample have been removed.
    324  
    325     1) What should we call this extension?
    326 
    327        Resolved: ANGLE_framebuffer_blit.  
    328 
    329        This extension is a result of a collaboration between Google and 
    330        TransGaming for the open-source ANGLE project. Typically one would
    331        label a multi-vendor extension as EXT, but EXT_framebuffer_mulitsample 
    332        is already the name for this on Desktop GL.  Additionally this
    333        isn't truely a multi-vendor extension because there is only one
    334        implementation of this.  We'll follow the example of the open-source
    335        MESA project which uses the project name for the vendor suffix.
    336  
    337     2) How does this extension differ from EXT_framebuffer_multisample?
    338 
    339        This is designed to be a proper subset of EXT_framebuffer_multisample
    340        functionality as applicable to OpenGL ES 2.0.
    341 
    342        Functionality that is unchanged: 
    343         - creation of multisample renderbuffers.
    344         - whole buffer multi-sample->single-sample resolve.
    345         - no format conversions, stretching or flipping supported on multisample blits.
    346 
    347        Additional restrictions on BlitFramebufferANGLE:
    348         - multisample resolve is only supported on color buffers.
    349         - no blits to multisample destinations (no single->multi or multi-multi).
    350         - only entire buffers can be resolved.
    351          
    352 Revision History
    353 
    354     Revision 1, 2010/07/08
    355       - copied from revision 7 of EXT_framebuffer_multisample
    356       - removed language that was not relevant to ES2 
    357       - rebase changes against the Open GL ES 2.0 specification
    358       - added ANGLE-specific restrictions
    359     Revision 2, 2010/07/19
    360       - fix missing error code
    361     Revision 3, 2010/08/06
    362       - add additional contributors, update implementation status
    363       - disallow negative samples 
    364