-------------------------------------------------------------------------
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.
-------------------------------------------------------------------------
    Precision tests for built-in functions

Tests:
 + dEQP-GLES3.functional.shaders.builtin_functions.precision.*


These tests check that the GLSL built-in numerical functions produce
results that are compliant with the range and precision requirements in
the GLSL ES specification.

The tests operate by calling the functions with predefined (mostly
random) input values in either the vertex or the fragment shader. The
result is stored in a transform feedback buffer or in a framebuffer
pixel, and then read and compared to a reference interval of acceptable
values. Functions are tested with all possible vector and matrix sizes.
In the test log floating point numbers are printed out as hexadecimal
constants of the form used in e.g. C99.

Where the GLSL specification does not specify a particular precision,
the tests try to make reasonable requirements. When behavior at
infinities hasn't been otherwise specified, C99 Appendix F is used as a
reference. Moreover, the highp precision requirements have been adapted
to lowp and mediump precisions even though the GLSL specification
doesn't provide any guarantees about them. For instance, mediump and
lowp operations are expected to produce either an infinity or the
maximum/minimum value on overflow.

The acceptable results are constrained further by only allowing values
from within the codomain of the function. Thus, for instance, sin(x) is
not allowed to return a number greater than 1 even when when the nominal
error bound would be greater.

A number of functions have been defined as derived forms. This means
that they are required to produce only results that their expansions
could produce, given the precision requirements for the constituent

operations.

* Arithmetic operations

These are as defined in the GLSL ES specification.

| operation | precision | domain                      |
|-----------+-----------+-----------------------------|
| x + y     | < 1 ULP   |                             |
| x / y     | 2.5 ULP   | 2^-126 <= abs(y) <= 2^127-1 |
| x - y     | < 1 ULP   |                             |
| x * y     | < 1 ULP   |                             |


* Trigonometric functions

The precisions for trigonometric functions have been adapted from OpenCL
fast relaxed math and half-float specifications. Hyperbolic functions
take their precisions from standard formulae as derived forms.

Primitives:

| function   | precision      | domain              | prec qual     |
|------------+----------------+---------------------+---------------|
| sin(x)     | 2^-11          | -pi <= x <= pi      | highp         |
|            | 2^-12 * abs(x) | elsewhere           | highp         |
|            | 2 ULP          |                     | mediump, lowp |
| cos(x)     | 2^-11          | -pi <= x <= pi      | highp         |
|            | 2^-12 * abs(x) | elsewhere           | highp         |
|            | 2 ULP          |                     | mediump, lowp |
| asin(x)    | 4 ULP          | -1 <= x <= 1        | highp         |
|            | 2 ULP          | -1 <= x <= 1        | mediump, lowp |
| acos(x)    | 4 ULP          | -1 <= x <= 1        | highp         |
|            | 2 ULP          | -1 <= x <= 1        | mediump, lowp |
| atan(x, y) | 6 ULP          | !(x == 0 && y == 0) | highp         |
|            | 2 ULP          | !(x == 0 && y == 0) | mediump, lowp |
| atan(x)    | 5 ULP          |                     | highp         |
|            | 2 ULP          |                     | mediump, lowp |

Derived functions:

| function   | defined as                       |
|------------+----------------------------------|
| radians(x) | (pi / 180.0) * x                 |
| degrees(x) | (180.0 / pi) * x                 |
| tan(x)     | sin(x) * (1.0 / cos(x))          |
| sinh(x)    | (exp(x) - exp(-x)) / 2.0         |
| cosh(x)    | (exp(x) + exp(-x)) / 2.0         |
| tanh(x)    | sinh(x) / cosh(x)                |
| asinh(x)   | log(x + sqrt(x * x + 1.0))       |
| acosh(x)   | log(x + sqrt((x+1.0) * (x-1.0))) |
| atanh(x)   | 0.5 * log(1.0 + x / (1.0 - x))   |


* Exponential functions

The precisions for exponential functions for mediump and lowp have been
adapted from the OpenCL half-float specification.

Primitives:

| function       | precision            | domain               | prec qual |
|----------------+----------------------+----------------------+-----------|
| exp(x)         | (3 + 2 * abs(x)) ULP |                      | highp     |
|                | (2 + 2 * abs(x)) ULP |                      | mediump   |
|                | 2 ULP                |                      | lowp      |
| log(x)         | 2^-21                | 0.5 <= x && x <= 0.5 | highp     |
|                | 3 ULP                | elsewhere            | highp     |
|                | 2^-7                 | 0.5 <= x && x <= 0.5 | mediump   |
|                | 2 ULP                | elsewhere            | mediump   |
|                | 2 ULP                |                      | lowp      |
| exp(x)         | (3 + 2 * abs(x)) ULP |                      | highp     |
|                | (2 + 2 * abs(x)) ULP |                      | mediump   |
|                | 2 ULP                |                      | lowp      |
| log2(x)        | 2^-21                | 0.5 <= x && x <= 0.5 | highp     |
|                | 3 ULP                | elsewhere            | highp     |
|                | 2^-7                 | 0.5 <= x && x <= 0.5 | mediump   |
|                | 2 ULP                | elsewhere            | mediump   |
|                | 2 ULP                |                      | lowp      |
| inversesqrt(x) | 2 ULP                |                      |           |

Derived functions:

| function | defined as           |
|----------+----------------------|
| pow(x)   | exp2(y * log2(x))    |
| sqrt(x)  | 1.0 / inversesqrt(x) |


* Common functions

The operations that don't do any arithmetic are required to produce
exact results. The round() function is allowed to round in either
direction on a tie.

Primitives:

| function         | precision |
|------------------+-----------|
| abs(x)           |         0 |
| sign(x)          |         0 |
| floor(x)         |         0 |
| trunc(x)         |         0 |
| round(x)         |   special |
| roundEven(x)     |         0 |
| ceil(x)          |         0 |
| modf(x, i)       |         0 |
| min(x, y)        |         0 |
| max(x, y)        |         0 |
| clamp(x, lo, hi) |         0 |
| step(edge, x)    |         0 |

Derived functions:

| function              | defined as                                     |
|-----------------------+------------------------------------------------|
| fract(x)              | x - floor(x)                                   |
| mod(x, y)             | x - y * floor(x / y)                           |
| mix(x, y, a)          | x * (1 - a) + y * a                            |
| smoothstep(e0, e1, x) | { float t = clamp((x - e0) / (e1 - e0),0,1);   |
|                       |   return t * t * (3 - 2*t);                  } |


* Geometric and matrix functions

These are generally defined as derived forms with reference algorithms.
For determinant and inverse operations only 2x2 matrices are tested:
there are a number of possible algorithms for larger matrices, and the
specification does not provide precision requirements for these operations.
