EXT_raster_multisample

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.