gfx/angle/extensions/ANGLE_framebuffer_multisample.txt

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 Name
     3     ANGLE_framebuffer_multisample
     5 Name Strings
     7     GL_ANGLE_framebuffer_multisample
     9 Contributors
    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.
    17 Contacts
    19     Daniel Koch, TransGaming Inc. (daniel 'at' transgaming 'dot' com)
    21 Status
    23     Implemented in ANGLE ES2
    25 Version
    27     Last Modified Date: Aug 6, 2010 
    28     Author Revision: #3
    30 Number
    32     OpenGL ES Extension #84
    34 Dependencies
    36     Requires OpenGL ES 2.0.
    38     Requires GL_ANGLE_framebuffer_blit (or equivalent functionality).
    40     The extension is written against the OpenGL ES 2.0 specification. 
    42     OES_texture_3D affects the definition of this extension.
    44 Overview
    46     This extension extends the framebuffer object framework to
    47     enable multisample rendering.
    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.
    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.
    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).
    69 New Procedures and Functions
    71     void RenderbufferStorageMultisampleANGLE(
    72             enum target, sizei samples,
    73             enum internalformat,
    74             sizei width, sizei height);
    76 New Types
    78     None.
    80 New Tokens
    82     Accepted by the <pname> parameter of GetRenderbufferParameteriv:
    84         RENDERBUFFER_SAMPLES_ANGLE                  0x8CAB
    86     Returned by CheckFramebufferStatus:
    88         FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE    0x8D56
    90     Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
    91     and GetFloatv:
    93         MAX_SAMPLES_ANGLE                           0x8D57
    95 Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)
    97 Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)
    99     Add to the last paragraph of 3.7.2 (Alternate Texture Image Specification)
   100     (as modified by ANGLE_framebuffer_blit) the following:
   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."
   107 Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
   108 Operations and the Framebuffer)
   110     Add to 4.3.1 (Reading Pixels), right before the subsection titled
   111     "Obtaining Pixels from the Framebuffer":
   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."
   118     In 4.3.2 (Copying Pixels), add to the section describing BlitFramebuffer
   119     that was added by ANGLE_framebuffer_blit.
   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.
   126     If SAMPLE_BUFFERS for the draw framebuffer is greater than zero, 
   127     no copy is performed and an INVALID_OPERATION error is generated.
   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.
   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.
   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."
   143     Modification to 4.4.3 (Renderbuffer Objects)
   145     Add, just above the definition of RenderbufferStorage:
   147     "The command
   149         void RenderbufferStorageMultisampleANGLE(
   150             enum target, sizei samples,
   151             enum internalformat,
   152             sizei width, sizei height);
   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.
   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>.
   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.
   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."
   189     Modify the definiton of RenderbufferStorage as follows:
   191     "The command
   193         void RenderbufferStorage(enum target, enum internalformat,
   194                                     sizei width, sizei height);
   196      is equivalent to calling RenderbufferStorageMultisampleANGLE with
   197      <samples> equal to zero."
   199     In section 4.4.5 (Framebuffer Completeness) in the subsection
   200     titled "Framebuffer Completeness" add an entry to the bullet list:
   202     * The value of RENDERBUFFER_SAMPLES_ANGLE is the same for all attached
   203       images.
   204       { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE }
   206     Also add a paragraph to the end of the section after the definition
   207     of CheckFramebufferStatus:
   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.
   218 Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special Functions)
   221 Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State
   222 Requests)
   224     In section 6.1.3 (Enumeraged Queries), modify the third paragraph 
   225     of the description of GetRenderbufferParameteriv as follows:
   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>."
   235 Dependencies on ANGLE_framebuffer_blit    
   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.
   242 Dependencies on OES_texture_3D
   244     On an OpenGL ES implementation, in the absense of OES_texture_3D,
   245     omit references to CopyTexSubImage3DOES.
   247 Errors
   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.
   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.
   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.
   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.
   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.
   281     If RenderbufferStorageMultisampleANGLE is called with <target> not
   282     equal to RENDERBUFFER, the error INVALID_ENUM is generated.
   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.
   289     If RenderbufferStorageMultisampleANGLE is called with <width> or 
   290     <height> greater than MAX_RENDERBUFFER_SIZE, then the error 
   291     INVALID_VALUE is generated.
   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.
   297     The error OUT_OF_MEMORY is generated when
   298     RenderbufferStorageMultisampleANGLE cannot create storage of the
   299     specified size.
   301 New State
   303     Add to table 6.22 (Renderbuffer State)
   305     Get Value                          Type    Get Command                 Initial Value  Description             Section
   306     -------------------------------    ------  --------------------------  -------------  --------------------    -------
   307     RENDERBUFFER_SAMPLES_ANGLE         Z+      GetRenderbufferParameteriv  0              number of samples       4.4.3
   310     Add to table 6.yy (Framebuffer Dependent Vaues) (added by 
   311     ANGLE_framebuffer_blit), the following new framebuffer dependent state.
   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
   321 Issues
   323     Issues from EXT_framebuffer_multisample have been removed.
   325     1) What should we call this extension?
   327        Resolved: ANGLE_framebuffer_blit.  
   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.
   337     2) How does this extension differ from EXT_framebuffer_multisample?
   339        This is designed to be a proper subset of EXT_framebuffer_multisample
   340        functionality as applicable to OpenGL ES 2.0.
   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.
   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.
   352 Revision History
   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 

mercurial