| Name |
| |
| EXT_framebuffer_blit |
| |
| Name Strings |
| |
| GL_EXT_framebuffer_blit |
| |
| Contributors |
| |
| Michael Gold |
| Evan Hart |
| Jeff Juliano |
| Jon Leech |
| Bill Licea-Kane |
| Barthold Lichtenbelt |
| Brian Paul |
| Ian Romanick |
| John Rosasco |
| Jeremy Sandmel |
| Eskil Steenberg |
| |
| Contact |
| |
| Michael Gold, NVIDIA Corporation (gold 'at' nvidia.com) |
| |
| Status |
| |
| Complete. Approved by the ARB "superbuffers" working group on |
| November 8, 2005. |
| |
| Version |
| |
| Last Modified Date: April 5, 2007 |
| Author Revision: 15 |
| |
| Number |
| |
| 316 |
| |
| Dependencies |
| |
| OpenGL 1.1 is required. |
| |
| EXT_framebuffer_object is required. |
| |
| The extension is written against the OpenGL 1.5 specification. |
| |
| ARB_color_buffer_float affects the definition of this extension. |
| |
| Overview |
| |
| This extension modifies EXT_framebuffer_object by splitting the |
| framebuffer object binding point into separate DRAW and READ |
| bindings. This allows copying directly from one framebuffer to |
| another. In addition, a new high performance blit function is |
| added to facilitate these blits and perform some data conversion |
| where allowed. |
| |
| IP Status |
| |
| No known IP claims. |
| |
| New Procedures and Functions |
| |
| void BlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, |
| int dstX0, int dstY0, int dstX1, int dstY1, |
| bitfield mask, enum filter); |
| |
| New Tokens |
| |
| Accepted by the <target> parameter of BindFramebufferEXT, |
| CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, |
| FramebufferRenderbufferEXT, and |
| GetFramebufferAttachmentParameterivEXT: |
| |
| READ_FRAMEBUFFER_EXT 0x8CA8 |
| DRAW_FRAMEBUFFER_EXT 0x8CA9 |
| |
| Accepted by the <pname> parameters of GetIntegerv, GetFloatv, and GetDoublev: |
| |
| DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 // alias FRAMEBUFFER_BINDING_EXT |
| READ_FRAMEBUFFER_BINDING_EXT 0x8CAA |
| |
| |
| Additions to Chapter 2 of the OpenGL 1.5 Specification (OpenGL Operation) |
| |
| Append the following to section 2.6.1: |
| |
| "Calling Begin will result in an INVALID_FRAMEBUFFER_OPERATION_EXT |
| error if the object bound to DRAW_FRAMEBUFFER_BINDING_EXT is not |
| "framebuffer complete" (section 4.4.4.2)." |
| |
| Additions to Chapter 3 of the OpenGL 1.5 Specification (Rasterization) |
| |
| Add to section 3.6.3, at the end of the subsection titled |
| "Alternate Color Table Specification Commands": |
| |
| "Calling CopyColorTable or CopyColorSubTable will result in an |
| INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to |
| READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete" |
| (section 4.4.4.2)." |
| |
| Add to section 3.6.3, at the end of the subsection titled |
| "Alternate Convolution Filter Specification Commands": |
| |
| "Calling CopyConvolutionFilter1D or CopyConvolutionFilter2D will |
| result in an INVALID_FRAMEBUFFER_OPERATION_EXT error if the object |
| bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer |
| complete" (section 4.4.4.2)." |
| |
| In section 3.6.4, modify the final paragraph of the definition of |
| DrawPixels as follows: |
| |
| "Calling DrawPixels will result in an |
| INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to |
| DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete" |
| (section 4.4.4.2)." |
| |
| Add the following to section 3.7, following the description of |
| Bitmap: |
| |
| "Calling Bitmap will result in an |
| INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound to |
| DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete" |
| (section 4.4.4.2)." |
| |
| Append the following to section 3.8.2: |
| |
| "Calling CopyTexSubImage3D, CopyTexImage2D, |
| CopyTexSubImage2D, CopyTexImage1D or CopyTexSubImage1D will result |
| in an INVALID_FRAMEBUFFER_OPERATION_EXT error if the object bound |
| to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete" |
| (section 4.4.4.2)." |
| |
| Additions to Chapter 4 of the OpenGL 1.5 Specification (Per-Fragment |
| Operations and the Frame Buffer) |
| |
| Change the first word of Chapter 4 from "The" to "A". |
| |
| Append to the introduction of Chapter 4: |
| |
| "Conceptually, the GL has two active framebuffers; the draw |
| framebuffer is the destination for rendering operations, and the |
| read framebuffer is the source for readback operations. The same |
| framebuffer may be used for both drawing and reading. Section |
| 4.4.1 describes the mechanism for controlling framebuffer usage." |
| |
| Modify the last paragraph of section 4.1.1 as follows: |
| |
| "While an application-created framebuffer object is bound to |
| DRAW_FRAMEBUFFER_EXT, the pixel ownership test always passes." |
| |
| Modify the last sentence of the second to last paragraph of |
| section 4.2.4 as follows: |
| |
| "If there is no accumulation buffer, or if the DRAW_FRAMEBUFFER_EXT |
| and READ_FRAMEBUFFER_EXT bindings (section 4.4.4.2) do not refer to |
| the same object, or if the GL is in color index mode, Accum |
| generates the error INVALID_OPERATION." |
| |
| Add to 4.3.2 (Reading Pixels), right before the subsection titled |
| "Obtaining Pixels from the Framebuffer": |
| |
| "Calling ReadPixels generates INVALID_FRAMEBUFFER_OPERATION_EXT if |
| the object bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer |
| complete" (section 4.4.4.2)." |
| |
| In section 4.3.2, modify the definition of ReadBuffer as follows: |
| |
| "The command |
| |
| void ReadBuffer( enum src ); |
| |
| takes a symbolic constant as argument. <src> must be one of the |
| values from tables 4.4 or 10.nnn. Otherwise, INVALID_ENUM is |
| generated. Further, the acceptable values for <src> depend on |
| whether the GL is using the default window-system-provided |
| framebuffer (i.e., READ_FRAMEBUFFER_BINDING_EXT is zero), or an |
| application-created framebuffer object (i.e., |
| READ_FRAMEBUFFER_BINDING_EXT is non-zero). For more information |
| about application-created framebuffer objects, see section 4.4. |
| |
| When READ_FRAMEBUFFER_BINDING_EXT is zero, i.e. the default |
| window-system-provided framebuffer, <src> must be one of the |
| values listed in table 4.4. FRONT and LEFT refer to the front left |
| buffer, BACK refers to the back left buffer, and RIGHT refers to |
| the front right buffer. The other constants correspond directly |
| to the buffers that they name. If the requested buffer is missing, |
| then the error INVALID_OPERATION is generated. For the default |
| window-system-provided framebuffer, the initial setting for |
| ReadBuffer is FRONT if there is no back buffer and BACK |
| otherwise. |
| |
| Modify the first sentence of section 4.3.3 as follows: |
| |
| "CopyPixels transfers a rectangle of pixel values from one region |
| of the read framebuffer to another in the draw framebuffer." |
| |
| Add the following text to section 4.3.3, page 194, inside the |
| definition of CopyPixels: |
| |
| "Finally, the behavior of several GL operations is specified "as if |
| the arguments were passed to CopyPixels." These operations include: |
| CopyTex{Sub}Image*, CopyColor{Sub}Table, and CopyConvolutionFilter*. |
| INVALID_FRAMEBUFFER_OPERATION_EXT will be generated if an attempt is |
| made to execute one of these operations, or CopyPixels, while the |
| object bound to READ_FRAMEBUFFER_BINDING_EXT is not "framebuffer |
| complete" (as defined in section 4.4.4.2). Furthermore, an attempt |
| to execute CopyPixels will generate |
| INVALID_FRAMEBUFFER_OPERATION_EXT while the object bound to |
| DRAW_FRAMEBUFFER_BINDING_EXT is not "framebuffer complete"." |
| |
| Append to section 4.3.3: |
| |
| "BlitFramebufferEXT transfers a rectangle of pixel values from one |
| region of the read framebuffer to another in the draw framebuffer. |
| There are some important distinctions from CopyPixels, as |
| described below. |
| |
| BlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, |
| int dstX0, int dstY0, int dstX1, int dstY1, |
| bitfield mask, enum filter); |
| |
| <mask> is the bitwise OR of a number of values indicating which |
| buffers are to be copied. The values are COLOR_BUFFER_BIT, |
| DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT, which are described in |
| section 4.2.3. The pixels corresponding to these buffers are |
| copied from the source rectangle, bound by the locations (srcX0, |
| srcY0) and (srcX1, srcY1), to the destination rectangle, bound by |
| the locations (dstX0, dstY0) and (dstX1, dstY1). The lower bounds |
| of the rectangle are inclusive, while the upper bounds are |
| exclusive. |
| |
| If the source and destination rectangle dimensions do not match, |
| the source image is stretched to fit the destination |
| rectangle. <filter> must be LINEAR or NEAREST and specifies the |
| method of interpolation to be applied if the image is |
| stretched. LINEAR filtering is allowed only for the color buffer; |
| if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, and |
| filter is not NEAREST, no copy is performed and an |
| INVALID_OPERATION error is generated. If the source and |
| destination dimensions are identical, no filtering is applied. If |
| either the source or destination rectangle specifies a negative |
| dimension, the image is reversed in the corresponding direction. |
| If both the source and destination rectangles specify a negative |
| dimension for the same direction, no reversal is performed. |
| |
| If the source and destination buffers are identical, and the |
| source and destination rectangles overlap, the result of the blit |
| operation is undefined. |
| |
| The pixel copy bypasses the fragment pipeline. The only fragment |
| operations which affect the blit are the pixel ownership test and |
| the scissor test. |
| |
| If a buffer is specified in <mask> and does not exist in both the |
| read and draw framebuffers, the corresponding bit is silently |
| ignored. |
| |
| If the color formats of the read and draw framebuffers do not |
| match, and <mask> includes COLOR_BUFFER_BIT, the pixel groups are |
| converted to match the destination format as in CopyPixels, except |
| that no pixel transfer operations apply and clamping behaves as if |
| CLAMP_FRAGMENT_COLOR_ARB is set to FIXED_ONLY_ARB. |
| |
| Calling CopyPixels or BlitFramebufferEXT will result in an |
| INVALID_FRAMEBUFFER_OPERATION_EXT error if the objects bound to |
| DRAW_FRAMEBUFFER_BINDING_EXT and READ_FRAMEBUFFER_BINDING_EXT are |
| not "framebuffer complete" (section 4.4.4.2)." |
| |
| Calling BlitFramebufferEXT will result in an INVALID_OPERATION |
| error if <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT |
| and the source and destination depth and stencil buffer formats do |
| not match. |
| |
| Modify the beginning of section 4.4.1 as follows: |
| |
| "The default framebuffer for rendering and readback operations is |
| provided by the windowing system. In addition, named framebuffer |
| objects can be created and operated upon. The namespace for |
| framebuffer objects is the unsigned integers, with zero reserved |
| by the GL for the default framebuffer. |
| |
| A framebuffer object is created by binding an unused name to |
| DRAW_FRAMEBUFFER_EXT or READ_FRAMEBUFFER_EXT. The binding is |
| effected by calling |
| |
| void BindFramebufferEXT(enum target, uint framebuffer); |
| |
| with <target> set to the desired framebuffer target and |
| <framebuffer> set to the unused name. The resulting framebuffer |
| object is a new state vector, comprising all the state values |
| listed in table 4.nnn, as well as one set of the state values |
| listed in table 5.nnn for each attachment point of the |
| framebuffer, set to the same initial values. There are |
| MAX_COLOR_ATTACHMENTS_EXT color attachment points, plus one each |
| for the depth and stencil attachment points. |
| |
| BindFramebufferEXT may also be used to bind an existing |
| framebuffer object to DRAW_FRAMEBUFFER_EXT or |
| READ_FRAMEBUFFER_EXT. If the bind is successful no change is made |
| to the state of the bound framebuffer object, and any previous |
| binding to <target> is broken. |
| |
| If a framebuffer object is bound to DRAW_FRAMEBUFFER_EXT or |
| READ_FRAMEBUFFER_EXT, it becomes the target for rendering or |
| readback operations, respectively, until it is deleted or another |
| framebuffer is bound to the corresponding bind point. Calling |
| BindFramebufferEXT with <target> set to FRAMEBUFFER_EXT binds the |
| framebuffer to both DRAW_FRAMEBUFFER_EXT and READ_FRAMEBUFFER_EXT. |
| |
| While a framebuffer object is bound, GL operations on the target |
| to which it is bound affect the images attached to the bound |
| framebuffer object, and queries of the target to which it is bound |
| return state from the bound object. Queries of the values |
| specified in table 6.31 (Implementation Dependent Pixel Depths) |
| and table 8.nnn (Framebuffer-Dependent State Variables) are |
| derived from the framebuffer object bound to DRAW_FRAMEBUFFER_EXT. |
| |
| The initial state of DRAW_FRAMEBUFFER_EXT and READ_FRAMEBUFFER_EXT |
| refers to the default framebuffer provided by the windowing |
| system. In order that access to the default framebuffer is not |
| lost, it is treated as a framebuffer object with the name of 0. |
| The default framebuffer is therefore rendered to and read from |
| while 0 is bound to the corresponding targets. On some |
| implementations, the properties of the default framebuffer can |
| change over time (e.g., in response to windowing system events |
| such as attaching the context to a new windowing system drawable.)" |
| |
| Change the description of DeleteFramebuffersEXT as follows: |
| |
| "<framebuffers> contains <n> names of framebuffer objects to be |
| deleted. After a framebuffer object is deleted, it has no |
| attachments, and its name is again unused. If a framebuffer that |
| is currently bound to one or more of the targets |
| DRAW_FRAMEBUFFER_EXT or READ_FRAMEBUFFER_EXT is deleted, it is as |
| though BindFramebufferEXT had been executed with the corresponding |
| <target> and <framebuffer> zero. Unused names in <framebuffers> |
| are silently ignored, as is the value zero." |
| |
| |
| In section 4.4.2.2, modify the first two sentences of the |
| description of FramebufferRenderbufferEXT as follows: |
| |
| "<target> must be DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT, or |
| FRAMEBUFFER_EXT. If <target> is FRAMEBUFFER_EXT, it behaves as |
| though DRAW_FRAMEBUFFER_EXT was specified. INVALID_OPERATION is |
| generated if the value of the corresponding binding is zero." |
| |
| In section 4.4.2.3, modify the first two sentences of the |
| description of FramebufferTexturexDEXT as follows: |
| |
| "In all three routines, <target> must be DRAW_FRAMEBUFFER_EXT, |
| READ_FRAMEBUFFER_EXT, or FRAMEBUFFER_EXT. If <target> is |
| FRAMEBUFFER_EXT, it behaves as though DRAW_FRAMEBUFFER_EXT was |
| specified. INVALID_OPERATION is generated if the value of the |
| corresponding binding is zero." |
| |
| In section 4.4.4.2, modify the first sentence of the description |
| of CheckFramebufferStatusEXT as follows: |
| |
| "If <target> is not DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or |
| FRAMEBUFFER_EXT, INVALID_ENUM is generated. If <target> is |
| FRAMEBUFFER_EXT, it behaves as though DRAW_FRAMEBUFFER_EXT was |
| specified." |
| |
| Modify section 4.4.4.3 as follows: |
| |
| "Attempting to render to or read from a framebuffer which is not |
| framebuffer complete will generate an |
| INVALID_FRAMEBUFFER_OPERATION_EXT error." |
| |
| |
| |
| Additions to Chapter 6 of the OpenGL 1.5 Specification (State and State |
| Requests) |
| |
| In section 6.1.3, modify the first sentence of the description of |
| GetFramebufferAttachmentParameterivEXT as follows: |
| |
| "<target> must be DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or |
| FRAMEBUFFER_EXT. If <target> is FRAMEBUFFER_EXT, it behaves as |
| though DRAW_FRAMEBUFFER_EXT was specified." |
| |
| |
| GLX Protocol |
| |
| BlitFramebufferEXT |
| 2 44 rendering command length |
| 2 4330 rendering command opcode |
| 4 CARD32 source X0 |
| 4 CARD32 source Y0 |
| 4 CARD32 source X1 |
| 4 CARD32 source Y1 |
| 4 CARD32 destination X0 |
| 4 CARD32 destination Y0 |
| 4 CARD32 destination X1 |
| 4 CARD32 destination Y1 |
| 4 CARD32 mask |
| 4 ENUM filter |
| |
| Dependencies on ARB_color_buffer_float |
| |
| The reference to CLAMP_FRAGMENT_COLOR_ARB in section 4.3.3 applies |
| only if ARB_color_buffer_float is supported. |
| |
| Errors |
| |
| The error INVALID_FRAMEBUFFER_OPERATION_EXT is generated if |
| BlitFramebufferEXT, DrawPixels, or CopyPixels is called while the |
| draw framebuffer is not framebuffer complete. |
| |
| The error INVALID_FRAMEBUFFER_OPERATION_EXT is generated if |
| BlitFramebufferEXT, ReadPixels, CopyPixels, CopyTex{Sub}Image*, |
| CopyColor{Sub}Table, or CopyConvolutionFilter* is called while the |
| read framebuffer is not framebuffer complete. |
| |
| The error INVALID_VALUE is generated by BlitFramebufferEXT if |
| <mask> has any bits set other than those named by |
| COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT. |
| |
| The error INVALID_OPERATION is generated if BlitFramebufferEXT is |
| called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT |
| and <filter> is not NEAREST. |
| |
| The error INVALID_OPERATION is generated if BlitFramebufferEXT is |
| called and <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT |
| and the source and destination depth or stencil buffer formats do |
| not match. |
| |
| The error INVALID_ENUM is generated by BlitFramebufferEXT if |
| <filter> is not LINEAR or NEAREST. |
| |
| The error INVALID_OPERATION is generated if BlitFramebufferEXT |
| is called within a Begin/End pair. |
| |
| The error INVALID_ENUM is generated if BindFramebufferEXT, |
| CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, |
| FramebufferRenderbufferEXT, or |
| GetFramebufferAttachmentParameterivEXT is called and <target> is |
| not DRAW_FRAMEBUFFER_EXT, READ_FRAMEBUFFER_EXT or FRAMEBUFFER_EXT. |
| |
| New State |
| |
| (modify table 3.nnn, "Framebuffer (state per framebuffer target binding point)") |
| |
| Get Value Type Get Command Initial Value Description Section Attribute |
| ---------------------------- ---- ----------- -------------- ------------------- ------------ --------- |
| DRAW_FRAMEBUFFER_BINDING_EXT Z+ GetIntegerv 0 framebuffer object bound 4.4.1 - |
| to DRAW_FRAMEBUFFER_EXT |
| READ_FRAMEBUFFER_BINDING_EXT Z+ GetIntegerv 0 framebuffer object 4.4.1 - |
| to READ_FRAMEBUFFER_EXT |
| |
| Remove reference to FRAMEBUFFER_BINDING_EXT. |
| |
| |
| Sample Code |
| |
| /* Render to framebuffer object 2 */ |
| BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 2); |
| RenderScene(); |
| |
| /* Blit contents of color buffer, depth buffer and stencil buffer |
| * from framebuffer object 2 to framebuffer object 1. |
| */ |
| BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 2); |
| BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 1); |
| BlitFramebufferEXT(0, 0, 640, 480, |
| 0, 0, 640, 480, |
| GL_COLOR_BUFFER_BIT | |
| GL_DEPTH_BUFFER_BIT | |
| GL_STENCIL_BUFFER_BIT, |
| GL_NEAREST); |
| |
| /* Blit contents of color buffer from framebuffer object 1 to |
| * framebuffer object 2, inverting the image in the X direction. |
| */ |
| BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 1); |
| BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 2); |
| BlitFramebufferEXT(0, 0, 640, 480, |
| 640, 0, 0, 480, |
| GL_COLOR_BUFFER_BIT, |
| GL_NEAREST); |
| |
| /* Blit color buffer from framebuffer object 1 to framebuffer |
| * object 3 with a 2X zoom and linear filtering. |
| */ |
| BindFramebufferEXT(READ_FRAMEBUFFER_EXT, 1); |
| BindFramebufferEXT(DRAW_FRAMEBUFFER_EXT, 3); |
| BlitFramebufferEXT(0, 0, 640, 480, |
| 0, 0, 1280, 960, |
| GL_COLOR_BUFFER_BIT, GL_LINEAR); |
| |
| |
| Issues |
| |
| 1) Should we pass in explicit source/dest rects instead of using |
| the rasterpos/pixelzoom? |
| |
| Resolved: use explicit rects, so we don't need to perform |
| multiple state changes. |
| |
| 2) Should rects be (start,size) or (start,end)? |
| |
| Resolved: use (start,end). This is a break from the past |
| (scissor, viewport) but is more intuitive than allowing a |
| negative size where mirrored zooms are desireable. |
| |
| 3) What should we call the blit function? |
| |
| Resolved: BlitFramebufferEXT |
| |
| 4) Should filtering apply to depth or stencil values? |
| |
| Resolved: No |
| |
| 5) What happens if LINEAR is specified and DEPTH or STENCIL is in |
| the mask? |
| |
| Resolved: Generate ERROR_INVALID_OPERATION |
| |
| 6) What happens if READ_FRAMEBUFFER is NONE and a read is |
| attempted? |
| |
| Resolved: Generate ERROR_INVALID_OPERATION |
| |
| 7) Should we generalize binding point assignment with a single |
| entry point and a parameter specifying read/write/whatever? |
| |
| Resolved: concensus leans toward separate Read/Draw entry |
| points. |
| |
| 8) Should we define READ_FRAMEBUFFER and DRAW_FRAMEBUFFER targets |
| for BindFramebuffer instead of introducing a new level of |
| indirection? |
| |
| Resolved: Yes. Binding to the legacy target FRAMEBUFFER sets |
| both DRAW_FRAMEBUFFER and READ_FRAMEBUFFER. Querying |
| FRAMEBUFFER_BINDING return the DRAW_FRAMEBUFFER_BINDING. |
| |
| 9) What happens when a user queries framebuffer attributes, |
| e.g. Get(RED_BITS)? Is the result returned from |
| READ_FRAMEBUFFER or DRAW_FRAMEBUFFER? Do we need a new query? |
| e.g. |
| |
| GetFramebufferParameteriv(int target, enum pname, int* value) |
| |
| Resolved: always return the value associated with the |
| DRAW_FRAMEBUFFER. Do not add a new query. |
| |
| 10) How does Accum behave in the presence of separate READ/DRAW |
| framebuffers? |
| |
| Resolved: Accum returns INVALID_OPERATION if the |
| READ_FRAMEBUFFER and DRAW_FRAMEBUFFER bindings are not |
| identical. |
| |
| 11) Should blits be allowed between buffers of different bit sizes? |
| |
| Resolved: Yes, for color buffers only. Attempting to blit |
| between depth or stencil buffers of different size generates |
| INVALID_OPERATION. |
| |
| 12) Should we add support for multiple ReadBuffers, so that |
| multiple color buffers may be copied with a single call to |
| BlitFramebuffer? |
| |
| Resolved: No, we considered this but the behavior is awkward |
| to define and the functionality is of limited use. |
| |
| 13) How should BlitFramebuffer color space conversion be |
| specified? Do we allow context clamp state to affect the |
| blit? |
| |
| Resolved: Blitting to a fixed point buffer always clamps, |
| blitting to a floating point buffer never clamps. The context |
| state is ignored. |
| |
| 14) Should overlapped blits be allowed? Should they be guaranteed |
| to work? |
| |
| Resolved: Overlapping blits are allowed but are undefined. |
| |
| |
| Revision History |
| |
| Revision 15, 2007/4/6 |
| - Removed language left over from ReadBuffers. |
| - Removed reference to nonexistent 'CopyTexImage3D'. |
| Revision 14, 2006/09/29 |
| - Changed the resolution of issue 12 to reflect the working |
| group decision to abandon ReadBuffers. |
| - Eliminated issues 15, 16 and 17 as they are no longer relevent. |
| - Changed the resolution of issue 14 and the corresponding spec |
| language to indicate that the result of an overlapping blit is |
| undefined. |
| - Changed the spec language to clarify that the lower bound of a |
| blit rectangle is inclusive while the upper bound is |
| exclusive. |
| - Added a sample showing an inverted blit, to clarify the pixel |
| addressing rules. |
| - Clarified spec language and error behavior to indicate that |
| blitting DEPTH and STENCIL buffers with LINEAR filtering is |
| always disallowed, whether or not the blit is scaling. |
| Revision 13, 2006/06/01 (Jeff Juliano) |
| - Clarify errors generated when read and draw framebuffers are |
| incomplete. |
| Revision 12, 2005/12/22 (Jon Leech) |
| - Assigned enumerant values. Add return type to BlitFramebufferEXT. |
| Note INVALID_ENUM error if filter is not LINEAR or NEAREST. |
| Revision 11, 2005/12/14 |
| - Added several missing conditions to the Errors section. |
| - Changed status to "Complete". |
| Revision 10, 2005/11/6 |
| - Removed all ReadBuffers discussion, as this functionality will |
| be deferred. Issues 15-17 are hereafter irrelevent. |
| Revision 9, 2005/10/31 |
| - Resolved issue 16 and updated language to reflect this decision. |
| - Minor language changes per feedback. |
| - Added issue 17 and resolution, although language does not reflect this. |
| Revision 8, 2005/10/20 |
| - Added ReadBuffersEXT language |
| - Removed some redundant language in ReadBuffer |
| - Re-opened issue 15 for further consideration |
| - Added issue 16 |
| Revision 7, 2005/10/7 |
| - Added issues 13 and 14, and resolution for 11, 13, and 14. |
| - Added dependency on ARB_color_buffer_float. |
| - Removed multisample language, now covered in EXT_framebuffer_multisample. |
| - Added framebuffer incomplete error language to spec proper. |
| - Alias DRAW_FRAMEBUFFER_BINDING_EXT to FRAMEBUFFER_BINDING_EXT. |
| - Updated Overview text to reflect the resolution to issue 8. |
| Revision 6, 2005/9/26 |
| - Moved issues to the end, per new conventions. |
| - Added new language referring to DRAW_FRAMEBUFFER and |
| READ_FRAMEBUFFER bind points to sections 4.1.1, 4.4.1, |
| 4.4.2.2, 4.4.2.3, 4.4.4.2, 6.1.3 and Errors, and updated the |
| example code, per resolution of issue 8. |
| - Added language in section 4.4.1 specifying Get behavior, per |
| resolution of issue 9. |
| - Added language to section 4.2.4 describing new error behavior |
| for Accum, per resolution of issue 10. |
| - Added language to section 4.3.3 describing color format |
| conversion, per resolution of issue 11. |
| Revision 5, 2005/9/6 |
| - Added issues 8 - 11 |
| - Minor edits from reviewer feedback |
| Revision 4, 2005/9/5 |
| - Added chapter 4 intro section |
| - Added errors and state table information |
| - Added sample code |
| - fixed typos |
| Revision 3, 2005/8/29 |
| - Converted to spec template |
| Revision 2, 2005/7/18 |
| - Lots of new issues added and resolved |
| Revision 1, 2005/7/5 |
| - Initial draft |