blob: 5933627a9c39998f0278d05b515b7cdaf0d938be [file] [log] [blame]
Name
EXT_raster_multisample
Name Strings
GL_EXT_raster_multisample
Contact
Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com)
Contributors
Pat Brown, NVIDIA
Mathias Heyer, NVIDIA
Status
Shipping
Version
Last Modified Date: March 27, 2015
Revision: 2
Number
OpenGL Extension #462
OpenGL ES Extension #226
Dependencies
This extension is written against the OpenGL 4.3 (Compatibility Profile)
specification.
This extension requires OpenGL ES 3.0.3 (December 18, 2013) in an
OpenGL ES implementation.
This extension interacts with NV_fragment_coverage_to_color.
This extension interacts with EXT_depth_bounds_test.
This extension interacts with OES_sample_shading.
This extension interacts with OES_sample_variables.
Overview
This extension allows rendering to a non-multisample color buffer while
rasterizing with more than one sample. The result of rasterization
(coverage) is available in the gl_SampleMaskIn[] fragment shader input,
multisample rasterization is enabled for all primitives, and several per-
fragment operations operate at the raster sample rate.
When using the functionality provided by this extension, depth, stencil,
and depth bounds tests must be disabled, and a multisample draw
framebuffer must not be used.
A fragment's "coverage", or "effective raster samples" is considered to
have "N bits" (as opposed to "one bit" corresponding to the single color
sample) through the fragment shader, in the sample mask output, through
the multisample fragment operations and occlusion query, until the coverage
is finally "reduced" to a single bit in a new "Coverage Reduction" stage
that occurs before blending.
New Procedures and Functions
void RasterSamplesEXT(uint samples, boolean fixedsamplelocations);
New Tokens
Accepted by the <cap> parameter of Enable, Disable, IsEnabled:
RASTER_MULTISAMPLE_EXT 0x9327
Accepted by the <pname> parameter of GetBooleanv, GetDoublev,
GetIntegerv, and GetFloatv:
RASTER_SAMPLES_EXT 0x9328
MAX_RASTER_SAMPLES_EXT 0x9329
RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A
MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B
EFFECTIVE_RASTER_SAMPLES_EXT 0x932C
Additions to Chapter 14 of the OpenGL 4.3 (Compatibility Profile) Specification
(Rasterization)
Modify Section 14.3.1 (Multisampling), p. 477
(replace the introductory language at the beginning of the section to
account for the new ability to use multisample rasterization without
having multisample storage)
Multisampling is a mechanism to antialias all GL primitives: points,
lines, polygons, bitmaps, and images. The technique is to sample all
primitives multiple times at each pixel. The color sample values are
resolved to a single, displayable color. For window system-provided
framebuffers, this occurs each time a pixel is updated, so the
antialiasing appears to be automatic at the application level. For
application-created framebuffers, this must be requested by calling
the BlitFramebuffer command (see section 18.3.1). Because each sample
includes color, depth, and stencil information, the color (including
texture operation), depth, and stencil functions perform
equivalently to the single-sample mode.
When the framebuffer includes a multisample buffer, separate color, depth,
and stencil values are stored in this buffer for each sample location.
Samples contain separate color values for each fragment color.
Framebuffers including a multisample buffer do not include non-multisample
depth or stencil buffers, even if the multisample buffer does not store
depth or stencil values. Color buffers do coexist with the multisample
buffer, however.
The color sample values are resolved to a single, displayable color each
time a pixel is updated, so the antialiasing appears to be automatic at
the application level. Because each sample includes color, depth, and
stencil information, the color (including texture operation), depth, and
stencil functions perform equivalently to the single-sample mode.
Multisample antialiasing is most valuable for rendering polygons, because
it requires no sorting for hidden surface elimination, and it correctly
handles adjacent polygons, object silhouettes, and even intersecting
polygons. If only points or lines are being rendered, the "smooth"
antialiasing mechanism provided by the base GL may result in a higher
quality image. This mechanism is designed to allow multisample and smooth
antialiasing techniques to be alternated during the rendering of a single
scene.
If the value of MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is TRUE, the
rasterization of all primitives is changed, and is referred to as
multisample rasterization. Otherwise, primitive rasterization is
referred to as single-sample rasterization. The value of MULTISAMPLE-
_RASTERIZATION_ALLOWED_EXT is queried by calling GetIntegerv
with pname set to MULTISAMPLE_RASTERIZATION_ALLOWED_EXT.
During multisample rendering the contents of a pixel fragment are changed
in two ways. First, each fragment includes a coverage value with
EFFECTIVE_RASTER_SAMPLES_EXT bits. The value of EFFECTIVE_RASTER_-
SAMPLES_EXT is an implementation-dependent constant, and
is queried by calling GetIntegerv with pname set to EFFECTIVE_RASTER-
_SAMPLES_EXT.
---
Multisample rasterization may also be enabled without introducing
additional storage for the multisample buffer, by calling Enable with a
<target> of RASTER_MULTISAMPLE_EXT. The command:
void RasterSamplesEXT(uint samples, boolean fixedsamplelocations);
selects the number of samples to be used for rasterization. <samples>
represents a request for a desired minimum number of samples. Since
different implementations may support different sample counts, the actual
sample pattern used is implementation-dependent. However, the resulting
value for RASTER_SAMPLES_EXT is guaranteed to be greater than or equal to
<samples> and no more than the next larger sample count supported by the
implementation. If <fixedsamplelocations> is TRUE, identical sample
locations will be used for all pixels. The sample locations chosen are a
function of only the parameters to RasterSamplesEXT and not of any other
state.
If RASTER_MULTISAMPLE_EXT is enabled, then the sample pattern chosen by
RasterSamplesEXT will be used instead of sampling at the center of the
pixel. The sample locations can be queried with GetMultisamplefv with a
<pname> of SAMPLE_POSITION, similar to normal multisample sample locations.
The value MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is TRUE if SAMPLE_BUFFERS
is one or if RASTER_MULTISAMPLE_EXT is enabled. The value
EFFECTIVE_RASTER_SAMPLES_EXT is equal to RASTER_SAMPLES_EXT if
RASTER_MULTISAMPLE_EXT is enabled, otherwise is equal to SAMPLES.
Explicit multisample rasterization can not be used in conjunction with
depth, stencil, or depth bounds tests, multisample framebuffers, or if
RASTER_SAMPLES_EXT is zero. If RASTER_MULTISAMPLE_EXT is enabled, the
error INVALID_OPERATION will be generated by Draw commands if
- the value of RASTER_SAMPLES_EXT is zero
- the depth, stencil, or depth bounds test is enabled
- a multisample draw framebuffer is bound (SAMPLE_BUFFERS is one)
Errors
- An INVALID_VALUE error is generated if <samples> is greater than the
value of MAX_RASTER_SAMPLES_EXT (the implementation-dependent maximum
number of samples).
Add to the end of Section 14.3.1.1 (Sample Shading), p. 479
If RASTER_MULTISAMPLE_EXT is enabled, the number of unique samples to
process is implementation-dependent and need not be more than one.
Modify Section 14.4.3 (Point Multisample Rasterization)
If MULTISAMPLE is enabled and MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is
TRUE, then points are rasterized using the following algorithm, regardless
of whether point antialiasing (POINT_SMOOTH) is enabled or disabled.
Modify Section 14.5.4 (Line Multisample Rasterization)
If MULTISAMPLE is enabled and MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is
TRUE, then lines are rasterized using the following algorithm, regardless
of whether line antialiasing (LINE_SMOOTH) is enabled or disabled.
Modify Section 14.6.6 (Polygon Multisample Rasterization)
If MULTISAMPLE is enabled and MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is
TRUE, then polygons are rasterized using the following algorithm,
regardless of whether polygon antialiasing (POLYGON_SMOOTH) is enabled or
disabled.
Modify Section 14.8.0.1 (Bitmap Multisample Rasterization)
If MULTISAMPLE is enabled and MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is
TRUE, then bitmaps are rasterized using the following algorithm.
Additions to Chapter 15 of the OpenGL 4.3 (Compatibility Profile) Specification
(Programmable Fragment Processing)
Modify Section 15.2.2 (Shader Inputs), p. 512
The built-in variable gl_SampleMaskIn is an integer array holding bitfields
indicating the set of fragment samples covered by the primitive
corresponding to the fragment shader invocation. The number of elements in
the array is
ceil(s/32),
where <s> is the maximum number of color or raster samples supported by the
implementation. Bit <n> of element <w> in the array is set if and only if
the raster sample numbered 32<w> + <n> is considered covered for this
fragment shader invocation.
Modify Section 15.2.3 (Shader Outputs), p. 513
The built-in integer array gl_SampleMask can be used to change the sample
coverage for a fragment from within the shader. The number of elements in
the array is
ceil(s/32),
where <s> is the maximum number of color or raster samples supported by the
implementation.
Additions to Chapter 17 of the OpenGL 4.3 (Compatibility Profile) Specification
(Writing Fragments and Samples to the Framebuffer)
Modify Figure 17.1 (Per-fragment operations)
Add a new stage called "Coverage Reduction" between "Occlusion Query" and
"Blending".
(note: If NV_fragment_coverage_to_color is supported, the "Coverage
Reduction" stage is after the "Fragment coverage to color" stage.)
Modify Section 17.3.3 (Multisample Fragment Operations)
First paragraph:
...No changes to the fragment alpha or coverage values are made at this
step if MULTISAMPLE is disabled or MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is
FALSE.
...
If SAMPLE_ALPHA_TO_COVERAGE is enabled, a temporary coverage value is
generated where each bit is determined by the alpha value at the
corresponding sample location. The coverage value has
EFFECTIVE_RASTER_SAMPLES_EXT bits.
Modify Section 17.3.7 (Occlusion Queries), p.538
When an occlusion query is started with target SAMPLES_PASSED, the samples-
passed count maintained by the GL is set to zero. When an occlusion query
is active, the samples-passed count is incremented for each fragment that
passes the depth test. If MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is FALSE,
then the samples-passed count is incremented by 1 for each fragment. If
MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is TRUE, then the samples-passed
count is incremented by the number of samples whose coverage bit is set.
However, implementations, at their discretion, may instead increase the
samples-passed count by the value of EFFECTIVE_RASTER_SAMPLES_EXT if any
sample in the fragment is covered. Additionally, if
RASTER_MULTISAMPLE_EXT is enabled, implementations may instead increase
the samples-passed count by one for the entire fragment if any sample
is covered.
Add a new Section 17.3.Y (Coverage Reduction) after 17.3.7.
If RASTER_MULTISAMPLE_EXT is enabled, a fragment's coverage is reduced
from RASTER_SAMPLES_EXT bits to a single bit, where the new "color
coverage" is 1 if any bit in the fragment's coverage is on, and 0
otherwise. If the color coverage is 0, then blending and writing to the
framebuffer are not performed for that sample.
Additions to Chapter 18 of the OpenGL 4.3 (Compatibility Profile) Specification
(Drawing, Reading, and Copying Pixels)
Modify Section 18.1.3 (Pixel Rectangle Multisample Rasterization)
If MULTISAMPLE is enabled and MULTISAMPLE_RASTERIZATION_ALLOWED_EXT is TRUE,
then pixel rectangles are rasterized using the following algorithm.
New Implementation Dependent State
Minimum
Get Value Type Get Command Value Description Sec.
--------- ------- ----------- ------- ------------------------ ------
MAX_RASTER_SAMPLES_EXT Z+ GetIntegerv 2 Maximum number of raster 14.3.1
samples
New State
Get Value Get Command Type Initial Value Description Sec. Attribute
--------- ----------- ---- ------------- ----------- ---- ---------
RASTER_MULTISAMPLE_EXT IsEnabled B FALSE Multisample Rasterization 14.3.1 enable/multisample
without multiple color
samples
RASTER_SAMPLES_EXT GetIntegerv Z+ 0 Number of raster samples 14.3.1 multisample
RASTER_FIXED_SAMPLE_- GetBooleanv B FALSE Require same sample 14.3.1 multisample
LOCATIONS_EXT locations
MULTISAMPLE_RASTERIZATION_- GetBooleanv B FALSE Whether multisample 14.3.1 -
ALLOWED_EXT rasterization can be used
EFFECTIVE_RASTER_SAMPLES_EXT GetIntegerv Z+ 0 How many samples are used 14.3.1 -
for rasterization and
fragment operations
Additions to the AGL/GLX/WGL Specifications
None.
GLX Protocol
None.
Modifications to the OpenGL Shading Language Specification, Version 4.30
Modify Section 7.1 (Built-In Language Variables), p. 118
For both the input array gl_SampleMaskIn[] and the output array
gl_SampleMask[], bit B of mask M (gl_SampleMaskIn[M] or gl_SampleMask[M])
corresponds to sample 32*M+B. These arrays have ceil(s/32) elements, where
s is the maximum number of color or raster samples supported by the
implementation.
Interactions with OpenGL ES 3.0
For OpenGL ES, remove references to images, bitmaps and GetDoublev.
Disregard references to POINT_SMOOTH, LINE_SMOOTH and POLYGON_SMOOTH.
Omit changes to Section 14.8.0.1 (Bitmap Multisample Rasterization).
Also, omit changes to Section 18.1.3 (Pixel Rectangle Multisample Rasterization).
Since OpenGL ES does not support enabling/disabling MULTISAMPLE rasterization
via MULTISAMPLE, read all occurrences of MULTISAMPLE as if it was enabled.
Dependencies on OES_sample_shading
If this extension is implemented on OpenGL ES and OES_sample_shading
is not supported, omit changes to Section 3.3.1 (Sample Shading).
Dependencies on OES_sample_variables
If this extension is implemented on OpenGL ES and OES_sample_variables
is not supported, omit changes to Section 3.9.2 (Shader Inputs;
Shader Outputs).
Dependencies on EXT_depth_bounds_test
If EXT_depth_bounds_test is not supported, remove the error check for the
depth bounds test enable.
Errors
INVALID_OPERATION is generated by Draw commands if RASTER_MULTISAMPLE_EXT
is enabled and any of the following is true:
- the value of RASTER_SAMPLES_EXT is zero
- the depth, stencil, or depth bounds test is enabled
- a multisample draw framebuffer is bound (SAMPLE_BUFFERS is one)
INVALID_VALUE is generated by RasterSamplesEXT if <samples> is greater
than the value of MAX_RASTER_SAMPLES_EXT.
Issues
(1) What is the interaction with sample shading?
RESOLVED: Sample shading requires "max(ceil(mss * samples), 1)" shader
invocations. Since <samples> must be one when using this feature, an
implementation is still only required to shade once. However, in case this
functionality were supported with more than one color sample, we don't
require shading at more than one sample.
(2) Where are attributes sampled?
RESOLVED: They are sampled as if normal multisampling were in effect with
the same sample pattern. i.e. attributes can be sampled at the center or
at the centroid, depending on what the shader requests.
(3) During multisample rasterization, what are the values of the GLSL
built-in variables gl_SampleMaskIn[], gl_SampleMask[], gl_SampleID,
gl_NumSamples, gl_SamplePosition?
RESOLVED: There are RASTER_SAMPLES_EXT bits in gl_SampleMaskIn and
gl_SampleMask. gl_SampleID and gl_NumSamples continue to reflect the
number of samples in the framebuffer.
gl_SamplePosition is intended to reflect the location of the fragment being
shaded when MIN_SAMPLE_SHADING is enabled. However, since we don't require
MIN_SAMPLE_SHADING to work in conjunction with this extension,
gl_SamplePosition may just contain the location of the pixel center.
(4) How does multisample rasterization operate?
RESOLVED: Point shape, point anti-aliasing, line smooth, etc. will operate
the same when RASTER_MULTISAMPLE is enabled as they do when SAMPLE_BUFFERS
is one in the absence of this extension.
(5) When using both NV_fragment_coverage_to_color and EXT_raster_multisample
or NV_framebuffer_mixed_samples, how do these features interact?
RESOLVED: Both may be used simultaneously, and the coverage_to_color
functionality is applied before coverage reduction in the pipeline. This
means the full raster sample mask will be written to the color buffer, not
the reduced color sample mask.
Revision History
Revision 2, 2015/03/27
- Add ES interactions
Revision 1, September 12, 2014 (jbolz, pbrown, mheyer)
Internal spec development.