-------------------------------------------------------------------------
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.
-------------------------------------------------------------------------
    Multisample interpolation tests

Tests:
 + dEQP-GLES31.functional.shaders.multisample_interpolation.*
 + dEQP-GLES31.functional.state_query.multisample_interpolation.*

Includes:
 + Sample qualifier
 + interpolateAtSample
 + interpolateAtCentroid
 + interpolateAtOffset
 + Rendering to the default framebuffer, multi- and single sample
   textures and renderbuffers
 + Implementation limit queries for
    - MIN_FRAGMENT_INTERPOLATION_OFFSET
	- MAX_FRAGMENT_INTERPOLATION_OFFSET
	- FRAGMENT_INTERPOLATION_OFFSET_BITS

Excludes:
 + interpolateAtSample() with non dynamically uniform sample index.
 + Rendering to every supported render buffer sample count / format
 + Rendering to every supported multisample texture sample count / format

Description:

sample_qualifier.* cases test sample qualifier by rendering a high frequency
test pattern with a sample-qualified varying. Using the same reasoning as in
sample shading test specification, the result image should contain numSamples +
1 different shades of gray, e.g. single sampled render target should contain two
shades (black and white) and 2x sampled three shades.

interpolate_at_sample.* cases test interpolateAtSample() function with different
inputs and render target configurations.

interpolate_at_sample.static_sample_number and
interpolate_at_sample.dynamic_sample_number cases sample a high frequency
function with at every sample position and average the result. static cases use
integer literals at which samples values are interpolated, in dynamic cases the
sample index "depends" (all samples are sampled anyway) on uniform values.

interpolate_at_sample.non_multisample_buffer cases test that using
interpolateAtSample() with a non-multisample render target with any sample index
will result in a value interpolated at the center of the pixel. Value is
verified by interpolating a varying containing screen-space location in pixels.

interpolate_at_sample.centroid_qualifier cases interpolate a centroid-qualified
varying with interpolateAtSample(). The tests render narrow triangles and
compare results of interpolateAtSample of two identical varyings, but with
different centroid-qualification. The centroid qualifier should not have any
effect on the values returned by interpolateAtSample().

interpolate_at_sample.at_sample_id cases test that sample index used by
interpolateAtSample is the same as in gl_SampleID. Tests compare value
per-sample qualified varying and the value returned by
interpolateAtSample(v_varying, gl_SampleID). Values should be equal.

interpolate_at_centroid.* cases test interpolateAtCentroid() function with
different inputs and render target configurations.

interpolate_at_centroid.consistency cases test that values returned by
interpolateAtCentroid are equal to the values of a centroid qualified varying.
Tests render multiple narrow triangles, assign the same value to a
centroid-qualified and non-centroid-qualified varying and then compares the
values of centroid-qualified varying and interpolateAtCentroid function return
value when given the non-centroid-qualified varying as an input.

interpolate_at_centroid.array_element cases test interpolateAtCentroid function
when given a varying array element as an input. Tests render multiple narrow
triangles, and the frament shader verifies that values returned by
interpolateAtCentroid() were interpolated within the primitive area.

interpolate_at_offset.* cases test interpolateAtOffset() function with different
inputs and render target configurations.

interpolate_at_offset.no_qualifiers, .centroid_qualifier, and .sample_qualifier
cases test interpolateAtOffset() function targeting a varying without
qualifiers, with centroid qualifier and with per-sample qualifier.
.array_element cases test interpolateAtOffset targeting an array element. Tests
render a quad and in the fragment shader use interpolateAtOffset to a
screen-space location (in pixels) varying. The fractional part of the returned
value should be equal to the interpolation offset.

interpolate_at_offset.at_sample_position cases test that using
interpolateAtOffset to interpolate a value at the sample location returns the
same value as a per-sample interpolated varying.
