| 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. |