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