| Name |
| |
| NV_sample_mask_override_coverage |
| |
| Name Strings |
| |
| GL_NV_sample_mask_override_coverage |
| |
| Contact |
| |
| Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com) |
| |
| Contributors |
| |
| Jeff Bolz, NVIDIA |
| James Helferty, NVIDIA |
| |
| Status |
| |
| Shipping |
| |
| Version |
| |
| Last Modified Date: March 27, 2015 |
| Revision: 2 |
| |
| Number |
| |
| OpenGL Extension #473 |
| OpenGL ES Extension #236 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 4.3 specification |
| (Compatibility Profile). |
| |
| This extension is written against version 4.30 of the OpenGL |
| Shading Language Specification. |
| |
| This extension interacts with NV_framebuffer_mixed_samples. |
| |
| This extension interacts with NV_fragment_program4. |
| |
| This extension interacts with the OpenGL ES 3.0 and 3.1 specifications. |
| |
| If implemented in OpenGL ES 3.0 or 3.1, OES_sample_variables is required. |
| |
| Overview |
| |
| This extension allows the fragment shader to control whether the |
| gl_SampleMask output can enable samples that were not covered by the |
| original primitive, or that failed the early depth/stencil tests. |
| This can be enabled by redeclaring the gl_SampleMask output with the |
| "override_coverage" layout qualifier: |
| |
| layout(override_coverage) out int gl_SampleMask[]; |
| |
| New Procedures and Functions |
| |
| None. |
| |
| New Tokens |
| |
| None. |
| |
| Additions to Chapter 15 of the OpenGL 4.3 (Compatibility Profile) Specification |
| (Rasterization) |
| |
| Modify Section 15.2.3 Shader Outputs, p. 514 |
| |
| (replace the paragraph describing gl_SampleMask) |
| |
| 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 samples supported by the |
| implementation. If bit <n> of element <w> in the array is set to zero, |
| sample <w>*32+<n> should be considered uncovered for the purposes of |
| multisample fragment operations (see section 17.3.3). Modifying the sample |
| mask in this way may exclude covered samples from being processed further |
| at a per-fragment granularity. If bit <n> of element <w> in the array is |
| set to one and gl_SampleMask is declared with the "override_coverage" |
| layout qualifier, then sample <w>*32+<n> should be considered covered for |
| the purposes of multisample fragment operations, even if it was not covered |
| by the original primitive or failed early fragment tests. If a bit is set |
| to one and gl_SampleMask was not declared with the "override_coverage" |
| layout qualifier, then that sample is considered covered only if it was |
| covered by the original primitive and was not discarded by early fragment |
| tests. If the fragment shader is being evaluated at any frequency other |
| than per-fragment, bits of the sample mask not corresponding to the current |
| fragment shader invocation are ignored. |
| |
| Modify Section 17.3.3 Multisample Fragment Operations, p. 534 |
| |
| (move gl_SampleMask description before SAMPLE_ALPHA_TO_COVERAGE, and |
| replace with the following) |
| |
| If a fragment shader is active and statically assigns to the built-in |
| output variable gl_SampleMask, the fragment coverage is modified in a way |
| that depends on the "override_coverage" layout qualifier. If gl_SampleMask |
| is qualified with "override_coverage", the fragment coverage is replaced |
| with the sample mask. If gl_SampleMask is not qualified with |
| "override_coverage", the fragment coverage is ANDed with the bits of the |
| sample mask. If such a fragment shader did not assign a value to |
| gl_SampleMask due to flow control, the value ANDed with the fragment |
| coverage or replacing the fragment coverage is undefined. If no fragment |
| shader is active, or if the active fragment shader does not statically |
| assign values to gl_SampleMask, the fragment coverage is not modified. |
| |
| New Implementation Dependent State |
| |
| None. |
| |
| New State |
| |
| None. |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None. |
| |
| GLX Protocol |
| |
| None. |
| |
| Modifications to the OpenGL Shading Language Specification, Version 4.30 |
| |
| |
| Including the following line in a shader can be used to control the |
| language features described in this extension: |
| |
| #extension GL_NV_sample_mask_override_coverage : <behavior> |
| |
| where <behavior> is as specified in section 3.3. |
| |
| New preprocessor #defines are added to the OpenGL Shading Language: |
| |
| #define GL_NV_sample_mask_override_coverage 1 |
| |
| |
| Modify Section 4.4.2.3 Fragment Shader Outputs (p. 64) |
| |
| (add to the end of the section) |
| |
| The built-in fragment shader variable gl_SampleMask may be redeclared using |
| the layout qualifier "override_coverage": |
| |
| layout-qualifier-id |
| override_coverage |
| |
| For example: |
| |
| layout(override_coverage) out int gl_SampleMask[]; |
| |
| The effect of this qualifier is defined in Section 7.1 (Built-in Variables) |
| and Section 15.2.3 of the OpenGL Specification. |
| |
| |
| Modify Section 7.1 (Built-in Variables), p. 110 |
| |
| (replace the description of gl_SampleMask on p. 118) |
| |
| The output array gl_SampleMask[] sets the sample mask for the fragment |
| being processed. If gl_SampleMask is not declared with the |
| "override_coverage" layout qualifier, coverage for the current fragment |
| will become the logical AND of the coverage mask and the output |
| gl_SampleMask. If gl_SampleMask is declared with the "override_coverage" |
| layout qualifier, coverage for the current fragment will be replaced by |
| the output gl_SampleMask. This array must be sized in the fragment shader |
| either implicitly or explicitly to be the same size described above. If the |
| fragment shader statically assigns a value to gl_SampleMask, the sample |
| mask will be undefined for any array elements of any fragment shader |
| invocations that fail to assign a value. If a shader does not statically |
| assign a value to gl_SampleMask, the sample mask has no effect on the |
| processing of a fragment. |
| |
| |
| Dependencies on NV_framebuffer_mixed_samples |
| |
| If NV_framebuffer_mixed_samples is supported, the definition of |
| gl_SampleMask should say "maximum number of color or raster samples |
| supported...". |
| |
| |
| Dependencies on NV_fragment_program4 |
| |
| Modify Section 2.X.6.Y of the NV_fragment_program4 specification |
| |
| (add new option section) |
| |
| + Sample Mask Override Coverage (NV_sample_mask_override_coverage) |
| |
| If a fragment program specifies the "NV_sample_mask_override_coverage" |
| option, the sample mask may enable coverage for samples not covered by the |
| original primitive, or those that failed early fragment tests, as described |
| in Section 15.2.3 Shader Outputs. |
| |
| |
| Interactions with OpenGL ES 3.0 and 3.1 |
| |
| Modify paragraph 2 of Shader Outputs from "where <s> is the maximum number |
| of color samples supported by the implementation" to "where <s> is the |
| value of MAX_SAMPLES, the maximum number of..." |
| |
| Remove any references to implicit sizing of the gl_SampleMask array, and |
| modify the example for "Fragment Shader Outputs" to have an explicit array |
| size: |
| |
| layout(override_coverage) out int gl_SampleMask[(gl_MaxSamples+31)/32]; |
| |
| Modify OpenGL ES Shading Language 3.00 Specification, section 3.8 |
| "Identifiers:" |
| |
| Replace the second paragraph with the following: |
| |
| Identifiers starting with "gl_" are reserved for use by OpenGL ES, and |
| may not be declared in a shader as either a variable or a function; |
| this results in a compile-time error. However, as noted in the |
| specification, there are some cases where previously declared variables |
| can be redeclared, and predeclared "gl_" names are allowed to be |
| redeclared in a shader only for these specific purposes. More |
| generally, it is a compile-time error to redeclare a variable, |
| including those starting "gl_". |
| |
| Errors |
| |
| None. |
| |
| Issues |
| |
| (1) How does this extension differ from NV_conservative_raster? |
| |
| RESOLVED: NV_conservative_raster will generate a fragment for any pixel |
| that intersects the primitive, even if no samples are covered, and all |
| pixels will initially be treated as fully covered. When using this |
| extension without conservative raster, fragments will only be generated |
| if at least one sample is covered by the primitive, but the shader may |
| turn on other samples in the same pixel. |
| |
| (2) How does this extension interact with per-sample shading (via |
| GL_SAMPLE_SHADING/glSampleShading() or attributes declared with the |
| "sample" interpolation qualifier)? |
| |
| RESOLVED: Sample shading effectively runs multiple shading passes on each |
| fragment. Each of these passes may only override the coverage for samples |
| owned by that pass, other bits in the sample mask are ignored. |
| |
| (3) For OpenGL ES, should we allow implicit sizing of the gl_SampleMask |
| array when it's redeclared? |
| |
| RESOLVED: No. OpenGL ES convention is to explicitly size arrays. See issues |
| 4 and 5 of OES_sample_variables. |
| |
| Revision History |
| |
| Revision 2, 2015/03/27 |
| - Add ES interactions |
| |
| Revision 1 |
| - Internal revisions. |