blob: 1a58654b2895dc79b8e993661bf2e401295f5997 [file] [log] [blame]
Name
NV_framebuffer_multisample_coverage
Name Strings
GL_NV_framebuffer_multisample_coverage
Contact
Mike Strauss, NVIDIA Corporation (mstrauss 'at' nvidia.com)
Status
Shipping in NVIDIA Release 95 drivers (November 2006)
Functionality supported by GeForce 8800
Version
Last Modified Date: May 31, 2008
Revision #9
Number
336
Dependencies
Requires GL_EXT_framebuffer_object.
Requires GL_EXT_framebuffer_blit.
Requires GL_EXT_framebuffer_multisample.
Written based on the wording of the OpenGL 1.5 specification.
Overview
This extension extends the EXT_framebuffer_multisample
specification by providing a new function,
RenderBufferStorageMultisampleCoverageNV, that distinguishes
between color samples and coverage samples.
EXT_framebuffer_multisample introduced the function
RenderbufferStorageMultisampleEXT as a method of defining the
storage parameters for a multisample render buffer. This function
takes a <samples> parameter. Using rules provided by the
specification, the <samples> parameter is resolved to an actual
number of samples that is supported by the underlying hardware.
EXT_framebuffer_multisample does not specify whether <samples>
refers to coverage samples or color samples.
This extension adds the function
RenderbufferStorageMultisamplCoverageNV, which takes a
<coverageSamples> parameter as well as a <colorSamples> parameter.
These two parameters give developers more fine grained control over
the quality of multisampled images.
IP Status
No known IP issues.
New Procedures and Functions
void RenderbufferStorageMultisampleCoverageNV(
enum target, sizei coverageSamples,
sizei colorSamples, enum internalformat,
sizei width, sizei height);
New Tokens
Accepted by the <pname> parameter of GetRenderbufferParameterivEXT:
RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB
RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10
Accepted by the <pname> parameter of GetIntegerv:
MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11
MULTISAMPLE_COVERAGE_MODES_NV 0x8E12
Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)
None.
Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)
None.
Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)
Modification to 4.4.2.1 (Renderbuffer Objects)
Add, just above the definition of RenderbufferStorageMultisampleEXT:
"The command
void RenderbufferStorageMultisampleCoverageNV(
enum target, sizei coverageSamples,
sizei colorSamples, enum internalformat,
sizei width, sizei height);
establishes the data storage, format, dimensions, number of coverage
samples, and number of color samples of a renderbuffer object's
image. <target> must be RENDERBUFFER_EXT. <internalformat> must be
RGB, RGBA, DEPTH_COMPONENT, STENCIL_INDEX, or one of the internal
formats from table 3.16 or table 2.nnn that has a base internal
format of RGB, RGBA, DEPTH_COMPONENT, or STENCIL_INDEX. <width>
and <height> are the dimensions in pixels of the renderbuffer. If
either <width> or <height> is greater than
MAX_RENDERBUFFER_SIZE_EXT, the error INVALID_VALUE is generated. If
the GL is unable to create a data store of the requested size, the
error OUT_OF_MEMORY is generated.
Upon success, RenderbufferStorageMultisampleCoverageNV deletes any
existing data store for the renderbuffer image and the contents of
the data store after calling
RenderbufferStorageMultisampleCoverageNV are undefined.
RENDERBUFFER_WIDTH_EXT is set to <width>, RENDERBUFFER_HEIGHT_EXT
is set to <height>, and RENDERBUFFER_INTERNAL_FORMAT_EXT is set to
<internalformat>.
If <coverageSamples> is zero, then RENDERBUFFER_COVERAGE_SAMPLES_NV
is set to zero. Otherwise <coverageSamples> represents a request
for a desired minimum number of coverage samples. Since different
implementations may support different coverage sample counts for
multisampled rendering, the actual number of coverage samples
allocated for the renderbuffer image is implementation dependent.
However, the resulting value for RENDERBUFFER_COVERAGE_SAMPLES_NV is
guaranteed to be greater than or equal to <coverageSamples> and no
more than the next larger coverage sample count supported by the
implementation.
If <colorSamples> is zero then RENDERBUFFER_COLOR_SAMPLES_NV is set
to zero. Otherwise, <colorSamples> represents a request for a
desired minimum number of colors samples. Since different
implementations may support different color sample counts for
multisampled rendering, the actual number of color samples
allocated for the renderbuffer image is implementation dependent.
Furthermore, a given implementation may support different color
sample counts for each supported coverage sample count. The
resulting value for RENDERBUFFER_COLOR_SAMPLES_NV is determined
after resolving the value for RENDERBUFFER_COVERAGE_SAMPLES_NV.
If the requested color sample count exceeds the maximum number of
color samples supported by the implementation given the value of
RENDERBUFFER_COVERAGE_SAMPLES_NV, the implementation will set
RENDERBUFFER_COLOR_SAMPLES_NV to the highest supported value.
Otherwise, the resulting value for RENDERBUFFER_COLOR_SAMPLES_NV is
guaranteed to be greater than or equal to <colorSamples> and no
more than the next larger color sample count supported by the
implementation given the value of RENDERBUFFER_COVERAGE_SAMPLES_NV.
If <colorSamples> is greater than <coverageSamples>, the error
INVALID_VALUE is generated.
If <coverageSamples> or <colorSamples> is greater than
MAX_SAMPLES_EXT, the error INVALID_VALUE is generated.
If <coverageSamples> is greater than zero, and <colorSamples> is
zero, RENDERBUFFER_COLOR_SAMPLES_NV is set to an implementation
dependent value based on RENDERBUFFER_COVERAGE_SAMPLES_NV.
An implementation may only support a subset of the possible
combinations of coverage samples and color samples. Requests for
combinations not supported by the implementation are resolved to
a supported combination using the rules above. The number of
supported combinations is MAX_MULTISAMPLE_COVERAGE_MODES_NV.
MULTISAMPLE_COVERAGE_MODES_NV is an array of
MAX_MULTISAMPLE_COVERAGE_MODES_NV pairs of integers representing
the combinations of coverage samples and color samples supported
by the implementation. The first integer in each pair corresponds
to coverage samples, while the second corresponds to color samples.
Modify the definition of RenderbufferStorageMultisampleEXT as
follows:
"The command
void RenderbufferStorageMultisampleEXT(
enum target, sizei samples,
enum internalformat,
sizei width, sizei height);
is equivalent to calling
RenderbufferStorageMultisampleCoverageNV(target, samples, 0,
internalforamt, width, height).
Modification to 4.4.4.2 (Framebuffer Completeness)
Modify the RENDERBUFFER_SAMPLES_EXT entry in the bullet list:
* The value of RENDERBUFFER_COVERAGE_SAMPLES_NV is the same for all
attached images.
{ FRAMEBUFFER_INCOMPLETE_MULTISAMPLE }
Add an entry to the bullet list:
* The value of RENDERBUFFER_COLOR_SAMPLES_NV is the same for all
attached images.
{ FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT }
Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)
None.
Additions to Chapter 6 of the OpenGL 2.0 Specification (State and
State Requests)
None.
Additions to Appendix A of the OpenGL 2.0 Specification (Invariance)
None.
Errors
The error INVALID_OPERATION is generated if
RenderbufferStorageMultisampleCoverageNV is called and
<colorSamples> is greater than <coverageSamples>
The error INVALID_VALUE is generated if
RenderbufferStorageMultisampleCoverageNV is called and
<coverageSamples> is greater than MAX_SAMPLES_EXT.
The error INVALID_VALUE is generated if
RenderbufferStorageMultisampleCoverageNV is called and
<colorSamples> is greater than MAX_SAMPLES_EXT.
New State
(add to table 8.nnn, "Renderbuffers (state per renderbuffer object)")
Initial
Get Value Type Get Command Value Description Section Attribute
-------------------------------- ---- ----------------------------- ------- ------------------- ------------ ---------
RENDERBUFFER_COVERAGE_SAMPLES_NV Z+ GetRenderbufferParameterivEXT 0 Number of coverage 4.4.2.1 -
samples used by the
renderbuffer
RENDERBUFFER_COLOR_SAMPLES_NV Z+ GetRenderbufferParameterivEXT 0 Number of color 4.4.2.1 -
samples used by the
renderbuffer
(modify RENDERBUFFER_SAMPLES_EXT entry in table 8.nnn)
Initial
Get Value Type Get Command Value Description Section Attribute
------------------------ ---- ----------------------------- ------ ------------------- ------------ ---------
RENDERBUFFER_SAMPLES_EXT Z+ GetRenderbufferParameterivEXT 0 Alias for 4.4.2.1 -
RENDERBUFFER_-
COVERAGE_SAMPLES_NV
New Implementation Dependent State
Minimum
Get Value Type Get Command Value Description Section Attribute
--------------------------------- --------- ----------- ------- ------------------------------------ ------- ---------
MAX_MULTISAMPLE_COVERAGE_MODES_NV Z+ GetIntegerv 0 Number of unique combinations of 4.4.2.1 -
<coverageSamples> and <colorSamples>
supported by the implementation.
MULTISAMPLE_COVERAGE_MODES_NV n * 2 x Z+ GetIntegerv - MAX_MULTISAMPLE_COVERAGE_MODES_NV (n) 4.4.2.1 -
pairs of integers. Each pair is
a unique combination of
<coverageSamples> and <colorSamples>
supported by the implementation.
Issues
(1) How should RenderbufferStorageMultisampleEXT be layered on top
of RenderbufferStorageMultisampleCoverageNV?
RESOLVED. NVIDIA will expose this extension at the same time
that EXT_framebuffer_multisample is exposed, so there will not
be any issues with backward compatibility. However, some
developers choose not to use vendor specific extensions. These
developers should be able to make use of current and future
hardware that differentiates between color and coverage
samples. Since color samples are a subset of coverage samples,
the <samples> parameter to RenderbufferStorageMultisampleEXT
should be treated as a request for coverage samples. The
implementation is free to choose the number of color samples
used by the renderbuffer.
(2) <coverageSamples> is rounded up to the next highest
number of samples supported by the implementation. How
should <colorSamples> be rounded given that an implementation
may not support all combinations of <coverageSamples> and
<colorSamples>?
RESOLVED: It is a requirement that <coverageSamples> be
compatible with the <samples> parameter to
RenderbufferStorageMultisampleEXT. While it is desirable for
<colorSamples> to resolve the same way as <coverageSamples>,
this may not always be possible. An implementation may support
a different maximum number of color samples for each coverage
sample count. It would be confusing to set an error when
<colorSamples> exceeds the maximum supported number of color
samples for a given coverage sample count, because there
is no mechanism to query or predict this behavior. Therefore,
the implementation should round <colorSamples> down when it
exceeds the maximum number of color samples supported with the
given coverage sample count. Otherwise, <colorSamples> is
rounded up to the next highest number of color samples
supported by the implementation.
(3) EXT_framebuffer_multisample provides a way to query the maximum
number of samples supported by an implementation. Should a new
query mechanism be added so that an application can determine
the maximum number of color samples supported with a given
number of coverage samples?
RESOLVED: Yes. An application can use GetIntegerv to query
MAX_MULTISAMPLE_COVERAGE_MODES_NV. The result is the number of
unique combinations of <coverageSamples> and <colorSamples> that
are supported by the implementation. GetIntegerv can be used
with MULTISAMPLE_COVERAGE_MODES_NV to query these combinations.
The integer array is populated with
MAX_MULTISAMPLE_COVERAGE_MODES_NV pairs of integers, where each
pair describes a unique multisample coverage mode. The first
integer in each pair is the number of coverage samples and the
second integer is the number of color samples. An example is
below:
// Get the number of unique multisample coverage modes
glGetIntegerv(GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV, &numModes);
// Allocate enough memory to store the array of modes
GLint *modes = (GLint*)malloc(2*numModes*sizeof(GLint));
// Get the list of modes
glGetIntegerv(GL_MULTISAMPLE_COVERAGE_MODES_NV, modes);
// Print out all of the modes
for (i = 0; i < numModes; i++) {
printf("%d coverage samples, %d color samples\n",
modes[i*2+0], // coverage samples for mode i
modes[i*2+1]); // color samples for mode i
}
Revision History
Rev. Date Author Changes
---- -------- -------- --------------------------------------------
7-9 05/31/08 mjk Miscellaneous typo fixes.
6 mstrauss Internal spec development.