| Name |
| |
| APPLE_framebuffer_multisample |
| |
| Name Strings |
| |
| GL_APPLE_framebuffer_multisample |
| |
| Contributors |
| |
| Contributors to EXT_framebuffer_multisample and EXT_framebuffer_blit |
| desktop OpenGL extensions from which this extension borrows heavily. |
| |
| Contacts |
| |
| Benj Lipchak, Apple (lipchak 'at' apple.com) |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Last Modified Date: February 24, 2011 |
| Revision: #4 |
| |
| Number |
| |
| OpenGL ES Extension #78 |
| |
| Dependencies |
| |
| Requires GL_OES_framebuffer_object or OpenGL ES 2.0. |
| |
| Written based on the wording of the OpenGL ES 2.0 specification. |
| |
| OpenGL ES 1.1 affects the definition of this extension. |
| |
| EXT_discard_framebuffer affects the definition of this extension. |
| |
| Overview |
| |
| This extension extends the framebuffer object framework to |
| enable multisample rendering. |
| |
| The new operation RenderbufferStorageMultisampleAPPLE() allocates |
| storage for a renderbuffer object that can be used as a multisample |
| buffer. A multisample render buffer image differs from a |
| single-sample render buffer image in that a multisample image has a |
| number of SAMPLES that is greater than zero. No method is provided |
| for creating multisample texture images. |
| |
| All of the framebuffer-attachable images attached to a framebuffer |
| object must have the same number of SAMPLES or else the framebuffer |
| object is not "framebuffer complete". If a framebuffer object with |
| multisample attachments is "framebuffer complete", then the |
| framebuffer object behaves as if SAMPLE_BUFFERS is one. |
| |
| The resolve operation is affected by calling |
| ResolveMultisampleFramebufferAPPLE where the source is a multisample |
| application-created framebuffer object and the destination is a |
| single-sample framebuffer object. Separate read and draw framebuffer |
| object binding points are established to facilitate the resolve. |
| |
| Scissoring may be used in conjunction with |
| ResolveMultisampleFramebufferAPPLE to resolve only a portion of the |
| framebuffer. |
| |
| IP Status |
| |
| No known IP claims. |
| |
| New Procedures and Functions |
| |
| void RenderbufferStorageMultisampleAPPLE( |
| enum target, sizei samples, |
| enum internalformat, |
| sizei width, sizei height); |
| |
| void ResolveMultisampleFramebufferAPPLE(void); |
| |
| New Tokens |
| |
| Accepted by the <pname> parameter of GetRenderbufferParameteriv: |
| |
| RENDERBUFFER_SAMPLES_APPLE 0x8CAB |
| |
| Returned by CheckFramebufferStatus: |
| |
| FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, and |
| GetFloatv: |
| |
| MAX_SAMPLES_APPLE 0x8D57 |
| |
| Accepted by the <target> parameter of BindFramebuffer, |
| CheckFramebufferStatus, FramebufferTexture2D, FramebufferRenderbuffer, and |
| GetFramebufferAttachmentParameteriv: |
| |
| READ_FRAMEBUFFER_APPLE 0x8CA8 |
| DRAW_FRAMEBUFFER_APPLE 0x8CA9 |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, and |
| GetFloatv: |
| |
| DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 // FRAMEBUFFER_BINDING |
| READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA |
| |
| Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL ES Operation) |
| |
| None |
| |
| Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) |
| |
| None |
| |
| Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment |
| Operations and the Framebuffer) |
| |
| 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_APPLE, the pixel ownership test always passes." |
| |
| Add to 4.3.2 (Reading Pixels), right before the subsection titled |
| "Obtaining Pixels from the Framebuffer": |
| |
| "ReadPixels generates INVALID_FRAMEBUFFER_OPERATION if the object bound to |
| READ_FRAMEBUFFER_APPLE is not framebuffer complete (see section 4.4.5). |
| |
| ReadPixels generates INVALID_OPERATION if the object bound to |
| READ_FRAMEBUFFER_APPLE is framebuffer complete and the value of |
| SAMPLE_BUFFERS for the read framebuffer is greater than zero." |
| |
| Replace the first paragraph of the subsection titled "Obtaining Pixels |
| from the Framebuffer" with the following: |
| |
| "The buffer from which values are obtained is the color buffer used for |
| reading. If READ_FRAMEBUFFER_BINDING_APPLE is non-zero, pixel values are |
| read from the buffer attached as the COLOR_ATTACHMENT0 attachment to the |
| currently bound read framebuffer object." |
| |
| Modify the beginning of section 4.4.1 as follows: |
| |
| "The operations described in chapter 4 affect the images attached to the |
| framebuffer objects bound to targets READ_FRAMEBUFFER_APPLE and |
| DRAW_FRAMEBUFFER_APPLE. By default, the framebuffer bound to these |
| targets is zero, specifying the default implementation-dependent |
| framebuffer provided by the windowing system. When the framebuffers bound |
| to these targets is not zero, but instead names an application-created |
| framebuffer object, then the operations described in chapter 4 affect the |
| application-created framebuffer object rather than the default framebuffer. |
| |
| The namespace for framebuffer objects is the unsigned integers, with zero |
| reserved by OpenGL ES to refer to the default framebuffer. A framebuffer |
| object is created by binding an unused name to DRAW_FRAMEBUFFER_APPLE or |
| READ_FRAMEBUFFER_APPLE. The binding is effected by calling |
| |
| void BindFramebuffer(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. There is one color attachment points, plus |
| one each for the depth and stencil attachment points. |
| |
| BindFramebuffer may also be used to bind an existing framebuffer object to |
| <target>. 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. |
| The current DRAW_FRAMEBUFFER_APPLE and READ_FRAMEBUFFER_APPLE bindings can |
| be queried using GetIntegerv(DRAW_FRAMEBUFFER_BINDING_APPLE) and |
| GetIntegerv(READ_FRAMEBUFFER_BINDING_APPLE), respectively. |
| |
| If a framebuffer object is bound to DRAW_FRAMEBUFFER_APPLE or |
| READ_FRAMEBUFFER_APPLE, it becomes the destination of fragment operations |
| or the source of pixel reads, respectively, until it is deleted or another |
| framebuffer is bound to the corresponding bind point. Calling |
| BindFramebuffer with <target> set to FRAMEBUFFER binds the |
| framebuffer to both DRAW_FRAMEBUFFER_APPLE and READ_FRAMEBUFFER_APPLE. |
| |
| While a framebuffer object is bound, OpenGL ES 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. In particular, queries of the values |
| specified in table 6.20 (Implementation Dependent Pixel Depths) are |
| derived from the framebuffer object bound to DRAW_FRAMEBUFFER_APPLE. |
| |
| In the initial state, the reserved name zero is bound to the targets |
| DRAW_FRAMEBUFFER_APPLE and READ_FRAMEBUFFER_APPLE. There is no application |
| created framebuffer object corresponding to the name zero. Instead, the |
| name zero refers to the window-system-provided framebuffer. All Queries |
| and operations on the framebuffer while the name zero is bound to target |
| DRAW_FRAMEBUFFER_APPLE or READ_FRAMEBUFFER_APPLE operate on this default |
| framebuffer..." |
| |
| Change the description of DeleteFramebuffers 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_APPLE or READ_FRAMEBUFFER_APPLE is deleted, it is as |
| though BindFramebuffer had been executed with the corresponding |
| <target> and <framebuffer> of zero. Unused names in <framebuffers> |
| are silently ignored, as is the value zero." |
| |
| Add to section 4.4.3, just above the definition of RenderbufferStorage: |
| |
| "The command |
| |
| void RenderbufferStorageMultisampleAPPLE( |
| enum target, sizei samples, |
| enum internalformat, |
| sizei width, sizei height); |
| |
| establishes the data storage, format, dimensions, and number of |
| samples of a renderbuffer object's image. <target> must be |
| RENDERBUFFER. <internalformat> must be one of the color-renderable, |
| depth-renderable, or stencil-renderable formats described in table 4.5. |
| <width> and <height> are the dimensions in pixels of the renderbuffer. If |
| either <width> or <height> is greater than the value of |
| MAX_RENDERBUFFER_SIZE, or if <samples> is greater than MAX_SAMPLES_APPLE, |
| then the error INVALID_VALUE is generated. If OpenGL ES is unable to |
| create a data store of the requested size, the error OUT_OF_MEMORY is |
| generated. RenderbufferStorageMultisampleAPPLE deletes any existing |
| data store for the renderbuffer and the contents of the data store after |
| calling RenderbufferStorageMultisampleAPPLE are undefined. |
| |
| If <samples> is zero, then RENDERBUFFER_SAMPLES_APPLE is set to zero. |
| Otherwise <samples> represents a request for a desired minimum |
| number of samples. Since different implementations may support |
| different sample counts for multisampled rendering, the actual |
| number of samples allocated for the renderbuffer image is |
| implementation dependent. However, the resulting value for |
| RENDERBUFFER_SAMPLES_APPLE is guaranteed to be greater than or equal |
| to <samples> and no more than the next larger sample count supported |
| by the implementation. |
| |
| An OpenGL ES implementation may vary its allocation of internal component |
| resolution based on any RenderbufferStorageMultisampleAPPLE parameter |
| (except target), but the allocation and chosen internal format must not be |
| a function of any other state and cannot be changed once they are |
| established. The actual resolution in bits of each component of the |
| allocated image can be queried with GetRenderbufferParameteriv." |
| |
| Modify the definiton of RenderbufferStorage in section 4.4.3 as follows: |
| |
| "The command |
| |
| void RenderbufferStorage( |
| enum target, enum internalformat, |
| sizei width, sizei height); |
| |
| is equivalent to calling RenderbufferStorageMultisampleAPPLE with |
| <samples> equal to zero." |
| |
| In section 4.4.3, modify the first two sentences of the |
| description of FramebufferRenderbuffer as follows: |
| |
| "<target> must be DRAW_FRAMEBUFFER_APPLE, READ_FRAMEBUFFER_APPLE, or |
| FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as |
| though DRAW_FRAMEBUFFER_APPLE were specified. INVALID_OPERATION is |
| generated if the current value of the corresponding binding is zero |
| when FramebufferRenderbuffer is called." |
| |
| In section 4.4.3, modify the first two sentences of the |
| description of FramebufferTexture2D as follows: |
| |
| "The <target> must be DRAW_FRAMEBUFFER_APPLE, READ_FRAMEBUFFER_APPLE, or |
| FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as though |
| DRAW_FRAMEBUFFER_APPLE were specified. INVALID_OPERATION is generated if |
| the current value of the corresponding binding is zero when |
| FramebufferTexture2D is called." |
| |
| In section 4.4.5, add an entry to the Framebuffer Completeness bullet list: |
| |
| "* All attached images have the same number of samples. |
| |
| FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE" |
| |
| In section 4.4.5, modify the first sentence of the description |
| of CheckFramebufferStatus as follows: |
| |
| "If <target> is not DRAW_FRAMEBUFFER_APPLE, READ_FRAMEBUFFER_APPLE, or |
| FRAMEBUFFER, INVALID_ENUM is generated. If <target> is FRAMEBUFFER, it |
| behaves as though DRAW_FRAMEBUFFER_APPLE were specified." |
| |
| Modify the first sentence of the last paragraph of section 4.4.5 as |
| follows: |
| |
| "If the currently bound draw or read framebuffer is not framebuffer |
| complete, then it is an error to attempt to use the framebuffer for |
| writing or reading, respectively." |
| |
| In section 4.4.6, replace references to FRAMEBUFFER_BINDING with |
| DRAW_FRAMEBUFFER_BINDING_APPLE. |
| |
| Add new section titled "Multisample Resolves" to section 4.4: |
| |
| "The command |
| |
| void ResolveMultisampleFramebufferAPPLE(void); |
| |
| converts the samples corresponding to each pixel location in the |
| read framebuffer's color attachment to a single sample before writing |
| them to the draw framebuffer's color attachment. |
| |
| The pixel copy bypasses the fragment pipeline. The only fragment |
| operations which affect the resolve are the pixel ownership test, |
| the scissor test, and dithering. |
| |
| INVALID_OPERATION is generated if SAMPLE_BUFFERS for the read framebuffer |
| is zero, or if SAMPLE_BUFFERS for the draw framebuffer is greater than |
| zero, or if the read framebuffer or draw framebuffer does not have a color |
| attachment, or if the dimensions of the read and draw framebuffers |
| are not identical, or if the components in the format of the draw |
| framebuffer's color attachment are not present in the format of the read |
| framebuffer's color attachment. |
| |
| INVALID_FRAMEBUFFER_OPERATION is generated if the objects bound to |
| DRAW_FRAMEBUFFER_APPLE and READ_FRAMEBUFFER_APPLE are not framebuffer |
| complete (see section 4.4.5)." |
| |
| Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special Functions) |
| |
| None |
| |
| Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State |
| Requests) |
| |
| In section 6.1.3, modify the first sentence of the description of |
| GetFramebufferAttachmentParameteriv as follows: |
| |
| "<target> must be DRAW_FRAMEBUFFER_APPLE, READ_FRAMEBUFFER_APPLE or |
| FRAMEBUFFER. If <target> is FRAMEBUFFER, it behaves as though |
| DRAW_FRAMEBUFFER_APPLE were specified." |
| |
| In section 6.1.3, modify the third paragraph of the description of |
| GetRenderbufferParameteriv as follows: |
| |
| "Upon successful return from GetRenderbufferParameteriv, if |
| <pname> is RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT, |
| RENDERBUFFER_INTERNAL_FORMAT, or RENDERBUFFER_SAMPLES_APPLE, then <params> |
| will contain the width in pixels, height in pixels, internal format, or |
| number of samples, respectively, of the image of the renderbuffer |
| currently bound to <target>." |
| |
| Move SAMPLES and SAMPLE_BUFFERS state to table 6.20. |
| |
| Dependencies on OpenGL ES 1.1 |
| |
| On an OpenGL ES 1.1 implementation, OES_framebuffer_object is required. |
| Include GetFixedv where GetBooleanv, GetIntegerv and GetFloatv appear. |
| Add OES suffixes to entrypoints and tokens introduced by |
| OES_framebuffer_object. |
| |
| Dependencies on EXT_discard_framebuffer |
| |
| In the presence of EXT_discard_framebuffer, DiscardFramebufferEXT is |
| modified to allow READ_FRAMEBUFFER_APPLE and DRAW_FRAMEBUFFER_APPLE |
| as acceptable targets. If <target> is FRAMEBUFFER, DiscardFramebufferEXT |
| behaves as though DRAW_FRAMEBUFFER_APPLE were specified. |
| |
| Errors |
| |
| INVALID_FRAMEBUFFER_OPERATION is generated if DrawArrays, DrawElements, or |
| ResolveMultisampleFramebufferAPPLE is called while the draw framebuffer is |
| not framebuffer complete. |
| |
| INVALID_FRAMEBUFFER_OPERATION is generated if ReadPixels, |
| CopyTex{Sub}Image*, or ResolveMultisampleFramebufferAPPLE is called while |
| the read framebuffer is not framebuffer complete. |
| |
| INVALID_OPERATION is generated if ReadPixels, or CopyTex{Sub}Image* is |
| called while READ_FRAMEBUFFER_BINDING_APPLE is non-zero, the read |
| framebuffer is framebuffer complete, and the value of SAMPLE_BUFFERS for |
| the read framebuffer is greater than zero. |
| |
| INVALID_OPERATION is generated by ResolveMultisampleFramebufferAPPLE if |
| SAMPLE_BUFFERS for the read framebuffer is zero, or if SAMPLE_BUFFERS for |
| the draw framebuffer is greater than zero, or if the read framebuffer or |
| draw framebuffer does not have a color attachment, or if the dimensions of |
| the read and draw framebuffers are not identical, or if the components in |
| the format of the draw framebuffer's color attachment are not present in |
| the format of the read framebuffer's color attachment. |
| |
| OUT_OF_MEMORY is generated when RenderbufferStorageMultisampleAPPLE cannot |
| create storage of the specified size. |
| |
| INVALID_VALUE is generated if RenderbufferStorageMultisampleAPPLE is |
| called with a value of <samples> that is greater than MAX_SAMPLES_APPLE |
| or with a value of <width> or <height> that is greater than |
| MAX_RENDERBUFFER_SIZE. |
| |
| New State |
| |
| Add to table 6.19 (Implementation Dependent Values (cont.)): |
| |
| Get Value Type Get Command Minimum Value Description Section |
| --------- ---- ----------- ------------- ------------------- ------- |
| MAX_SAMPLES_APPLE Z+ GetIntegerv 1 Maximum number of 4.4.3 |
| samples supported |
| for multisampling |
| |
| Add to table 6.22 (Renderbuffer State): |
| |
| Get Value Type Get Command Initial Value Description Section |
| -------------------------- ---- -------------------------- ------------- -------------------- ------- |
| RENDERBUFFER_SAMPLES_APPLE Z+ GetRenderbufferParameteriv 0 Renderbuffer samples 4.4.3 |
| |
| |
| Remove reference to FRAMEBUFFER_BINDING from Table 6.23 (Framebuffer State) |
| and replace with the following: |
| |
| Get Value Type Get Command Initial Value Description Section |
| ------------------------------ ---- ----------- ------------- ------------------------- ------- |
| DRAW_FRAMEBUFFER_BINDING_APPLE Z+ GetIntegerv 0 Framebuffer object bound 4.4.1 |
| to DRAW_FRAMEBUFFER_APPLE |
| READ_FRAMEBUFFER_BINDING_APPLE Z+ GetIntegerv 0 Framebuffer object 4.4.1 |
| to READ_FRAMEBUFFER_APPLE |
| |
| |
| |
| Revision History |
| |
| #4, February 24, 2011: Benj Lipchak |
| - assign extension number |
| - clarify that dithering is still performed during resolve |
| - clarify that only format conversions that drop components are allowed |
| during resolve |
| #3, January 5, 2010: Benj Lipchak |
| - remove the error when read and draw color formats are not identical |
| - add an error when missing a color attachment to the read or draw FBO |
| #2, October 29, 2009: Benj Lipchak |
| - add interaction with EXT_discard_framebuffer |
| - mention that scissoring can be used for partial resolves |
| #1, October 28, 2009: Benj Lipchak |
| - first revision |