1Name 2 3 EXT_framebuffer_blit 4 5Name Strings 6 7 GL_EXT_framebuffer_blit 8 9Contributors 10 11 Michael Gold 12 Evan Hart 13 Jeff Juliano 14 Jon Leech 15 Bill Licea-Kane 16 Barthold Lichtenbelt 17 Brian Paul 18 Ian Romanick 19 John Rosasco 20 Jeremy Sandmel 21 Eskil Steenberg 22 23Contact 24 25 Michael Gold, NVIDIA Corporation (gold 'at' nvidia.com) 26 27Status 28 29 Complete. Approved by the ARB "superbuffers" working group on 30 November 8, 2005. 31 32Version 33 34 Last Modified Date: April 5, 2007 35 Author Revision: 15 36 37Number 38 39 316 40 41Dependencies 42 43 OpenGL 1.1 is required. 44 45 EXT_framebuffer_object is required. 46 47 The extension is written against the OpenGL 1.5 specification. 48 49 ARB_color_buffer_float affects the definition of this extension. 50 51Overview 52 53 This extension modifies EXT_framebuffer_object by splitting the 54 framebuffer object binding point into separate DRAW and READ 55 bindings. This allows copying directly from one framebuffer to 56 another. In addition, a new high performance blit function is 57 added to facilitate these blits and perform some data conversion 58 where allowed. 59 60IP Status 61 62 No known IP claims. 63 64New Procedures and Functions 65 66 void BlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, 67 int dstX0, int dstY0, int dstX1, int dstY1, 68 bitfield mask, enum filter); 69 70New Tokens 71 72 Accepted by the <target> parameter of BindFramebufferEXT, 73 CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, 74 FramebufferRenderbufferEXT, and 75 GetFramebufferAttachmentParameterivEXT: 76 77 READ_FRAMEBUFFER_EXT 0x8CA8 78 DRAW_FRAMEBUFFER_EXT 0x8CA9 79 80 Accepted by the <pname> parameters of GetIntegerv, GetFloatv, and GetDoublev: 81 82 DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 // alias FRAMEBUFFER_BINDING_EXT 83 READ_FRAMEBUFFER_BINDING_EXT 0x8CAA 84 85 86Additions to Chapter 2 of the OpenGL 1.5 Specification (OpenGL Operation) 87 88 Append the following to section 2.6.1: 89 90 "Calling Begin will result in an INVALID_FRAMEBUFFER_OPERATION_EXT 91 error if the object bound to DRAW_FRAMEBUFFER_BINDING_EXT is not 92 "framebuffer complete" (section 4.4.4.2)." 93 94Additions to Chapter 3 of the OpenGL 1.5 Specification (Rasterization) 95 96 Add to section 3.6.3, at the end of the subsection titled 97 "Alternate Color Table Specification Commands": 98 99 "Calling CopyColorTable or CopyColorSubTable will result in an 100 INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to 101 READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete" 102 (section 4.4.4.2)." 103 104 Add to section 3.6.3, at the end of the subsection titled 105 "Alternate Convolution Filter Specification Commands": 106 107 "Calling CopyConvolutionFilter1D or CopyConvolutionFilter2D will 108 result in an INVALID_FRAMEBUFFER_OPERATION_EXT error if the object 109 bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer 110 complete" (section 4.4.4.2)." 111 112 In section 3.6.4, modify the final paragraph of the definition of 113 DrawPixels as follows: 114 115 "Calling DrawPixels will result in an 116 INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to 117 DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete" 118 (section 4.4.4.2)." 119 120 Add the following to section 3.7, following the description of 121 Bitmap: 122 123 "Calling Bitmap will result in an 124 INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to 125 DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete" 126 (section 4.4.4.2)." 127 128 Append the following to section 3.8.2: 129 130 "Calling CopyTexSubImage3D, CopyTexImage2D, 131 CopyTexSubImage2D, CopyTexImage1D or CopyTexSubImage1D will result 132 in an INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound 133 to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete" 134 (section 4.4.4.2)." 135 136Additions to Chapter 4 of the OpenGL 1.5 Specification (Per-Fragment 137Operations and the Frame Buffer) 138 139 Change the first word of Chapter 4 from "The" to "A". 140 141 Append to the introduction of Chapter 4: 142 143 "Conceptually, the GL has two active framebuffers; the draw 144 framebuffer is the destination for rendering operations, and the 145 read framebuffer is the source for readback operations. The same 146 framebuffer may be used for both drawing and reading. Section 147 4.4.1 describes the mechanism for controlling framebuffer usage." 148 149 Modify the last paragraph of section 4.1.1 as follows: 150 151 "While an application-created framebuffer object is bound to 152 DRAW_FRAMEBUFFER_EXT, the pixel ownership test always passes." 153 154 Modify the last sentence of the second to last paragraph of 155 section 4.2.4 as follows: 156 157 "If there is no accumulation buffer, or if the DRAW_FRAMEBUFFER_EXT 158 and READ_FRAMEBUFFER_EXT bindings (section 4.4.4.2) do not refer to 159 the same object, or if the GL is in color index mode, Accum 160 generates the error INVALID_OPERATION." 161 162 Add to 4.3.2 (Reading Pixels), right before the subsection titled 163 "Obtaining Pixels from the Framebuffer": 164 165 "Calling ReadPixels generates INVALID_FRAMEBUFFER_OPERATION_EXT if 166 the object bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer 167 complete" (section 4.4.4.2)." 168 169 In section 4.3.2, modify the definition of ReadBuffer as follows: 170 171 "The command 172 173 void ReadBuffer( enum src ); 174 175 takes a symbolic constant as argument. <src> must be one of the 176 values from tables 4.4 or 10.nnn. Otherwise, INVALID_ENUM is 177 generated. Further, the acceptable values for <src> depend on 178 whether the GL is using the default window-system-provided 179 framebuffer (i.e., READ_FRAMEBUFFER_BINDING_EXT is zero), or an 180 application-created framebuffer object (i.e., 181 READ_FRAMEBUFFER_BINDING_EXT is non-zero). For more information 182 about application-created framebuffer objects, see section 4.4. 183 184 When READ_FRAMEBUFFER_BINDING_EXT is zero, i.e. the default 185 window-system-provided framebuffer, <src> must be one of the 186 values listed in table 4.4. FRONT and LEFT refer to the front left 187 buffer, BACK refers to the back left buffer, and RIGHT refers to 188 the front right buffer. The other constants correspond directly 189 to the buffers that they name. If the requested buffer is missing, 190 then the error INVALID_OPERATION is generated. For the default 191 window-system-provided framebuffer, the initial setting for 192 ReadBuffer is FRONT if there is no back buffer and BACK 193 otherwise. 194 195 Modify the first sentence of section 4.3.3 as follows: 196 197 "CopyPixels transfers a rectangle of pixel values from one region 198 of the read framebuffer to another in the draw framebuffer." 199 200 Add the following text to section 4.3.3, page 194, inside the 201 definition of CopyPixels: 202 203 "Finally, the behavior of several GL operations is specified "as if 204 the arguments were passed to CopyPixels." These operations include: 205 CopyTex{Sub}Image*, CopyColor{Sub}Table, and CopyConvolutionFilter*. 206 INVALID_FRAMEBUFFER_OPERATION_EXT will be generated if an attempt is 207 made to execute one of these operations, or CopyPixels, while the 208 object bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer 209 complete" (as defined in section 4.4.4.2). Furthermore, an attempt 210 to execute CopyPixels will generate 211 INVALID_FRAMEBUFFER_OPERATION_EXT while the object bound to 212 DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"." 213 214 Append to section 4.3.3: 215 216 "BlitFramebufferEXT transfers a rectangle of pixel values from one 217 region of the read framebuffer to another in the draw framebuffer. 218 There are some important distinctions from CopyPixels, as 219 described below. 220 221 BlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, 222 int dstX0, int dstY0, int dstX1, int dstY1, 223 bitfield mask, enum filter); 224 225 <mask> is the bitwise OR of a number of values indicating which 226 buffers are to be copied. The values are COLOR_BUFFER_BIT, 227 DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT, which are described in 228 section 4.2.3. The pixels corresponding to these buffers are 229 copied from the source rectangle, bound by the locations (srcX0, 230 srcY0) and (srcX1, srcY1), to the destination rectangle, bound by 231 the locations (dstX0, dstY0) and (dstX1, dstY1). The lower bounds 232 of the rectangle are inclusive, while the upper bounds are 233 exclusive. 234 235 If the source and destination rectangle dimensions do not match, 236 the source image is stretched to fit the destination 237 rectangle. <filter> must be LINEAR or NEAREST and specifies the 238 method of interpolation to be applied if the image is 239 stretched. LINEAR filtering is allowed only for the color buffer; 240 if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, and 241 filter is not NEAREST, no copy is performed and an 242 INVALID_OPERATION error is generated. If the source and 243 destination dimensions are identical, no filtering is applied. If 244 either the source or destination rectangle specifies a negative 245 dimension, the image is reversed in the corresponding direction. 246 If both the source and destination rectangles specify a negative 247 dimension for the same direction, no reversal is performed. 248 249 If the source and destination buffers are identical, and the 250 source and destination rectangles overlap, the result of the blit 251 operation is undefined. 252 253 The pixel copy bypasses the fragment pipeline. The only fragment 254 operations which affect the blit are the pixel ownership test and 255 the scissor test. 256 257 If a buffer is specified in <mask> and does not exist in both the 258 read and draw framebuffers, the corresponding bit is silently 259 ignored. 260 261 If the color formats of the read and draw framebuffers do not 262 match, and <mask> includes COLOR_BUFFER_BIT, the pixel groups are 263 converted to match the destination format as in CopyPixels, except 264 that no pixel transfer operations apply and clamping behaves as if 265 CLAMP_FRAGMENT_COLOR_ARB is set to FIXED_ONLY_ARB. 266 267 Calling CopyPixels or BlitFramebufferEXT will result in an 268 INVALID_FRAMEBUFFER_OPERATION_EXT error if the objects bound to 269 DRAW_FRAMEBUFFER_BINDING_EXT and READ_FRAMEBUFFER_BINDING_EXT are 270 not "framebuffer complete" (section 4.4.4.2)." 271 272 Calling BlitFramebufferEXT will result in an INVALID_OPERATION 273 error if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT 274 and the source and destination depth and stencil buffer formats do 275 not match. 276 277 Modify the beginning of section 4.4.1 as follows: 278 279 "The default framebuffer for rendering and readback operations is 280 provided by the windowing system. In addition, named framebuffer 281 objects can be created and operated upon. The namespace for 282 framebuffer objects is the unsigned integers, with zero reserved 283 by the GL for the default framebuffer. 284 285 A framebuffer object is created by binding an unused name to 286 DRAW_FRAMEBUFFER_EXT or READ_FRAMEBUFFER_EXT. The binding is 287 effected by calling 288 289 void BindFramebufferEXT(enum target, uint framebuffer); 290 291 with <target> set to the desired framebuffer target and 292 <framebuffer> set to the unused name. The resulting framebuffer 293 object is a new state vector, comprising all the state values 294 listed in table 4.nnn, as well as one set of the state values 295 listed in table 5.nnn for each attachment point of the 296 framebuffer, set to the same initial values. There are 297 MAX_COLOR_ATTACHMENTS_EXT color attachment points, plus one each 298 for the depth and stencil attachment points. 299 300 BindFramebufferEXT may also be used to bind an existing 301 framebuffer object to DRAW_FRAMEBUFFER_EXT or 302 READ_FRAMEBUFFER_EXT. If the bind is successful no change is made 303 to the state of the bound framebuffer object, and any previous 304 binding to <target> is broken. 305 306 If a framebuffer object is bound to DRAW_FRAMEBUFFER_EXT or 307 READ_FRAMEBUFFER_EXT, it becomes the target for rendering or 308 readback operations, respectively, until it is deleted or another 309 framebuffer is bound to the corresponding bind point. Calling 310 BindFramebufferEXT with <target> set to FRAMEBUFFER_EXT binds the 311 framebuffer to both DRAW_FRAMEBUFFER_EXT and READ_FRAMEBUFFER_EXT. 312 313 While a framebuffer object is bound, GL operations on the target 314 to which it is bound affect the images attached to the bound 315 framebuffer object, and queries of the target to which it is bound 316 return state from the bound object. Queries of the values 317 specified in table 6.31 (Implementation Dependent Pixel Depths) 318 and table 8.nnn (Framebuffer-Dependent State Variables) are 319 derived from the framebuffer object bound to DRAW_FRAMEBUFFER_EXT. 320 321 The initial state of DRAW_FRAMEBUFFER_EXT and READ_FRAMEBUFFER_EXT 322 refers to the default framebuffer provided by the windowing 323 system. In order that access to the default framebuffer is not 324 lost, it is treated as a framebuffer object with the name of 0. 325 The default framebuffer is therefore rendered to and read from 326 while 0 is bound to the corresponding targets. On some 327 implementations, the properties of the default framebuffer can 328 change over time (e.g., in response to windowing system events 329 such as attaching the context to a new windowing system drawable.)" 330 331 Change the description of DeleteFramebuffersEXT as follows: 332 333 "<framebuffers> contains <n> names of framebuffer objects to be 334 deleted. After a framebuffer object is deleted, it has no 335 attachments, and its name is again unused. If a framebuffer that 336 is currently bound to one or more of the targets 337 DRAW_FRAMEBUFFER_EXT or READ_FRAMEBUFFER_EXT is deleted, it is as 338 though BindFramebufferEXT had been executed with the corresponding 339 <target> and <framebuffer> zero. Unused names in <framebuffers> 340 are silently ignored, as is the value zero." 341 342 343 In section 4.4.2.2, modify the first two sentences of the 344 description of FramebufferRenderbufferEXT as follows: 345 346 "<target> must be DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT, or 347 FRAMEBUFFER_EXT. If <target> is FRAMEBUFFER_EXT, it behaves as 348 though DRAW_FRAMEBUFFER_EXT was specified. INVALID_OPERATION is 349 generated if the value of the corresponding binding is zero." 350 351 In section 4.4.2.3, modify the first two sentences of the 352 description of FramebufferTexturexDEXT as follows: 353 354 "In all three routines, <target> must be DRAW_FRAMEBUFFER_EXT, 355 READ_FRAMEBUFFER_EXT, or FRAMEBUFFER_EXT. If <target> is 356 FRAMEBUFFER_EXT, it behaves as though DRAW_FRAMEBUFFER_EXT was 357 specified. INVALID_OPERATION is generated if the value of the 358 corresponding binding is zero." 359 360 In section 4.4.4.2, modify the first sentence of the description 361 of CheckFramebufferStatusEXT as follows: 362 363 "If <target> is not DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or 364 FRAMEBUFFER_EXT, INVALID_ENUM is generated. If <target> is 365 FRAMEBUFFER_EXT, it behaves as though DRAW_FRAMEBUFFER_EXT was 366 specified." 367 368 Modify section 4.4.4.3 as follows: 369 370 "Attempting to render to or read from a framebuffer which is not 371 framebuffer complete will generate an 372 INVALID_FRAMEBUFFER_OPERATION_EXT error." 373 374 375 376Additions to Chapter 6 of the OpenGL 1.5 Specification (State and State 377Requests) 378 379 In section 6.1.3, modify the first sentence of the description of 380 GetFramebufferAttachmentParameterivEXT as follows: 381 382 "<target> must be DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or 383 FRAMEBUFFER_EXT. If <target> is FRAMEBUFFER_EXT, it behaves as 384 though DRAW_FRAMEBUFFER_EXT was specified." 385 386 387GLX Protocol 388 389 BlitFramebufferEXT 390 2 44 rendering command length 391 2 4330 rendering command opcode 392 4 CARD32 source X0 393 4 CARD32 source Y0 394 4 CARD32 source X1 395 4 CARD32 source Y1 396 4 CARD32 destination X0 397 4 CARD32 destination Y0 398 4 CARD32 destination X1 399 4 CARD32 destination Y1 400 4 CARD32 mask 401 4 ENUM filter 402 403Dependencies on ARB_color_buffer_float 404 405 The reference to CLAMP_FRAGMENT_COLOR_ARB in section 4.3.3 applies 406 only if ARB_color_buffer_float is supported. 407 408Errors 409 410 The error INVALID_FRAMEBUFFER_OPERATION_EXT is generated if 411 BlitFramebufferEXT, DrawPixels, or CopyPixels is called while the 412 draw framebuffer is not framebuffer complete. 413 414 The error INVALID_FRAMEBUFFER_OPERATION_EXT is generated if 415 BlitFramebufferEXT, ReadPixels, CopyPixels, CopyTex{Sub}Image*, 416 CopyColor{Sub}Table, or CopyConvolutionFilter* is called while the 417 read framebuffer is not framebuffer complete. 418 419 The error INVALID_VALUE is generated by BlitFramebufferEXT if 420 <mask> has any bits set other than those named by 421 COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT. 422 423 The error INVALID_OPERATION is generated if BlitFramebufferEXT is 424 called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT 425 and <filter> is not NEAREST. 426 427 The error INVALID_OPERATION is generated if BlitFramebufferEXT is 428 called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT 429 and the source and destination depth or stencil buffer formats do 430 not match. 431 432 The error INVALID_ENUM is generated by BlitFramebufferEXT if 433 <filter> is not LINEAR or NEAREST. 434 435 The error INVALID_OPERATION is generated if BlitFramebufferEXT 436 is called within a Begin/End pair. 437 438 The error INVALID_ENUM is generated if BindFramebufferEXT, 439 CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, 440 FramebufferRenderbufferEXT, or 441 GetFramebufferAttachmentParameterivEXT is called and <target> is 442 not DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or FRAMEBUFFER_EXT. 443 444New State 445 446 (modify table 3.nnn, "Framebuffer (state per framebuffer target binding point)") 447 448 Get Value Type Get Command Initial Value Description Section Attribute 449 ---------------------------- ---- ----------- -------------- ------------------- ------------ --------- 450 DRAW_FRAMEBUFFER_BINDING_EXT Z+ GetIntegerv 0 framebuffer object bound 4.4.1 - 451 to DRAW_FRAMEBUFFER_EXT 452 READ_FRAMEBUFFER_BINDING_EXT Z+ GetIntegerv 0 framebuffer object 4.4.1 - 453 to READ_FRAMEBUFFER_EXT 454 455 Remove reference to FRAMEBUFFER_BINDING_EXT. 456 457 458Sample Code 459 460 /* Render to framebuffer object 2 */ 461 BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 2); 462 RenderScene(); 463 464 /* Blit contents of color buffer, depth buffer and stencil buffer 465 * from framebuffer object 2 to framebuffer object 1. 466 */ 467 BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 2); 468 BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 1); 469 BlitFramebufferEXT(0, 0, 640, 480, 470 0, 0, 640, 480, 471 GL_COLOR_BUFFER_BIT | 472 GL_DEPTH_BUFFER_BIT | 473 GL_STENCIL_BUFFER_BIT, 474 GL_NEAREST); 475 476 /* Blit contents of color buffer from framebuffer object 1 to 477 * framebuffer object 2, inverting the image in the X direction. 478 */ 479 BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 1); 480 BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 2); 481 BlitFramebufferEXT(0, 0, 640, 480, 482 640, 0, 0, 480, 483 GL_COLOR_BUFFER_BIT, 484 GL_NEAREST); 485 486 /* Blit color buffer from framebuffer object 1 to framebuffer 487 * object 3 with a 2X zoom and linear filtering. 488 */ 489 BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 1); 490 BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 3); 491 BlitFramebufferEXT(0, 0, 640, 480, 492 0, 0, 1280, 960, 493 GL_COLOR_BUFFER_BIT, GL_LINEAR); 494 495 496Issues 497 498 1) Should we pass in explicit source/dest rects instead of using 499 the rasterpos/pixelzoom? 500 501 Resolved: use explicit rects, so we don't need to perform 502 multiple state changes. 503 504 2) Should rects be (start,size) or (start,end)? 505 506 Resolved: use (start,end). This is a break from the past 507 (scissor, viewport) but is more intuitive than allowing a 508 negative size where mirrored zooms are desireable. 509 510 3) What should we call the blit function? 511 512 Resolved: BlitFramebufferEXT 513 514 4) Should filtering apply to depth or stencil values? 515 516 Resolved: No 517 518 5) What happens if LINEAR is specified and DEPTH or STENCIL is in 519 the mask? 520 521 Resolved: Generate ERROR_INVALID_OPERATION 522 523 6) What happens if READ_FRAMEBUFFER is NONE and a read is 524 attempted? 525 526 Resolved: Generate ERROR_INVALID_OPERATION 527 528 7) Should we generalize binding point assignment with a single 529 entry point and a parameter specifying read/write/whatever? 530 531 Resolved: concensus leans toward separate Read/Draw entry 532 points. 533 534 8) Should we define READ_FRAMEBUFFER and DRAW_FRAMEBUFFER targets 535 for BindFramebuffer instead of introducing a new level of 536 indirection? 537 538 Resolved: Yes. Binding to the legacy target FRAMEBUFFER sets 539 both DRAW_FRAMEBUFFER and READ_FRAMEBUFFER. Querying 540 FRAMEBUFFER_BINDING return the DRAW_FRAMEBUFFER_BINDING. 541 542 9) What happens when a user queries framebuffer attributes, 543 e.g. Get(RED_BITS)? Is the result returned from 544 READ_FRAMEBUFFER or DRAW_FRAMEBUFFER? Do we need a new query? 545 e.g. 546 547 GetFramebufferParameteriv(int target, enum pname, int* value) 548 549 Resolved: always return the value associated with the 550 DRAW_FRAMEBUFFER. Do not add a new query. 551 552 10) How does Accum behave in the presence of separate READ/DRAW 553 framebuffers? 554 555 Resolved: Accum returns INVALID_OPERATION if the 556 READ_FRAMEBUFFER and DRAW_FRAMEBUFFER bindings are not 557 identical. 558 559 11) Should blits be allowed between buffers of different bit sizes? 560 561 Resolved: Yes, for color buffers only. Attempting to blit 562 between depth or stencil buffers of different size generates 563 INVALID_OPERATION. 564 565 12) Should we add support for multiple ReadBuffers, so that 566 multiple color buffers may be copied with a single call to 567 BlitFramebuffer? 568 569 Resolved: No, we considered this but the behavior is awkward 570 to define and the functionality is of limited use. 571 572 13) How should BlitFramebuffer color space conversion be 573 specified? Do we allow context clamp state to affect the 574 blit? 575 576 Resolved: Blitting to a fixed point buffer always clamps, 577 blitting to a floating point buffer never clamps. The context 578 state is ignored. 579 580 14) Should overlapped blits be allowed? Should they be guaranteed 581 to work? 582 583 Resolved: Overlapping blits are allowed but are undefined. 584 585 586Revision History 587 588 Revision 15, 2007/4/6 589 - Removed language left over from ReadBuffers. 590 - Removed reference to nonexistent 'CopyTexImage3D'. 591 Revision 14, 2006/09/29 592 - Changed the resolution of issue 12 to reflect the working 593 group decision to abandon ReadBuffers. 594 - Eliminated issues 15, 16 and 17 as they are no longer relevent. 595 - Changed the resolution of issue 14 and the corresponding spec 596 language to indicate that the result of an overlapping blit is 597 undefined. 598 - Changed the spec language to clarify that the lower bound of a 599 blit rectangle is inclusive while the upper bound is 600 exclusive. 601 - Added a sample showing an inverted blit, to clarify the pixel 602 addressing rules. 603 - Clarified spec language and error behavior to indicate that 604 blitting DEPTH and STENCIL buffers with LINEAR filtering is 605 always disallowed, whether or not the blit is scaling. 606 Revision 13, 2006/06/01 (Jeff Juliano) 607 - Clarify errors generated when read and draw framebuffers are 608 incomplete. 609 Revision 12, 2005/12/22 (Jon Leech) 610 - Assigned enumerant values. Add return type to BlitFramebufferEXT. 611 Note INVALID_ENUM error if filter is not LINEAR or NEAREST. 612 Revision 11, 2005/12/14 613 - Added several missing conditions to the Errors section. 614 - Changed status to "Complete". 615 Revision 10, 2005/11/6 616 - Removed all ReadBuffers discussion, as this functionality will 617 be deferred. Issues 15-17 are hereafter irrelevent. 618 Revision 9, 2005/10/31 619 - Resolved issue 16 and updated language to reflect this decision. 620 - Minor language changes per feedback. 621 - Added issue 17 and resolution, although language does not reflect this. 622 Revision 8, 2005/10/20 623 - Added ReadBuffersEXT language 624 - Removed some redundant language in ReadBuffer 625 - Re-opened issue 15 for further consideration 626 - Added issue 16 627 Revision 7, 2005/10/7 628 - Added issues 13 and 14, and resolution for 11, 13, and 14. 629 - Added dependency on ARB_color_buffer_float. 630 - Removed multisample language, now covered in EXT_framebuffer_multisample. 631 - Added framebuffer incomplete error language to spec proper. 632 - Alias DRAW_FRAMEBUFFER_BINDING_EXT to FRAMEBUFFER_BINDING_EXT. 633 - Updated Overview text to reflect the resolution to issue 8. 634 Revision 6, 2005/9/26 635 - Moved issues to the end, per new conventions. 636 - Added new language referring to DRAW_FRAMEBUFFER and 637 READ_FRAMEBUFFER bind points to sections 4.1.1, 4.4.1, 638 4.4.2.2, 4.4.2.3, 4.4.4.2, 6.1.3 and Errors, and updated the 639 example code, per resolution of issue 8. 640 - Added language in section 4.4.1 specifying Get behavior, per 641 resolution of issue 9. 642 - Added language to section 4.2.4 describing new error behavior 643 for Accum, per resolution of issue 10. 644 - Added language to section 4.3.3 describing color format 645 conversion, per resolution of issue 11. 646 Revision 5, 2005/9/6 647 - Added issues 8 - 11 648 - Minor edits from reviewer feedback 649 Revision 4, 2005/9/5 650 - Added chapter 4 intro section 651 - Added errors and state table information 652 - Added sample code 653 - fixed typos 654 Revision 3, 2005/8/29 655 - Converted to spec template 656 Revision 2, 2005/7/18 657 - Lots of new issues added and resolved 658 Revision 1, 2005/7/5 659 - Initial draft 660