-------------------------------------------------------------------------
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.
-------------------------------------------------------------------------
    Shader Storage Buffer Object / Buffer Block Tests

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

Includes:
 + SSBO access from compute shaders
 + Basic SSBO usage
   - Binding and unbinding uniform buffers
   - Writing uniform buffer data with glBufferData()
 + Binding SSBOs to buffer blocks
   - glBindBufferRange()
   - glBindBufferBase()
   - glShaderStorageBlockBinding()
 + Querying buffer block memory layout
 + Layout sanity verification
 + std140 and std430 layout verification
 + Buffer blocks GLSL
   - Basic scalar, vector and matrix types in buffer blocks
   - Samplers in buffer blocks - as negative case!
   - Structures and arrays in buffer blocks
   - Buffer block instance names
   - Buffer block arrays
   - Unsized arrays as a last element of buffer block
   - Layout qualifiers: shared, packed, std140, row_major, column_major
   - Unused variables in buffer blocks
 * Atomic operations

Excludes:
 + Access from other shader shader stages (currently compute only)
 + Negative tests

Description:

SSBO layout and access tests generate compute shader code based on interface
declaration. Shader is compiled and layout is queried. Validity checks are
performed to the layout, and in case of std140 and std430 layouts the layout
is compared against a full reference layout.

Single compute shader invocation is issued. Shader reads and/or writes to
SSBO. Reads are validated by comparing values to constant values declared in
shader text. Writes are validated by reading back the SSBO and comparing
against expected values.

Atomic operation test cases use a single SSBO for both input data, output data
and data operated with atomic memory functions. Multiple work groups of size
3x2x1 is issued and each invocation executes atomic operation with per-
invocation data. Result values are then stored into SSBO. Results are
validated by mapping buffer and doing comparison that varies per function. The
input values are chosen so that comparison can detect obvious non-atomic
behavior.