| Name | |
| EXT_multisample_compatibility | |
| Name Strings | |
| GL_EXT_multisample_compatibility | |
| Contact | |
| Mark Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com) | |
| Contributors | |
| Daniel Koch, NVIDIA Corporation | |
| Slawomir Grajewski, Intel | |
| Shannon Woods, Google | |
| Status | |
| Complete | |
| Exposed in ES contexts in NVIDIA drivers 358.00 (Septmeber 2015) | |
| and later. | |
| Version | |
| Last Modified Date: July 30, 2015 | |
| Revision: 5 | |
| Number | |
| OpenGL ES Extension #248 | |
| Dependencies | |
| This extension is written against the OpenGL ES 3.1 (April 29, 2015) | |
| specification, but can apply to earlier versions. | |
| This extension interacts with OES_sample_variables. | |
| Overview | |
| This extension allows disabling and enabling of multisampling. | |
| OpenGL ES 2.x/3.x both support multisampling but provide no way to | |
| disable multisampling for drawables with multiple samples. | |
| This introduces the MULTISAMPLE and SAMPLE_ALPHA_TO_ONE enables | |
| (though EXT suffixed) that operate identically to the OpenGL 4.5 core | |
| profile (as they have existed in OpenGL since OpenGL 1.3 and earlier | |
| with the ARB_multisample, EXT_multisample, and SGIS_multisample | |
| extensions). | |
| New Procedures and Functions | |
| None | |
| New Tokens | |
| Accepted by the <cap> parameter to Enable, Disable, and IsEnabled | |
| and the <pname> parameter to GetBooleanv, GetIntegerv, GetFloatv, | |
| and GetInteger64v: | |
| MULTISAMPLE_EXT 0x809D | |
| SAMPLE_ALPHA_TO_ONE_EXT 0x809F | |
| Additions to Chapter 13 of the OpenGL ES 3.1 Specification (Fixed-Function | |
| Primitive Assembly and Rasterization) | |
| Insert between the 8th and 9th paragraphs in Section 13.2.1 | |
| (Multisampling) the following: | |
| "Multisample rasterization is enabled or disabled by calling Enable | |
| or Disable with the symbolic constant MULTISAMPLE_EXT. | |
| If MULTISAMPLE_EXT is disabled, multisample rasterization of all | |
| primitives is equivalent to single-sample (fragment-center) | |
| rasterization, except that the fragment coverage value is set to | |
| full coverage. The color and depth values and the sets of texture | |
| coordinates may all be set to the values that would have been assigned | |
| by single-sample rasterization, or they may be assigned as described | |
| below for multisample rasterization." | |
| Replace the first sentence of Section 13.3.2 (Point Multisample | |
| Rasterization) with: | |
| "If MULTISAMPLE_EXT is enabled, and the value of SAMPLE_BUFFERS is | |
| one, then points are rasterized using the following algorithm." | |
| Replace the first sentence of Section 13.4.3 (Line Multisample | |
| Rasterization) with: | |
| "If MULTISAMPLE_EXT is enabled, and the value of SAMPLE_BUFFERS is | |
| one, then lines are rasterized using the following algorithm." | |
| Replace the first sentence of Section 13.5.3 (Polygon Multisample | |
| Rasterization) with: | |
| "If MULTISAMPLE_EXT is enabled, and the value of SAMPLE_BUFFERS is | |
| one, then polygons are rasterized using the following algorithm." | |
| Additions to Chapter 15 of the OpenGL ES 3.1 Specification (Writing Fragments and | |
| Samples to the Framebuffer) | |
| Change the first sentence of 15.1.1 (Alpha to Coverage) to read: | |
| "This step modifies fragment alpha and coverage values based on the | |
| value of SAMPLE_ALPHA_TO_COVERAGE and SAMPLE_ALPHA_TO_ONE_EXT. If the | |
| value of SAMPLE_BUFFERS is not one, MULTISAMPLE_EXT is disabled, | |
| or if draw buffer zero is not NONE and the buffer it references has | |
| an integer format, the operation is skipped." | |
| Add the following paragraph after the 2nd paragraph starting "Alpha | |
| to coverage is enabled...": | |
| "Alpha to one is enabled or disabled by calling Enable and Disable | |
| with target SAMPLE_ALPHA_TO_ONE_EXT." | |
| Add the following paragraph after the fourth paragraph ("If | |
| SAMPLE_ALPHA_TO_COVERAGE ...") in 15.1.1: | |
| "Next, if SAMPLE_ALPHA_TO_ONE_EXT is enabled, each alpha value is | |
| replaced by the maximum representable alpha value for fixed-point | |
| color buffers, or by 1.0 for floating-point buffers. Otherwise, | |
| the alpha values are not changed." | |
| Insert the following paragraph after the third paragraph in Section | |
| 15.1.8: | |
| "If MULTISAMPLE_EXT is disabled, and the value of SAMPLE_BUFFERS | |
| is one, the fragment may be treated exactly as described above, | |
| with optimization possible because the fragment coverage must | |
| be set to full coverage. Further optimization is allowed, | |
| however. An implementation may choose to identify a centermost | |
| sample, and to perform alpha, stencil, and depth tests on only that | |
| sample. Regardless of the outcome of the stencil test, all multisample | |
| buffer stencil sample values are set to the appropriate new stencil | |
| value. If the depth test passes, all multisample buffer depth sample | |
| values are set to the depth of the fragment's centermost sample's | |
| depth value, and all multisample buffer color sample values are set | |
| to the color value of the incoming fragment. Otherwise, no change | |
| is made to any multisample buffer color or depth value." | |
| Dependencies on OES_sample_variables | |
| When OES_sample_variables is supported, amend its language so | |
| multisampling related sample variables depend on the MULTISAMPLE_EXT | |
| enable state. | |
| Change the paragraph describing the gl_SampleID and gl_NumSamples | |
| variables to read: | |
| "The built-in read-only variable gl_SampleID is filled with | |
| the sample number of the sample currently being processed. This | |
| variable is in the range zero to gl_NumSamples minus one, where | |
| gl_NumSamples is the total number of samples in the framebuffer, or | |
| one if rendering to a non-multisample framebuffer or MULTISAMPLE_EXT | |
| is disabled. Using gl_SampleID in a fragment shader causes the entire | |
| shader to be executed per-sample. When rendering to a non-multisample | |
| buffer or MULTISAMPLE_EXT is disabled, gl_SampleID will always be | |
| zero. gl_NumSamples is the sample count of the framebuffer regardless | |
| of whether the framebuffer is multisampled or not." | |
| Change the last sentence of the paragraph describing the | |
| gl_SamplePosition variable: | |
| "When rendering to a non-multisample buffer or MULTISAMPLE_EXT is | |
| disabled, gl_SamplePosition will always be (0.5, 0.5)." | |
| Change the appropriate sentence describing the gl_SampleMaskIn | |
| variable: | |
| "When rendering to a non-multisample buffer or MULTISAMPLE_EXT | |
| is disabled, all bits are zero except for bit zero of the first | |
| array element. That bit will be one if the pixel is covered and | |
| zero otherwise." | |
| Change the paragraph of the GLSL language (section 7.2) describing | |
| gl_SampleID to read: | |
| "The input variable gl_SampleID is filled with the sample number of | |
| the sample currently being processed. This variable is in the range | |
| 0 to gl_NumSamples-1, where gl_NumSamples is the total number of | |
| samples in the framebuffer, or one if rendering to a non-multisample | |
| framebuffer or MULTISAMPLE_EXT is disabled. Any static use of | |
| gl_SampleID in a fragment shader causes the entire shader to be | |
| executed per-sample." | |
| New State | |
| Modify Table 20.7, Multisampling | |
| Add: | |
| Initial | |
| Get Value Type Get Command Value Description Sec. | |
| ----------------------- ---- ----------- ------- ------------------------- ------ | |
| MULTISAMPLE_EXT B IsEnabled TRUE Multisample rasterization 13.2.1 | |
| enable | |
| SAMPLE_ALPHA_TO_ONE_EXT B IsEnabled FALSE Set alpha to max 15.1.3 | |
| Errors | |
| None | |
| Issues | |
| 0. What should this extension be named? | |
| RESOLVED: EXT_multisample_compatibility. EXT_multisample is a | |
| pre-existing extension so we avoid that name. The phrase | |
| "compatibility" helps indicate this extension adds nothing not | |
| available for years in OpenGL 1.3 (and even before that). | |
| 1. Why is this extension necessary? | |
| RESOLVED: While OpenGL ES 2.x/3.x support multisampling, they do not | |
| provide a way to disable multisampling when rendering to a multisample | |
| framebuffer. Conventional OpenGL provides the GL_MULTISAMPLE enable | |
| for this purpose. | |
| 2. Is disabling multisampling necessary? | |
| RESOLVED: Yes, if you are trying to reproduce aliased rendering | |
| results in a multisample buffer. | |
| Rasterization with multisampling disabled can also provide faster | |
| rendering as the rasterization process is simpler and the shading | |
| results are more conducive to color compression. | |
| NV_framebuffer_mixed_samples relies on being able to disable | |
| multisampling to achieve color rate sampling when there is just one | |
| color sample per pixel. | |
| 3. Should the GL_SAMPLE_ALPHA_TO_ONE_EXT enable be included too? | |
| RESOLVED: Yes. OpenGL ES 2.x/3.x lack this enable. While rarely | |
| used, this enable is standard in OpenGL 1.3 and on so it can be | |
| assumed implementations that support enabling/disabling multisampling | |
| can also support this enable too. | |
| 4. Should sample shading support ("sample in") for GLSL be introduced | |
| by this extension? | |
| RESOLVED: No. That support is better left to a different | |
| extension as it builds on OES_sample_shading. In fact, | |
| OES_shader_multisample_interpolation does this and is included in | |
| Android Extension Pack (AEP) and ES 3.2. | |
| 5. Do we need to worry that the EXT token names "collide" with the | |
| existing tokens of EXT_multisample? | |
| RESOLVED: No. GL token names are hex values with capital letters A | |
| through F. C allows identical redefinition of #defines with exactly | |
| the same lexical string ignoring white space. This means including | |
| tokens from a header with EXT_multisample and this extension creates | |
| no problem as the tokens have identical token values and names. | |
| 6. Direct3D has AlphaToCoverageEnable, but nothing equivalent to | |
| GL_SAMPLE_ALPHA_TO_ONE_EXT. Given issue #3, how would Direct3D | |
| implement GL_SAMPLE_ALPHA_TO_ONE_EXT? | |
| RESOLVED: The GL_SAMPLE_ALPHA_TO_ONE_EXT functionality is included | |
| because if the fractional coverage held in the alpha component is | |
| transferred to sample mask, leaving the alpha value "as is" would | |
| result in "double accounting" for the alpha, once by the sample mask | |
| and a second time by any enabled blending based on source alpha. | |
| The expectation is if an application uses GL_SAMPLE_ALPHA_TO_COVERAGE | |
| and doing blending with source alpha, it should be using | |
| GL_SAMPLE_ALPHA_TO_ONE_EXT. | |
| While it is odd that Direct3D leaves out the | |
| GL_SAMPLE_ALPHA_TO_ONE_EXT functionality from Direct3D, that doesn't | |
| undercut the rationale for the functionality nor the compatibility | |
| requirement for it if an application uses/needs the functionality. | |
| Direct3D can still emulate GL_SAMPLE_ALPHA_TO_COVERAGE and | |
| GL_SAMPLE_ALPHA_TO_ONE_EXT both enabled in the shader by computing | |
| the sample mask and/or forcing alpha to one in the fragment shader. | |
| Revision History | |
| Rev. Date Author Changes | |
| ---- -------- --------- ----------------------------------------- | |
| 6 08/25/15 mjk Status updated | |
| 5 07/30/15 mjk Comments from Shannon; match language to | |
| April 29, 2015 ES 3.1 specification | |
| 4 07/09/15 mjk Improve issue 4 | |
| 3 07/08/15 mjk Typos | |
| 2 05/02/15 mjk Complete | |
| 1 04/02/15 mjk Initial revision. |