Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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