| ------------------------------------------------------------------------- |
| drawElements Quality Program Test Specification |
| ----------------------------------------------- |
| |
| Copyright 2014 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ------------------------------------------------------------------------- |
| Sample variable tests |
| |
| Tests: |
| + dEQP-GLES31.functional.shaders.sample_variables.* |
| |
| Includes: |
| + Rendering to default framebuffer, multi- and single sample |
| textures and renderbuffers |
| + Built-in variables: |
| - gl_NumSamples |
| - gl_MaxSamples |
| - gl_SampleID |
| - gl_SamplePos |
| - gl_SampleMaskIn |
| + Writing to gl_SampleMask |
| + Interaction with OES_sample_shading |
| |
| Excludes: |
| + Rendering to every supported render buffer sample count / format |
| + Rendering to every supported multisample texture sample count / format |
| |
| Description: |
| |
| num_samples.* cases test gl_NumSamples built-in value with different render |
| target configurations. max_samples.* cases test gl_MaxSamples built-in variable. |
| Values are verified with verifier fragment shader. |
| |
| sample_id.* cases verify gl_SampleID values. A quad is drawn with a shader |
| program. With texture targets, each sample encodes its gl_SampleID to the |
| fragment output value and then texture contents are verified. With default |
| framebuffer and renderbuffer targets, render area is partitioned to a grid so |
| that in each grid cell only the fragment shader invocations with a certain |
| gl_SampleID output a non-zero green value. Result image is then verified to |
| contain only non-zero green values. The test with framebuffer and renderbuffer |
| thus only guarantees that for each pixel there exist a fragment shader |
| invocation for every valid gl_SampleID value, but not that a matching fragment |
| shader invocation is unique. |
| |
| sample_pos.correctness.* cases verify gl_SamplePosition built-in variable |
| contains the position in which varyings were interpolated. Cases render a quad |
| with a verifier fragment shader. Fragment shader compares gl_SamplePosition |
| values against a per-sample interpolated screen-space location (in pixels) |
| varying. gl_SamplePosition should be equal to the fractional part of the |
| interpolated varying value. |
| |
| sample_pos.distribution.* cases verify the distribution of gl_SamplePositions |
| within a pixel. The tests render a quad with a fragment shader that encodes the |
| gl_SamplePosition value and value legality (range check) to the color channels. |
| With texture render targets, the texture contents are read and positions are |
| verified for legality, uniqueness and distribution. With framebuffer and |
| renderbuffer render targets only the legality and distribution are verified. |
| Distribution is verified by averaging sample position values (texture) or by |
| resolving with an implementation defined method (framebuffer, renderbuffer). |
| Averaged/resolved value should be reasonably close to the pixel center. Too |
| large a bias away from the expected value will result in a quality warning. |
| |
| sample_mask_in.* cases test reading gl_SampleMaskIn built-in variable and |
| sample_mask_in.* cases write values to gl_SampleMask built-in variable. Sample |
| mask operations are multisample operations and should not have effect with |
| single sample render targets. *_per_pixel variations test value when fragment |
| shader is executed once per pixel, and *_per_sample when shader is executed per |
| sample. *_per_two_samples variations use OES_sample_shading, with sample |
| shading value set to 50%, i.e. there should be AT LEAST one invocation per two |
| samples. |
| |
| sample_mask_in.sample_mask cases test gl_SampleMaskIn that with multisampled |
| render targets gl_SampleMaskIn does not contain any bits not set in |
| GL_SAMPLE_MASK. With single sample render targets gl_SampleMaskIn should not |
| depend on GL_SAMPLE_MASK value. |
| |
| sample_mask_in.bit_count cases test gl_SampleMaskIn contains only a certain |
| number of set bits. In the per pixel variation, gl_SampleMaskIn should contain |
| [1, numSamples] set bits. In per sample cases, the gl_SampleMaskIn should only |
| contain one set bit. In per two samples cases, there should be [1, numSamples/2] |
| bits (all but one invocation gets one sample, one invocation gets the other |
| samples). |
| |
| sample_mask_in.bits_unique_per_sample cases tests that the single set bit in |
| gl_SampleMaskIn is unique. sample_mask_in.bits_unique_per_two_samples cases test |
| that each bit is set only in a single gl_SampleMaskIn bitset and that number of |
| distinct gl_SampleMaskIn bitsets matches the number guaranteed by |
| OES_sample_shading. Tests render to a multisample texture, encode |
| gl_SampleMaskIn to the color channel, and then read back the texture contents. |
| |
| sample_mask.discard_half tests discard half of the samples by writing 0xAAAA... |
| to gl_SampleMask output variable. With single sample targets, writing to |
| gl_SampleMask should have no effect. With multisample targets the result image |
| color intensity should decrease. With multisample targets with sample count = 1, |
| all fragments should be discarded. |
| |
| sample_mask.inverse cases set gl_SampleMask to the inverse of current |
| SAMPLE_MASK. With multisample render targets, all fragments should be discarded. |
| With single sample render targets, writing to gl_SampleMask should have no |
| effect. |