| ------------------------------------------------------------------------- |
| 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. |