gfx/angle/extensions/ANGLE_framebuffer_blit.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.

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

mercurial