Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/extensions/ANGLE_framebuffer_blit.txt
1693 views
1
Name
2
3
ANGLE_framebuffer_blit
4
5
Name Strings
6
7
GL_ANGLE_framebuffer_blit
8
9
Contributors
10
11
Contributors to EXT_framebuffer_blit
12
Daniel Koch, TransGaming Inc.
13
Shannon Woods, TransGaming Inc.
14
Kenneth Russell, Google Inc.
15
Vangelis Kokkevis, Google Inc.
16
17
Contact
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: Sept 22, 2012
28
Author Revision: 4
29
30
Number
31
32
OpenGL ES Extension #83
33
34
Dependencies
35
36
OpenGL ES 2.0 is required.
37
38
The extension is written against the OpenGL ES 2.0 specification.
39
40
OES_texture_3D affects the definition of this extension.
41
42
Overview
43
44
This extension modifies framebuffer objects by splitting the
45
framebuffer object binding point into separate DRAW and READ
46
bindings. This allows copying directly from one framebuffer to
47
another. In addition, a new high performance blit function is
48
added to facilitate these blits and perform some data conversion
49
where allowed.
50
51
IP Status
52
53
No known IP claims.
54
55
New Procedures and Functions
56
57
void BlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1,
58
int dstX0, int dstY0, int dstX1, int dstY1,
59
bitfield mask, enum filter);
60
61
New Tokens
62
63
Accepted by the <target> parameter of BindFramebuffer,
64
CheckFramebufferStatus, FramebufferTexture2D, FramebufferTexture3DOES,
65
FramebufferRenderbuffer, and
66
GetFramebufferAttachmentParameteriv:
67
68
// (reusing the tokens from EXT_framebuffer_blit)
69
READ_FRAMEBUFFER_ANGLE 0x8CA8
70
DRAW_FRAMEBUFFER_ANGLE 0x8CA9
71
72
Accepted by the <pname> parameters of GetIntegerv and GetFloatv:
73
74
// (reusing the tokens from EXT_framebuffer_blit)
75
DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 // alias FRAMEBUFFER_BINDING
76
READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA
77
78
79
Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)
80
81
Change the last paragraph of section 3.7.2 (Alternate Texture Image
82
Specification Commands) to:
83
84
"Calling CopyTexSubImage3DOES, CopyTexImage2D or CopyTexSubImage2D will
85
result in an INVALID_FRAMEBUFFER_OPERATION error if the object bound
86
to READ_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer complete"
87
(section 4.4.4.2)."
88
89
Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
90
Operations and the Framebuffer)
91
92
Change the first word of Chapter 4 from "The" to "A".
93
94
Append to the introduction of Chapter 4:
95
96
"Conceptually, the GL has two active framebuffers; the draw
97
framebuffer is the destination for rendering operations, and the
98
read framebuffer is the source for readback operations. The same
99
framebuffer may be used for both drawing and reading. Section
100
4.4.1 describes the mechanism for controlling framebuffer usage."
101
102
Modify the first sentence of the last paragraph of section 4.1.1 as follows:
103
104
"While an application-created framebuffer object is bound to
105
DRAW_FRAMEBUFFER_ANGLE, the pixel ownership test always passes."
106
107
Add to 4.3.1 (Reading Pixels), right before the subsection titled
108
"Obtaining Pixels from the Framebuffer":
109
110
"Calling ReadPixels generates INVALID_FRAMEBUFFER_OPERATION if
111
the object bound to READ_FRAMEBUFFER_BINDING_ANGLE is not "framebuffer
112
complete" (section 4.4.4.2). GetIntegerv generates an INVALID_OPERATION
113
error if the object bound to READ_FRAMEBUFFER_BINDING_ANGLE is not
114
framebuffer complete, or if the GL is using a framebuffer object
115
(i.e. READ_FRAMEBUFFER_BINDING_ANGLE is non-zero) and there is no color
116
attachment."
117
118
Insert a new section 4.3.2 titled "Copying Pixels" and renumber the
119
subsequent sections. Add the following text:
120
121
"BlitFramebufferANGLE transfers a rectangle of pixel values from one
122
region of the read framebuffer to another in the draw framebuffer.
123
124
BlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1,
125
int dstX0, int dstY0, int dstX1, int dstY1,
126
bitfield mask, enum filter);
127
128
<mask> is the bitwise OR of a number of values indicating which
129
buffers are to be copied. The values are COLOR_BUFFER_BIT,
130
DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT, which are described in
131
section 4.2.3. The pixels corresponding to these buffers are
132
copied from the source rectangle, bound by the locations (srcX0,
133
srcY0) and (srcX1, srcY1), to the destination rectangle, bound by
134
the locations (dstX0, dstY0) and (dstX1, dstY1). The lower bounds
135
of the rectangle are inclusive, while the upper bounds are
136
exclusive.
137
138
The actual region taken from the read framebuffer is limited to the
139
intersection of the source buffers being transferred, which may include
140
the color buffer, the depth buffer, and/or the stencil buffer depending on
141
<mask>. The actual region written to the draw framebuffer is limited to the
142
intersection of the destination buffers being written, which may include
143
the color buffer, the depth buffer, and/or the stencil buffer
144
depending on <mask>. Whether or not the source or destination regions are
145
altered due to these limits, the offset applied to pixels being transferred
146
is performed as though no such limits were present.
147
148
Stretching and scaling during a copy are not supported. If the source
149
and destination rectangle dimensions do not match, no copy is
150
performed and an INVALID_OPERATION error is generated.
151
Because stretching is not supported, <filter> must be NEAREST and
152
no filtering is applied.
153
154
Flipping during a copy is not supported. If either the source or
155
destination rectangle specifies a negative dimension, the error
156
INVALID_OPERATION is generated. If both the source and
157
destination rectangles specify a negative dimension for the same
158
direction, no reversal is required and the operation is supported.
159
160
If the source and destination buffers are identical, and the
161
source and destination rectangles overlap, the result of the blit
162
operation is undefined.
163
164
The pixel copy bypasses the fragment pipeline. The only fragment
165
operations which affect the blit are the pixel ownership test and
166
the scissor test.
167
168
If a buffer is specified in <mask> and does not exist in both the
169
read and draw framebuffers, the corresponding bit is silently
170
ignored.
171
172
Calling BlitFramebufferANGLE will result in an
173
INVALID_FRAMEBUFFER_OPERATION error if the objects bound to
174
DRAW_FRAMEBUFFER_BINDING_ANGLE and READ_FRAMEBUFFER_BINDING_ANGLE are
175
not "framebuffer complete" (section 4.4.4.2)."
176
177
Calling BlitFramebufferANGLE will result in an INVALID_OPERATION
178
error if <mask> includes COLOR_BUFFER_BIT and the source and
179
destination color formats to not match.
180
181
Calling BlitFramebufferANGLE will result in an INVALID_OPERATION
182
error if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
183
and the source and destination depth and stencil buffer formats do
184
not match.
185
186
If <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, only
187
complete buffers can be copied. If the source rectangle does not
188
specify the complete source buffer or the destination rectangle
189
(after factoring the scissor region, if applicable) does not specify
190
the complete destination buffer, an INVALID_OPERATION
191
error is generated.
192
193
Modify the beginning of section 4.4.1 as follows:
194
195
"The default framebuffer for rendering and readback operations is
196
provided by the windowing system. In addition, named framebuffer
197
objects can be created and operated upon. The namespace for
198
framebuffer objects is the unsigned integers, with zero reserved
199
by the GL for the default framebuffer.
200
201
A framebuffer object is created by binding an unused name to
202
DRAW_FRAMEBUFFER_ANGLE or READ_FRAMEBUFFER_ANGLE. The binding is
203
effected by calling
204
205
void BindFramebuffer(enum target, uint framebuffer);
206
207
with <target> set to the desired framebuffer target and
208
<framebuffer> set to the unused name. The resulting framebuffer
209
object is a new state vector, comprising one set of the state values
210
listed in table 6.23 for each attachment point of the
211
framebuffer, set to the same initial values. There is one
212
color attachment point, plus one each
213
for the depth and stencil attachment points.
214
215
BindFramebuffer may also be used to bind an existing
216
framebuffer object to DRAW_FRAMEBUFFER_ANGLE or
217
READ_FRAMEBUFFER_ANGLE. If the bind is successful no change is made
218
to the state of the bound framebuffer object, and any previous
219
binding to <target> is broken.
220
221
If a framebuffer object is bound to DRAW_FRAMEBUFFER_ANGLE or
222
READ_FRAMEBUFFER_ANGLE, it becomes the target for rendering or
223
readback operations, respectively, until it is deleted or another
224
framebuffer is bound to the corresponding bind point. Calling
225
BindFramebuffer with <target> set to FRAMEBUFFER binds the
226
framebuffer to both DRAW_FRAMEBUFFER_ANGLE and READ_FRAMEBUFFER_ANGLE.
227
228
While a framebuffer object is bound, GL operations on the target
229
to which it is bound affect the images attached to the bound
230
framebuffer object, and queries of the target to which it is bound
231
return state from the bound object. Queries of the values
232
specified in table 6.20 (Implementation Dependent Pixel Depths)
233
and table 6.yy (Framebuffer Dependent Values) are
234
derived from the framebuffer object bound to DRAW_FRAMEBUFFER_ANGLE.
235
236
The initial state of DRAW_FRAMEBUFFER_ANGLE and READ_FRAMEBUFFER_ANGLE
237
refers to the default framebuffer provided by the windowing
238
system. In order that access to the default framebuffer is not
239
lost, it is treated as a framebuffer object with the name of 0.
240
The default framebuffer is therefore rendered to and read from
241
while 0 is bound to the corresponding targets. On some
242
implementations, the properties of the default framebuffer can
243
change over time (e.g., in response to windowing system events
244
such as attaching the context to a new windowing system drawable.)"
245
246
Change the description of DeleteFramebuffers as follows:
247
248
"<framebuffers> contains <n> names of framebuffer objects to be
249
deleted. After a framebuffer object is deleted, it has no
250
attachments, and its name is again unused. If a framebuffer that
251
is currently bound to one or more of the targets
252
DRAW_FRAMEBUFFER_ANGLE or READ_FRAMEBUFFER_ANGLE is deleted, it is as
253
though BindFramebuffer had been executed with the corresponding
254
<target> and <framebuffer> zero. Unused names in <framebuffers>
255
are silently ignored, as is the value zero."
256
257
258
In section 4.4.3 (Renderbuffer Objects), modify the first two sentences
259
of the description of FramebufferRenderbuffer as follows:
260
261
"<target> must be DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE, or
262
FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as
263
though DRAW_FRAMEBUFFER_ANGLE was specified. The INVALID_OPERATION
264
error is generated if the value of the corresponding binding is zero."
265
266
In section 4.4.3 (Renderbuffer Objects), modify the first two sentences
267
of the description of FramebufferTexture2D as follows:
268
269
"<target> must be DRAW_FRAMEBUFFER_ANGLE,
270
READ_FRAMEBUFFER_ANGLE, or FRAMEBUFFER. If <target> is
271
FRAMEBUFFER, it behaves as though DRAW_FRAMEBUFFER_ANGLE was
272
specified. The INVALID_OPERATION error is generated if the value of the
273
corresponding binding is zero."
274
275
In section 4.4.5 (Framebuffer Completeness), modify the first sentence
276
of the description of CheckFramebufferStatus as follows:
277
278
"If <target> is not DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or
279
FRAMEBUFFER, the error INVALID_ENUM is generated. If <target> is
280
FRAMEBUFFER, it behaves as though DRAW_FRAMEBUFFER_ANGLE was
281
specified."
282
283
Modify the first sentence of the subsection titled "Effects of Framebuffer
284
Completeness on Framebuffer Operations" to be:
285
286
"Attempting to render to or read from a framebuffer which is not
287
framebuffer complete will generate an
288
INVALID_FRAMEBUFFER_OPERATION error."
289
290
291
292
Additions to Chapter 6 of the OpenGL 1.5 Specification (State and State
293
Requests)
294
295
In section 6.1.3, modify the first sentence of the description of
296
GetFramebufferAttachmentParameteriv as follows:
297
298
"<target> must be DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or
299
FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as
300
though DRAW_FRAMEBUFFER_ANGLE was specified."
301
302
Modify the title of Table 6.23 (Framebuffer State) to be "Framebuffer
303
(state per attachment point)".
304
305
306
Dependencies on OES_texture_3D
307
308
On an OpenGL ES implementation, in the absense of OES_texture_3D,
309
omit references to FramebufferTexture3DOES and CopyTexSubImage3DOES.
310
311
Errors
312
313
The error INVALID_FRAMEBUFFER_OPERATION is generated if
314
BlitFramebufferANGLE is called while the
315
draw framebuffer is not framebuffer complete.
316
317
The error INVALID_FRAMEBUFFER_OPERATION is generated if
318
BlitFramebufferANGLE, ReadPixels, CopyTex{Sub}Image*, is called while the
319
read framebuffer is not framebuffer complete.
320
321
The error INVALID_OPERATION is generated if GetIntegerv is called
322
while the read framebuffer is not framebuffer complete, or if there
323
is no color attachment present on the read framebuffer object.
324
325
The error INVALID_VALUE is generated by BlitFramebufferANGLE if
326
<mask> has any bits set other than those named by
327
COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT.
328
329
The error INVALID_OPERATION is generated if BlitFramebufferANGLE is
330
called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT
331
and the source and destination depth or stencil buffer formats do
332
not match.
333
334
The error INVALID_OPERATION is generated if BlitFramebufferANGLE is
335
called and any of the following conditions are true:
336
- the source and destination rectangle dimensions do not match
337
(ie scaling or flipping is required).
338
- <mask> includes COLOR_BUFFER_BIT and the source and destination
339
buffer formats do not match.
340
- <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT and the
341
source or destination rectangles do not specify the entire source
342
or destination buffer (after applying any scissor region).
343
344
The error INVALID_ENUM is generated by BlitFramebufferANGLE if
345
<filter> is not NEAREST.
346
347
The error INVALID_ENUM is generated if BindFramebuffer,
348
CheckFramebufferStatus, FramebufferTexture{2D|3DOES},
349
FramebufferRenderbuffer, or
350
GetFramebufferAttachmentParameteriv is called and <target> is
351
not DRAW_FRAMEBUFFER_ANGLE, READ_FRAMEBUFFER_ANGLE or FRAMEBUFFER.
352
353
New State
354
355
(Add a new table 6.xx, "Framebuffer (state per framebuffer target binding point)")
356
357
Get Value Type Get Command Initial Value Description Section
358
------------------------------ ---- ----------- -------------- ------------------- ------------
359
DRAW_FRAMEBUFFER_BINDING_ANGLE Z+ GetIntegerv 0 framebuffer object bound 4.4.1
360
to DRAW_FRAMEBUFFER_ANGLE
361
READ_FRAMEBUFFER_BINDING_ANGLE Z+ GetIntegerv 0 framebuffer object 4.4.1
362
to READ_FRAMEBUFFER_ANGLE
363
364
Remove reference to FRAMEBUFFER_BINDING from Table 6.23.
365
366
(Add a new table 6.yy, "Framebuffer Dependent Values")
367
368
Get Value Type Get Command Initial Value Description Section
369
---------------------------- ---- ----------- -------------- ------------------- ------------
370
SAMPLE_BUFFERS Z+ GetIntegerv 0 Number of multisample 3.2
371
buffers
372
SAMPLES Z+ GetIntegerv 0 Coverage mask size 3.2
373
374
Remove the references to SAMPLE_BUFFERS and SAMPLES from Table 6.17.
375
376
377
Issues
378
379
1) What should we call this extension?
380
381
Resolved: ANGLE_framebuffer_blit.
382
383
This extension is a result of a collaboration between Google and
384
TransGaming for the open-source ANGLE project. Typically one would
385
label a multi-vendor extension as EXT, but EXT_framebuffer_blit
386
is already the name for this on Desktop GL. Additionally this
387
isn't truely a multi-vendor extension because there is only one
388
implementation of this. We'll follow the example of the open-source
389
MESA project which uses the project name for the vendor suffix.
390
391
2) Why is this done as a separate extension instead of just supporting
392
EXT_framebuffer_blit?
393
394
To date, EXT_framebuffer_blit has not had interactions with OpenGL ES
395
specified and, as far as we know, it has not previously been exposed on
396
an ES 1.1 or ES 2.0 implementation. Because there are enough
397
differences between Desktop GL and OpenGL ES, and since OpenGL ES 2.0
398
has already subsumed the EXT_framebuffer_object functionality (with
399
some changes) it was deemed a worthwhile exercise to fully specify the
400
interactions. Additionally, some of the choices in exactly which
401
functionality is supported by BlitFramebufferANGLE is dictated by
402
what is reasonable to support on a implementation which is
403
layered on Direct3D9. It is not expected that other implementations
404
will necessary have the same set of restrictions or requirements.
405
406
3) How does this extension differ from EXT_framebuffer_blit?
407
408
This extension is designed to be a pure subset of the
409
EXT_framebuffer_blit functionality as applicable to OpenGL ES 2.0.
410
411
Functionality that is unchanged:
412
- the split DRAW and READ framebuffer attachment points and related sematics.
413
- the token values for the DRAW/READ_FRAMEBUFFER and DRAW/READ_FRAMBUFFER_BINDING
414
- the signature of the BlitFramebuffer entry-point.
415
416
Additional restrictions imposed by BlitFramebufferANGLE:
417
- no color conversions are supported
418
- no scaling, stretching or flipping are supported
419
- no filtering is supported (a consequence of no stretching)
420
- only whole depth and/or stencil buffers can be copied
421
422
Revision History
423
424
Revision 1, 2010/07/06
425
- copied from revision 15 of EXT_framebuffer_object
426
- removed language that was clearly not relevant to ES2
427
- rebased changes against the OpenGL ES 2.0 specification
428
- added ANGLE-specific restrictions
429
Revision 2, 2010/07/15
430
- clarifications of implicit clamping to buffer sizes (from ARB_fbo)
431
- clarify that D/S restricts apply after the scissor is applied
432
- improve some error language
433
Revision 3, 2010/08/06
434
- add additional contributors, update implementation status
435
Revision 4, 2012/09/22
436
- document errors for GetIntegerv.
437
438
439