blob: f5fcbe19b52406ff88689bb73e4bdfc29e3ca61f [file] [log] [blame]
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