| Name | |
| EXT_discard_framebuffer | |
| Name Strings | |
| GL_EXT_discard_framebuffer | |
| Contributors | |
| Benji Bowman, Imagination Technologies | |
| John Rosasco, Apple | |
| Richard Schreyer, Apple | |
| Stuart Smith, Imagination Technologies | |
| Michael Swift, Apple | |
| Contacts | |
| Benj Lipchak, Apple (lipchak 'at' apple.com) | |
| Status | |
| Complete | |
| Version | |
| Last Modified Date: September 15, 2009 | |
| Revision: #7 | |
| Number | |
| OpenGL ES Extension #64 | |
| Dependencies | |
| OpenGL ES 1.0 is required. | |
| Written based on the wording of the OpenGL ES 2.0 specification. | |
| Requires OES_framebuffer_object or OpenGL ES 2.0. | |
| Overview | |
| This extension provides a new command, DiscardFramebufferEXT, which | |
| causes the contents of the named framebuffer attachable images to become | |
| undefined. The contents of the specified buffers are undefined until a | |
| subsequent operation modifies the content, and only the modified region | |
| is guaranteed to hold valid content. Effective usage of this command | |
| may provide an implementation with new optimization opportunities. | |
| Some OpenGL ES implementations cache framebuffer images in a small pool | |
| of fast memory. Before rendering, these implementations must load the | |
| existing contents of one or more of the logical buffers (color, depth, | |
| stencil, etc.) into this memory. After rendering, some or all of these | |
| buffers are likewise stored back to external memory so their contents can | |
| be used again in the future. In many applications, some or all of the | |
| logical buffers are cleared at the start of rendering. If so, the | |
| effort to load or store those buffers is wasted. | |
| Even without this extension, if a frame of rendering begins with a full- | |
| screen Clear, an OpenGL ES implementation may optimize away the loading | |
| of framebuffer contents prior to rendering the frame. With this extension, | |
| an application can use DiscardFramebufferEXT to signal that framebuffer | |
| contents will no longer be needed. In this case an OpenGL ES | |
| implementation may also optimize away the storing back of framebuffer | |
| contents after rendering the frame. | |
| Issues | |
| 1) Should DiscardFramebufferEXT's argument be a list of COLOR_ATTACHMENTx | |
| enums, or should it use the same bitfield from Clear and BlitFramebuffer? | |
| RESOLVED: We'll use a sized list of framebuffer attachments. This | |
| will give us some future-proofing for when MRTs and multisampled | |
| FBOs are supported. | |
| 2) What happens if the app discards only one of the depth and stencil | |
| attachments, but those are backed by the same packed_depth_stencil buffer? | |
| a) Generate an error | |
| b) Both images become undefined | |
| c) Neither image becomes undefined | |
| d) Only one of the images becomes undefined | |
| RESOLVED: (b) which sort of falls out of Issue 4. | |
| 3) How should DiscardFramebufferEXT interact with the default framebuffer? | |
| a) Generate an error | |
| b) Ignore the hint silently | |
| c) The contents of the specified attachments become undefined | |
| RESOLVED: (c), with appropriate wording to map FBO attachments to | |
| the corresponding default framebuffer's logical buffers | |
| 4) What happens when you discard an attachment that doesn't exist? This is | |
| the case where a framebuffer is complete but doesn't have, for example, a | |
| stencil attachment, yet the app tries to discard the stencil attachment. | |
| a) Generate an error | |
| b) Ignore the hint silently | |
| RESOLVED: (b) for two reasons. First, this is just a hint anyway, and | |
| if we required error detection, then suddenly an implementation can't | |
| trivially ignore it. Second, this is consistent with Clear, which | |
| ignores specified buffers that aren't present. | |
| New Procedures and Functions | |
| void DiscardFramebufferEXT(enum target, | |
| sizei numAttachments, | |
| const enum *attachments); | |
| New Tokens | |
| Accepted in the <attachments> parameter of DiscardFramebufferEXT when the | |
| default framebuffer is bound to <target>: | |
| COLOR_EXT 0x1800 | |
| DEPTH_EXT 0x1801 | |
| STENCIL_EXT 0x1802 | |
| Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment | |
| Operations and the Framebuffer) | |
| Introduce new section 4.5: | |
| "4.5 Discarding Framebuffer Contents | |
| The GL provides a means for discarding portions of every pixel in a | |
| particular buffer, effectively leaving its contents undefined. The | |
| command | |
| void DiscardFramebufferEXT(enum target, | |
| sizei numAttachments, | |
| const enum *attachments); | |
| effectively signals to the GL that it need not preserve all contents of | |
| a bound framebuffer object. <numAttachments> indicates how many | |
| attachments are supplied in the <attachments> list. If an attachment is | |
| specified that does not exist in the framebuffer bound to <target>, it is | |
| ignored. <target> must be FRAMEBUFFER. | |
| If a framebuffer object is bound to <target>, then <attachments> may | |
| contain COLOR_ATTACHMENT0, DEPTH_ATTACHMENT, and/or STENCIL_ATTACHMENT. If | |
| the framebuffer object is not complete, DiscardFramebufferEXT may be | |
| ignored. | |
| If the default framebuffer is bound to <target>, then <attachment> may | |
| contain COLOR, identifying the color buffer; DEPTH, identifying the depth | |
| buffer; or STENCIL, identifying the stencil buffer." | |
| Errors | |
| The error INVALID_ENUM is generated if DiscardFramebufferEXT is called | |
| with a <target> that is not FRAMEBUFFER. | |
| The error INVALID_ENUM is generated if DiscardFramebufferEXT is called with | |
| a token other than COLOR_ATTACHMENT0, DEPTH_ATTACHMENT, or | |
| STENCIL_ATTACHMENT in its <attachments> list when a framebuffer object is | |
| bound to <target>. | |
| The error INVALID_ENUM is generated if DiscardFramebufferEXT is called with | |
| a token other than COLOR_EXT, DEPTH_EXT, or STENCIL_EXT in its | |
| <attachments> list when the default framebuffer is bound to <target>. | |
| The error INVALID_VALUE is generated if DiscardFramebufferEXT is called | |
| with <numAttachments> less than zero. | |
| Revision History | |
| 09/15/2009 Benj Lipchak | |
| Make attachments argument const enum*. | |
| 09/07/2009 Benj Lipchak | |
| Minor clarification to overview text. | |
| 08/18/2009 Benj Lipchak | |
| Replace null-terminated list with sized list, loosen error checking, | |
| and use separate attachment tokens for default framebuffers. | |
| 07/15/2009 Benj Lipchak | |
| Minor changes to overview, change GLenum to enum, whitespace fixes. | |
| 07/14/2009 Benj Lipchak | |
| Rename entrypoint to DiscardFramebufferEXT to follow verb/object naming | |
| style, and rename entire extension to match. Replace bitfield with | |
| null-terminated attachment list. Add actual spec diffs. Update | |
| overview, issues list, and errors. | |
| 04/30/2009 Richard Schreyer | |
| General revision, removed the combined resolve-and-discard feature. | |
| 04/30/2008 Michael Swift | |
| First draft of extension. | |
| TODO: | |
| - provide examples of intended usage |