-------------------------------------------------------------------------
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.
-------------------------------------------------------------------------
    Program interface query

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

Includes:
 + Basic queries for every property of every program interface
 + Basic tests for resource list contents for every program interface
 + Attempts to query data to too small buffers

Excludes:
 + Exact layout validation for data layout related queries (offset,
   stride)
 + Consistency validation for location queries (as in no two different
   variables with the same location)

Description:

buffer_limited_query.* cases test that queries function properly when
given a return value buffer that is too short to contain all queried
data. resource_name_query case tests GetProgramResourceName function
with different character output buffer sizes and resource_query case
tests GetProgramResourceiv with different property value output buffer
sizes.

Program interface query tests are structured as follows. Each program
interface has its own test group at the
functional.program_interface_query.* level. Each program interface test
group contains a test group for each supported property, for example
"uniform.location.*". Additionally, each program interface contains test
group "resource_list" which contains tests for resource list generation.
In addition, some program interfaces contain "random" test group which
contains randomly (fixed seed) generated tests.

Each program interface query test, a program corresponding to the case's
full name is generated. For example,
"uniform.name_length.default_block.var_struct" would mean a NAME_LENGTH
query for a member variable of a uniform struct in the default block.
Cases without explicit mention of the shader type in its full name
generate compute shaders. The generated program is compiled and linked
and then the specified property is queried and verified. For the
randomly generated cases, all supported properties of the interface are
queried and verified.

uniform.* and buffer_variable.* cases test GL_UNIFORM and
GL_BUFFER_VARIABLE program interfaces, respectively. Test groups
array_size, array_stride, atomic_counter_buffer_index, block_index,
location, matrix_row_major, matrix_stride, name_length, offset,
referenced_by_shader, and type test properties ARRAY_SIZE, ARRAY_STRIDE,
ATOMIC_COUNTER_BUFFER_INDEX, BLOCK_INDEX, LOCATION, IS_ROW_MAJOR,
MATRIX_STRIDE, NAME_LENGTH, OFFSET, REFERENCED_BY_*_SHADER, and TYPE
properties, respectively. Additionally, the buffer_variable.* test group
contains tests for TOP_LEVEL_ARRAY_SIZE (top_level_array_size.*) and
TOP_LEVEL_ARRAY_STRIDE (top_level_array_stride.*) properties.

uniform_block.* and shader_storage_block.* cases test GL_UNIFORM_BLOCK
and GL_SHADER_STORAGE_BLOCK program interfaces, respectively. Test
groups active_variables, buffer_binding, buffer_data_size, name_length,
and referenced_by test properties ACTIVE_VARIABLES, BUFFER_BINDING,
BUFFER_DATA_SIZE, NAME_LENGTH, and REFERENCED_BY_*_SHADER properties,
respectively.

atomic_counter_buffer.* cases test GL_ATOMIC_COUNTER_BUFFER program
interface. Test cases active_variables, buffer_binding,
buffer_data_size, and referenced_by_* test ACTIVE_VARIABLES,
BUFFER_BINDING, BUFFER_DATA_SIZE, and REFERENCED_BY_*_SHADER properties,
respectively.

program_input.* and program_output.* cases test PROGRAM_INPUT and
PROGRAM_OUTPUT program interfaces, respectively. Test groups array_size,
location, name_length, referenced_by, and type test ARRAY_SIZE,
LOCATION, NAME_LENGTH, REFERENCED_BY_*_SHADER and TYPE properties,
respectively. Each test group contains separate tests for different
program configurations such as compute program, vertex-fragment program,
or separable shader programs.

transform_feedback_varying.* cases test TRANSFORM_FEEDBACK_VARYING
program interface. Test groups array_size, name_length, and type test
ARRAY_SIZE, NAME_LENGTH, and TYPE properties. Each test group contains
separate tests for a complete vertex-fragment program and for separable
program containing only a vertex shader. Test query properties of
various types of user-defined output variables and a built-in output
gl_Position.
