-------------------------------------------------------------------------
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 shader tests

Tests:
 + dEQP-GLES31.functional.geometry_shading.*

Includes:
 + Basic tests:
     - gl_PointSize, gl_PrimitiveID, gl_PrimitiveIDIn built-ins
     - Constant and varying emit counts
     - All input primitive types
     - All output privitive types (point, line_strip, triangle_strip)
	 - Different number of varyings
 + Non-sufficient vertex emit counts, superfluous EndPrimitives()
 + Layered rendering
 + Negative tests for input types

Excludes:
 + Geometry shader transform feedback
 + (Negative) tests for vertex-geo-frag shader varying linkage.
 + Primitive render order with geometry shader instancing

Description:

Geometry shader tests test geometry shader functionality by rendering
a scene using geometry shaders and comparing the resulting image to
the output of a reference renderer. Layered rendering render tests
draw scene to a texture which is then read back layer by layer. Contents
of each layer is then verified.

query.* test group contains various query tests. max_geometry_* cases
verify that the implementation limit queried via API is equal to the
corresponding GLSL constant. geometry_* and max_geometry_* cases test
geometry shader related limits and states. primitives_generated_* cases
verify GL_PRIMITIVES_GENERATED query result in various scenarios.
max_framebuffer_* and framebuffer_* test verify layered fbo limits, states
and incompleteness conditions.

basic.* tests test basic geometry shader usage: output_* cases emit
a constant number of vertices. output_vary_by_* cases emit a varying
number of vertices, depending on a shader varying, uniform or a texture
lookup. basic.point_size, basic.primitive_id_in[_restarted] and
basic.primitive_id cases test functionality of a corresponding built-in
variable. *_restarted variant verifies that primitive restart index has
no effect to the corresponding variable.

input.* tests verify geometry shader behavior with different input types
by drawing a separate triangle for each geometry shader input vertex.
input.triangle_strip_adjacency.* cases verify correct behavior of
TRIANGLE_ADJACENCY primitive with different vertex counts.

conversion.* tests verify functionality of geometry shaders with different
input and output primitive types.

emit.* tests test geometry shaders with different number of EmitVertex()
and EndPrimitive() calls, ranging from too few to superfluous. A geometry
shader invocation with name *_emit_N_end_M calls EmitVertex() N times and
EndPrimitive() M times.

varying.* tests verify the functionality of vertex shader -> geometry shader
varyigns and geometry shader -> fragment shader varyings.

layered.* tests geometry shader layered rendering targeting a cubemap, 3D,
2D array, and 2D multisample array texture. Tests render to the default layers,
only to one layer, each layer separately, or to each layer with different
contents and verify the contents of each layer. fragment_layer_* cases verify
the fragment shader built-in variable gl_Layer by outputting different color to
each layer. layer_provoking_vertex_* cases verify implementation dependent value
GL_LAYER_PROVOKING_VERTEX by rendering two triangles with one vertex having a
different gl_Layer value. The actual provoking vertex is then verified by
checking the layer contents.

instanced.* tests geometry shader instancing functionality.
geometry[_output_different]_N_invocations cases test basic geometry shader
instancing by rendering primitives in a circle formation. Each output primitive
on the circle is generated by a single geometry shader invocation and each
circle is generated by a single input primitive. invocation_per_layer and
multiple_layers_per_invocation cases test geometry shader instancing with
layered rendering. In invocation_per_layer cases, shader invocation writes only
to a single layer and in multiple_layers_per_invocation cases to two layers. In
invocation_output_vary_by_* cases, invocations emit a varying number of
vertices, depending on a shader varying, uniform or a texture lookup.
draw_N_instances_geometry_M_invocations cases test geometry instancing in with
instanced drawing. As in the geometry_N_invocations, a group of primitives is
drawn around each input primitive instance.

negative.* cases create a geometry shader accepting a certain input
primitive type and then try to use the shader when drawing with an incompatible
primitive type. GL_INVALID_OPERATION is expected.

vertex_transform_feedback.* cases test transform feedback relaxations introduced
in the extension. Tests include all new render primitive modes and
draw{arrays,elements}{e,indirect,instanced} draw functions.
capture_vertex_draw_elements_overflow_single_buffer case tests that a
buffer-overflowing primitive feedback result is not partially written to the
feedback buffer.
