| Name | |
| NV_framebuffer_multisample | |
| Name Strings | |
| GL_NV_framebuffer_multisample | |
| Contributors | |
| Contributors to EXT_framebuffer_multisample | |
| Contributors from ANGLE_framebuffer_multisample | |
| Gregory Roth, NVIDIA | |
| Mathias Heyer, NVIDIA | |
| Xi Chen, NVIDIA | |
| Contacts | |
| Mathias Heyer, NVIDIA (mheyer 'at' nvidia 'dot' com) | |
| Status | |
| Complete | |
| Version | |
| Last Modified Date: March 03, 2015 | |
| Author Revision: #5 | |
| Number | |
| OpenGL ES Extension #143 | |
| Dependencies | |
| Requires OpenGL ES 2.0. | |
| Requires GL_NV_framebuffer_blit. | |
| The extension is written against the OpenGL ES 2.0.25 | |
| (November 2, 2010) specification. | |
| OES_texture_3D affects the definition of this extension. | |
| NV_texture_array affects the definition of this extension. | |
| This extension interacts with OpenGL ES 3.0 and later versions. | |
| Overview | |
| This extension extends the framebuffer object framework to | |
| enable multisample rendering. | |
| The new operation RenderbufferStorageMultisampleNV() 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. | |
| A resolve operation is executed by calling | |
| BlitFramebufferNV (provided by the NV_framebuffer_blit | |
| extension) where the source is a multisample framebuffer object | |
| and the destination is a single-sample framebuffer object. | |
| Source and destination framebuffer may be either application-created | |
| or window-system provided. | |
| New Procedures and Functions | |
| void RenderbufferStorageMultisampleNV( | |
| enum target, sizei samples, | |
| enum internalformat, | |
| sizei width, sizei height); | |
| New Tokens | |
| Accepted by the <pname> parameter of GetRenderbufferParameteriv: | |
| RENDERBUFFER_SAMPLES_NV 0x8CAB | |
| Returned by CheckFramebufferStatus: | |
| FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 | |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, | |
| and GetFloatv: | |
| MAX_SAMPLES_NV 0x8D57 | |
| Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) | |
| Add to the last paragraph of 3.7.2 (Alternate Texture Image Specification) | |
| (as modified by NV_framebuffer_blit) the following: | |
| "Calling CopyTexSubImage3DOES, CopyTexSubImage3DNV, | |
| CopyTexImage2D or CopyTexSubImage2D will result in INVALID_OPERATION | |
| being generated if the object bound to READ_FRAMEBUFFER_BINDING_NV | |
| is "framebuffer complete" and the value of SAMPLE_BUFFERS is greater | |
| than zero." | |
| Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment | |
| Operations and the Framebuffer) | |
| Add to 4.3.1 (Reading Pixels), right before the subsection titled | |
| "Obtaining Pixels from the Framebuffer": | |
| "ReadPixels generates INVALID_OPERATION if READ_FRAMEBUFFER_BINDING_NV | |
| (section 4.4) is non-zero, the read framebuffer is framebuffer | |
| complete, and the value of SAMPLE_BUFFERS for the read framebuffer | |
| is greater than zero." | |
| In 4.3.2 (Copying Pixels), add to the section describing BlitFramebufferNV | |
| that was added by NV_framebuffer_blit. | |
| "If SAMPLE_BUFFERS for the read framebuffer is greater than zero and | |
| SAMPLE_BUFFERS for the draw framebuffer is zero, the samples | |
| corresponding to each pixel location in the source are converted to | |
| a single sample before being written to the destination. | |
| If SAMPLE_BUFFERS for the read framebuffer is zero and | |
| SAMPLE_BUFFERS for the draw framebuffer is greater than zero, the | |
| value of the source sample is replicated in each of the destination | |
| samples. | |
| If SAMPLE_BUFFERS for both the read and draw framebuffers are | |
| greater than zero, and the values of SAMPLES for the read and draw | |
| framebuffers are identical, the samples are copied without | |
| modification from the read framebuffer to the draw framebuffer. | |
| Otherwise, no copy is performed and an INVALID_OPERATION error is | |
| generated. | |
| If SAMPLE_BUFFERS for the read framebuffer is greater than zero and | |
| the format of the read and draw framebuffers are not identical, no | |
| copy is performed and an INVALID_OPERATION error is generated. | |
| Furthermore, if SAMPLE_BUFFERS for either the read framebuffer or | |
| draw framebuffer is greater than zero, no copy is performed and an | |
| INVALID_OPERATION error is generated if the dimensions of the source | |
| and destination rectangles provided to BlitFramebufferNV are not | |
| identical, or if the formats of the read and draw framebuffers are | |
| not identical. | |
| Modification to 4.4.3 (Renderbuffer Objects) | |
| Add, just above the definition of RenderbufferStorage: | |
| "The command | |
| void RenderbufferStorageMultisampleNV( | |
| 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_NV, | |
| 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. | |
| Upon success, RenderbufferStorageMultisampleNV deletes any existing | |
| data store for the renderbuffer image and the contents of the data | |
| store after calling RenderbufferStorageMultisampleNV are undefined. | |
| RENDERBUFFER_WIDTH is set to <width>, RENDERBUFFER_HEIGHT is | |
| set to <height>, and RENDERBUFFER_INTERNAL_FORMAT is set to | |
| <internalformat>. | |
| If <samples> is zero, then RENDERBUFFER_SAMPLES_NV 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_NV 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 RenderbufferStorageMultisampleNV 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 as follows: | |
| "The command | |
| void RenderbufferStorage(enum target, enum internalformat, | |
| sizei width, sizei height); | |
| is equivalent to calling RenderbufferStorageMultisampleNV with | |
| <samples> equal to zero." | |
| In section 4.4.5 (Framebuffer Completeness) in the subsection | |
| titled "Framebuffer Completeness" add an entry to the bullet list: | |
| * The value of RENDERBUFFER_SAMPLES_NV is the same for all attached | |
| images. | |
| { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV } | |
| Also add a paragraph to the end of the section after the definition | |
| of CheckFramebufferStatus: | |
| "The values of SAMPLE_BUFFERS and SAMPLES are derived from the | |
| attachments of the currently bound framebuffer object. If the | |
| current DRAW_FRAMEBUFFER_BINDING_NV is not "framebuffer complete", | |
| then both SAMPLE_BUFFERS and SAMPLES are undefined. Otherwise, | |
| SAMPLES is equal to the value of RENDERBUFFER_SAMPLES_NV for the | |
| attached images (which all must have the same value for | |
| RENDERBUFFER_SAMPLES_NV). Further, SAMPLE_BUFFERS is one if | |
| SAMPLES is non-zero. Otherwise, SAMPLE_BUFFERS is zero. | |
| Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State | |
| Requests) | |
| In section 6.1.3 (Enumeraged Queries), 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_NV, 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>." | |
| Dependencies on OpenGL ES 3.0 and later | |
| If OpenGL ES 3.0 or later is supported, the described modifications to | |
| language for BlitFramebufferNV also apply to BlitFramebuffer: | |
| (Add to the end of the section describing BlitFramebuffer) | |
| "If SAMPLE_BUFFERS for the read framebuffer is zero and | |
| SAMPLE_BUFFERS for the draw framebuffer is greater than zero, the | |
| value of the source sample is replicated in each of the destination | |
| samples. | |
| If SAMPLE_BUFFERS for both the read and draw framebuffers are | |
| greater than zero, and the values of SAMPLES for the read and draw | |
| framebuffers are identical, the samples are copied without | |
| modification from the read framebuffer to the draw framebuffer. | |
| Otherwise, no copy is performed and an INVALID_OPERATION error is | |
| generated." | |
| (In the error list for BlitFramebuffer, modify the item "An | |
| INVALID_OPERATION error is generated if the draw framebuffer is | |
| multisampled.") | |
| * An INVALID_OPERATION error is generated if both the read and | |
| draw buffers are multisampled, and SAMPLE_BUFFERS for the read and | |
| draw buffers are not identical. | |
| (In the error list for BlitFramebuffer, add to the list) | |
| * An INVALID_OPERATION error is generated if either the read or draw | |
| buffer is multisampled, and the formats of the read and draw | |
| framebuffers are not identical. | |
| Dependencies on NV_framebuffer_blit | |
| NV_framebuffer_blit is required. Technically, NV_framebuffer_blit | |
| would not be required to support multisampled rendering, except for | |
| the fact that it provides the only method of doing a multisample | |
| resovle from a multisample renderbuffer. | |
| Dependencies on OES_texture_3D and NV_texture_array | |
| On an OpenGL ES implementation, in the absense of OES_texture_3D or | |
| NV_texture_array, omit references to CopyTexSubImage3DOES and | |
| CopyTexSubImage3DNV, respectively. | |
| Errors | |
| The error INVALID_OPERATION is generated if ReadPixels or | |
| CopyTex{Sub}Image* is called while READ_FRAMEBUFFER_BINDING_NV | |
| is non-zero, the read framebuffer is framebuffer complete, and the | |
| value of SAMPLE_BUFFERS for the read framebuffer is greater than | |
| zero. | |
| If both the draw and read framebuffers are framebuffer complete and | |
| both have a value of SAMPLE_BUFFERS that is greater than zero, then | |
| the error INVALID_OPERATION is generated if BlitFramebufferNV is | |
| called and the values of SAMPLES for the draw and read framebuffers | |
| do not match. | |
| If both the draw and read framebuffers are framebuffer complete and | |
| either has a value of SAMPLE_BUFFERS that is greater than zero, then | |
| the error INVALID_OPERATION is generated if BlitFramebufferNV is | |
| called and the formats of the draw and read framebuffers are not | |
| identical. | |
| If either the draw or read framebuffer is framebuffer complete and | |
| has a value of SAMPLE_BUFFERS that is greater than zero, then the | |
| error INVALID_OPERATION is generated if BlitFramebufferNV is called | |
| and the specified source and destination dimensions are not | |
| identical. | |
| If RenderbufferStorageMultisampleNV is called with <target> not | |
| equal to RENDERBUFFER, the error INVALID_ENUM is generated. | |
| If RenderbufferStorageMultisampleNV is called with an | |
| <internalformat> that is not listed as one of the color-, depth- | |
| or stencil-renderable formats in Table 4.5, then the error | |
| INVALID_ENUM is generated. | |
| If RenderbufferStorageMultisampleNV is called with <width> or | |
| <height> greater than MAX_RENDERBUFFER_SIZE, then the error | |
| INVALID_VALUE is generated. | |
| If RenderbufferStorageMultisampleNV is called with a value of | |
| <samples> that is greater than MAX_SAMPLES_NV or less than zero, | |
| then the error INVALID_VALUE is generated. | |
| The error OUT_OF_MEMORY is generated when | |
| RenderbufferStorageMultisampleNV cannot create storage of the | |
| specified size. | |
| New State | |
| Add to table 6.23 (Renderbuffer State) | |
| Get Value Type Get Command Initial Value Description Section | |
| ------------------------------- ------ -------------------------- ------------- -------------------- ------- | |
| RENDERBUFFER_SAMPLES_NV Z+ GetRenderbufferParameteriv 0 number of samples 4.4.3 | |
| Add to table 6.21 (Framebuffer Dependent Values) | |
| the following new framebuffer dependent state. | |
| Get Value Type Get Command Minimum Value Description Section | |
| ----------------- ---- ----------- ------------- ------------------- ------- | |
| MAX_SAMPLES_NV Z+ GetIntegerv 1 Maximum number of 4.4.3 | |
| samples supported | |
| for multisampling | |
| Issues | |
| Issues from EXT_framebuffer_multisample have been removed. | |
| 1) How is this extension different from Halti and ARB_framebuffer_object ? | |
| - this extension offers the same MSAA functionality as in | |
| ARB_framebuffer_object | |
| - it is a superset of Halti in that: | |
| a) SINGLE-->MSAA and MSAA-->MSAA blits are possible | |
| b) the blit region may be relocated during the blit | |
| Revision History | |
| Revision 5, 2015/03/03 | |
| - add interaction with OpenGL ES 3.0 and later | |
| Revision 4, 2012/08/31 | |
| - add interaction with NV_texture_array | |
| Revision 3, 2012/08/29 | |
| - consolidate contributors list | |
| - be more explicit about the specification version the text is written against | |
| Revision 2, 2012/08/15 | |
| - explicitly state that resolve blits from the window system provided framebuffer | |
| are possible | |
| - fix references to table 6.21 and table 6.23 | |
| Revision 1, 2012/05/15 | |
| - copied from revision 3 of ANGLE_framebuffer_multisample | |
| - re-inserted missing functionality of EXT_framebuffer_blit | |