Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/extensions/ANGLE_framebuffer_multisample.txt
1693 views
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
365