-------------------------------------------------------------------------
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.
-------------------------------------------------------------------------
    Long-running stress tests

Tests:
 + dEQP-GLES2.stress.long.*

Includes:
 + Long-running stress testing with various application behaviors
 + Memory object handling
   - Buffers and textures
   - Allocation, uploading
 + Shader program
   - Switching between several programs
   - Re-compile frequently
 + Draw calls
   - Client-memory data for vertex indices and attributes
   - Big draw calls

Excludes:
 + Functional verification

Description:

The long-running stress tests are meant to be run for a long time to detect
deterioration (e.g. crash) in the program's behavior. The tests are supposed
to be run with the command-line tools instead of Candy. The test case uses
the --deqp-test-iteration-count=<num> command line option to choose the number
of iterations it runs; this should be set to either a very big number, or
alternatively a negative number, in which case it runs indefinitely. When
this option is not given, the number of iterations is only 5; this is only
useful to check that the test case's basic requisites are fulfilled (e.g.
that its shader programs compile successfully).

The basic structure of one iteration of the stress cases is as follows.

First, if the case uses more than one program, it randomly picks one of them
as the program for the current iteration. It then chooses whether or not to
re-compile the program if it hasn't yet been compiled. When a program is re-
compiled, attribute, uniform and varying names in the shader sources may
be mangled with a unique suffix, thus attempting to avoid shader caching.

Next, the textures used by the program are generated and uploaded or, if
they already exist, they may be re-uploaded with either glTexImage*() or
glTexSubImage*(). Texture parameters (wrapping etc.) are also set.

Then, buffers are generated and (re-)uploaded in a manner similar to that of
the textures described above. The buffers that may be used are vertex index
and attribute buffers. If, however, the case decides to use client-side memory
for index or attribute data, the respective buffer is not created.

Next, the program's uniforms are set, and a case-dependent amount of primitives
is drawn (note that this amount also affects the size of the buffers). This is
repeated for a case-dependent number of times. The draw command used can be
either glDrawElements() or glDrawArrays().

After drawing, the case may delete some textures and/or buffers.

This concludes an iteration. Between iterations, the usual post-iteration
operations are done by the framework; this generally contains draw buffer
swapping.

A stress case's behavior is determined by its parameters:
 + Program context(s)
   - Vertex and fragment shader sources
   - Value ranges for each attribute and uniform
   - Texture information (size, format etc.)
 + Approximate GPU memory usage limits that the case shouldn't exceed
   - Texture memory
   - Buffer memory
 + Number of draw calls per iteration
 + Number of triangles per draw call
 + A set of probabilities that enable the following per-iteration actions:
   - Re-build program
   - Re-upload texture
   - Re-upload buffer
   - When re-uploading texture, use glTexImage*() instead of glTexSubImage*()
   - When re-uploading buffer, use glBufferData() instead of glBufferSubData()
   - Delete texture at end of iteration
   - Delete buffer at end of iteration
   - Don't re-use texture, but delay its deletion until memory limit is hit
   - Don't re-use buffer, but delay its deletion until memory limit is hit
   - Use random 'target' argument when uploading buffer
   - Use random 'usage' argument when uploading buffer
   - Use glDrawArrays() (and no index buffer) instead of glDrawElements()
   - Use separate buffers for different attributes (instead of one big buffer)
   (Note: the texture- or buffer-specific actions above are randomized both
   per-iteration but also per-object.)
