-------------------------------------------------------------------------
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.
-------------------------------------------------------------------------
    Geometry and tessellation shader interaction tests

Tests:
 + dEQP-GLES31.functional.tessellation_geometry_interaction.*
 + dEQP-GLES31.stress.tessellation_geometry_interaction.*

Includes:
 + Basic render tests using a shader program with tessellation and
   geometry shading stages.
 + Render tests with maximum geometry amplification in different stages
 + Scattering render tests where result primitives are scattered all
   over the viewport and render layers.
 + Basic transform feedback tests
 + Point size render tests

Excludes:
 + Complex rendering tests
 + SSBO memory access ordering test between tessellation and geometry shaders
 + Transform feedback with all basic types

Description:

render.passthrough cases tests basic rendering with a shader program with
attached tessellation and geometry shaders. Tests verify that attaching either a
passthrough geometry or tessellation shader does not change the result image. In
*_passthrough_geometry_* cases, the pattern is first rendered without a geometry
shader and then with a passthrough geometry shader. In
*_passthrough_tessellation_* cases, image is first rendered without a
tessellation stage and then with a passthrough tessellation shader attached.

render.limits.* cases test rendering with a five stage shader program with a
shader that uses the maximum number of geometry output vertices, uses maximum
number geometry shader instances, or sets the maximum tessellation level.
*_required_* cases use the maximum limit as required by the extension
specifications and *_implementation_* cases use the maximum limit reported by
the glGetInteger(GL_MAX_...) queries. Cases render a grid of green and yellow
cells, and the result image is verified.

The
dEQP-GLES31.stress.tessellation_geometry_interaction.render_multiple_limits.*
cases are otherwise identical to the functional cases but the stress.*
counterparts test multiple implementation and specification mandated limits at
the same time. Due to the extreme geometry amplification in certain tests, the
OUT_OF_MEMORY error is treated as a valid result (in addition to the valid
render result).

render.scatter.* cases use geometry shader to scatter the output primitives all
over the viewport. In the geometry_scatter_instances case, each geometry shader
instance emits its primitives near to each other but far form the primitives
emitted by the other instances of the same geometry shader execution. In the
geometry_scatter_primitives, each geometry shader instance emits its primitives
far form each other. In geometry_scatter_layers case, each emitted primitive of
a geometry shader instance is assigned a different layer index. Cases render a
grid of green and yellow cells, and the result image is verified.

feedback.tessellation_output_*_geometry_output_* cases test that transform
feedback works with five stage shader programs with different tessellation and
geometry output primitive types. Tests verify the validity of feedback results
and the value GL_PRIMITIVES_GENERATED query and then compare the rendered image
against the feedback results.

feedback.record_variable_selection case tests that when using transform
feedback the recorded variable is selected from the geometry shader if the
geometry shader is active.

point_size.* cases test reading and writing to gl_PointSize varible in different
shader stages. In {vertex, control, evaluation, geometry}_set cases, a constant
is assigned to the gl_PointSize in the corresponding shader stage. In {vertex,
control, ...}_add cases, gl_PointSize is incremented by a constant. In {eval,
default}_default cases, the corresponding shader stage is active, but it does
not modify the point size or use the shader stage specific point size extension.
The shader program is used to render a single point, and the rendered point size
is then verified from the image.
