xref: /aosp_15_r20/external/deqp/doc/testspecs/GLES3/functional.shaders.builtin_functions.precision.txt (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard WorkerdrawElements Quality Program Test Specification
3*35238bceSAndroid Build Coastguard Worker-----------------------------------------------
4*35238bceSAndroid Build Coastguard Worker
5*35238bceSAndroid Build Coastguard WorkerCopyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker
7*35238bceSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard WorkerYou may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker
11*35238bceSAndroid Build Coastguard Worker     http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker
13*35238bceSAndroid Build Coastguard WorkerUnless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Workerlimitations under the License.
18*35238bceSAndroid Build Coastguard Worker-------------------------------------------------------------------------
19*35238bceSAndroid Build Coastguard Worker    Precision tests for built-in functions
20*35238bceSAndroid Build Coastguard Worker
21*35238bceSAndroid Build Coastguard WorkerTests:
22*35238bceSAndroid Build Coastguard Worker + dEQP-GLES3.functional.shaders.builtin_functions.precision.*
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker
25*35238bceSAndroid Build Coastguard WorkerThese tests check that the GLSL built-in numerical functions produce
26*35238bceSAndroid Build Coastguard Workerresults that are compliant with the range and precision requirements in
27*35238bceSAndroid Build Coastguard Workerthe GLSL ES specification.
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard WorkerThe tests operate by calling the functions with predefined (mostly
30*35238bceSAndroid Build Coastguard Workerrandom) input values in either the vertex or the fragment shader. The
31*35238bceSAndroid Build Coastguard Workerresult is stored in a transform feedback buffer or in a framebuffer
32*35238bceSAndroid Build Coastguard Workerpixel, and then read and compared to a reference interval of acceptable
33*35238bceSAndroid Build Coastguard Workervalues. Functions are tested with all possible vector and matrix sizes.
34*35238bceSAndroid Build Coastguard WorkerIn the test log floating point numbers are printed out as hexadecimal
35*35238bceSAndroid Build Coastguard Workerconstants of the form used in e.g. C99.
36*35238bceSAndroid Build Coastguard Worker
37*35238bceSAndroid Build Coastguard WorkerWhere the GLSL specification does not specify a particular precision,
38*35238bceSAndroid Build Coastguard Workerthe tests try to make reasonable requirements. When behavior at
39*35238bceSAndroid Build Coastguard Workerinfinities hasn't been otherwise specified, C99 Appendix F is used as a
40*35238bceSAndroid Build Coastguard Workerreference. Moreover, the highp precision requirements have been adapted
41*35238bceSAndroid Build Coastguard Workerto lowp and mediump precisions even though the GLSL specification
42*35238bceSAndroid Build Coastguard Workerdoesn't provide any guarantees about them. For instance, mediump and
43*35238bceSAndroid Build Coastguard Workerlowp operations are expected to produce either an infinity or the
44*35238bceSAndroid Build Coastguard Workermaximum/minimum value on overflow.
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard WorkerThe acceptable results are constrained further by only allowing values
47*35238bceSAndroid Build Coastguard Workerfrom within the codomain of the function. Thus, for instance, sin(x) is
48*35238bceSAndroid Build Coastguard Workernot allowed to return a number greater than 1 even when when the nominal
49*35238bceSAndroid Build Coastguard Workererror bound would be greater.
50*35238bceSAndroid Build Coastguard Worker
51*35238bceSAndroid Build Coastguard WorkerA number of functions have been defined as derived forms. This means
52*35238bceSAndroid Build Coastguard Workerthat they are required to produce only results that their expansions
53*35238bceSAndroid Build Coastguard Workercould produce, given the precision requirements for the constituent
54*35238bceSAndroid Build Coastguard Worker
55*35238bceSAndroid Build Coastguard Workeroperations.
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker* Arithmetic operations
58*35238bceSAndroid Build Coastguard Worker
59*35238bceSAndroid Build Coastguard WorkerThese are as defined in the GLSL ES specification.
60*35238bceSAndroid Build Coastguard Worker
61*35238bceSAndroid Build Coastguard Worker| operation | precision | domain                      |
62*35238bceSAndroid Build Coastguard Worker|-----------+-----------+-----------------------------|
63*35238bceSAndroid Build Coastguard Worker| x + y     | < 1 ULP   |                             |
64*35238bceSAndroid Build Coastguard Worker| x / y     | 2.5 ULP   | 2^-126 <= abs(y) <= 2^127-1 |
65*35238bceSAndroid Build Coastguard Worker| x - y     | < 1 ULP   |                             |
66*35238bceSAndroid Build Coastguard Worker| x * y     | < 1 ULP   |                             |
67*35238bceSAndroid Build Coastguard Worker
68*35238bceSAndroid Build Coastguard Worker
69*35238bceSAndroid Build Coastguard Worker* Trigonometric functions
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard WorkerThe precisions for trigonometric functions have been adapted from OpenCL
72*35238bceSAndroid Build Coastguard Workerfast relaxed math and half-float specifications. Hyperbolic functions
73*35238bceSAndroid Build Coastguard Workertake their precisions from standard formulae as derived forms.
74*35238bceSAndroid Build Coastguard Worker
75*35238bceSAndroid Build Coastguard WorkerPrimitives:
76*35238bceSAndroid Build Coastguard Worker
77*35238bceSAndroid Build Coastguard Worker| function   | precision      | domain              | prec qual     |
78*35238bceSAndroid Build Coastguard Worker|------------+----------------+---------------------+---------------|
79*35238bceSAndroid Build Coastguard Worker| sin(x)     | 2^-11          | -pi <= x <= pi      | highp         |
80*35238bceSAndroid Build Coastguard Worker|            | 2^-12 * abs(x) | elsewhere           | highp         |
81*35238bceSAndroid Build Coastguard Worker|            | 2 ULP          |                     | mediump, lowp |
82*35238bceSAndroid Build Coastguard Worker| cos(x)     | 2^-11          | -pi <= x <= pi      | highp         |
83*35238bceSAndroid Build Coastguard Worker|            | 2^-12 * abs(x) | elsewhere           | highp         |
84*35238bceSAndroid Build Coastguard Worker|            | 2 ULP          |                     | mediump, lowp |
85*35238bceSAndroid Build Coastguard Worker| asin(x)    | 4 ULP          | -1 <= x <= 1        | highp         |
86*35238bceSAndroid Build Coastguard Worker|            | 2 ULP          | -1 <= x <= 1        | mediump, lowp |
87*35238bceSAndroid Build Coastguard Worker| acos(x)    | 4 ULP          | -1 <= x <= 1        | highp         |
88*35238bceSAndroid Build Coastguard Worker|            | 2 ULP          | -1 <= x <= 1        | mediump, lowp |
89*35238bceSAndroid Build Coastguard Worker| atan(x, y) | 6 ULP          | !(x == 0 && y == 0) | highp         |
90*35238bceSAndroid Build Coastguard Worker|            | 2 ULP          | !(x == 0 && y == 0) | mediump, lowp |
91*35238bceSAndroid Build Coastguard Worker| atan(x)    | 5 ULP          |                     | highp         |
92*35238bceSAndroid Build Coastguard Worker|            | 2 ULP          |                     | mediump, lowp |
93*35238bceSAndroid Build Coastguard Worker
94*35238bceSAndroid Build Coastguard WorkerDerived functions:
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker| function   | defined as                       |
97*35238bceSAndroid Build Coastguard Worker|------------+----------------------------------|
98*35238bceSAndroid Build Coastguard Worker| radians(x) | (pi / 180.0) * x                 |
99*35238bceSAndroid Build Coastguard Worker| degrees(x) | (180.0 / pi) * x                 |
100*35238bceSAndroid Build Coastguard Worker| tan(x)     | sin(x) * (1.0 / cos(x))          |
101*35238bceSAndroid Build Coastguard Worker| sinh(x)    | (exp(x) - exp(-x)) / 2.0         |
102*35238bceSAndroid Build Coastguard Worker| cosh(x)    | (exp(x) + exp(-x)) / 2.0         |
103*35238bceSAndroid Build Coastguard Worker| tanh(x)    | sinh(x) / cosh(x)                |
104*35238bceSAndroid Build Coastguard Worker| asinh(x)   | log(x + sqrt(x * x + 1.0))       |
105*35238bceSAndroid Build Coastguard Worker| acosh(x)   | log(x + sqrt((x+1.0) * (x-1.0))) |
106*35238bceSAndroid Build Coastguard Worker| atanh(x)   | 0.5 * log(1.0 + x / (1.0 - x))   |
107*35238bceSAndroid Build Coastguard Worker
108*35238bceSAndroid Build Coastguard Worker
109*35238bceSAndroid Build Coastguard Worker* Exponential functions
110*35238bceSAndroid Build Coastguard Worker
111*35238bceSAndroid Build Coastguard WorkerThe precisions for exponential functions for mediump and lowp have been
112*35238bceSAndroid Build Coastguard Workeradapted from the OpenCL half-float specification.
113*35238bceSAndroid Build Coastguard Worker
114*35238bceSAndroid Build Coastguard WorkerPrimitives:
115*35238bceSAndroid Build Coastguard Worker
116*35238bceSAndroid Build Coastguard Worker| function       | precision            | domain               | prec qual |
117*35238bceSAndroid Build Coastguard Worker|----------------+----------------------+----------------------+-----------|
118*35238bceSAndroid Build Coastguard Worker| exp(x)         | (3 + 2 * abs(x)) ULP |                      | highp     |
119*35238bceSAndroid Build Coastguard Worker|                | (2 + 2 * abs(x)) ULP |                      | mediump   |
120*35238bceSAndroid Build Coastguard Worker|                | 2 ULP                |                      | lowp      |
121*35238bceSAndroid Build Coastguard Worker| log(x)         | 2^-21                | 0.5 <= x && x <= 0.5 | highp     |
122*35238bceSAndroid Build Coastguard Worker|                | 3 ULP                | elsewhere            | highp     |
123*35238bceSAndroid Build Coastguard Worker|                | 2^-7                 | 0.5 <= x && x <= 0.5 | mediump   |
124*35238bceSAndroid Build Coastguard Worker|                | 2 ULP                | elsewhere            | mediump   |
125*35238bceSAndroid Build Coastguard Worker|                | 2 ULP                |                      | lowp      |
126*35238bceSAndroid Build Coastguard Worker| exp(x)         | (3 + 2 * abs(x)) ULP |                      | highp     |
127*35238bceSAndroid Build Coastguard Worker|                | (2 + 2 * abs(x)) ULP |                      | mediump   |
128*35238bceSAndroid Build Coastguard Worker|                | 2 ULP                |                      | lowp      |
129*35238bceSAndroid Build Coastguard Worker| log2(x)        | 2^-21                | 0.5 <= x && x <= 0.5 | highp     |
130*35238bceSAndroid Build Coastguard Worker|                | 3 ULP                | elsewhere            | highp     |
131*35238bceSAndroid Build Coastguard Worker|                | 2^-7                 | 0.5 <= x && x <= 0.5 | mediump   |
132*35238bceSAndroid Build Coastguard Worker|                | 2 ULP                | elsewhere            | mediump   |
133*35238bceSAndroid Build Coastguard Worker|                | 2 ULP                |                      | lowp      |
134*35238bceSAndroid Build Coastguard Worker| inversesqrt(x) | 2 ULP                |                      |           |
135*35238bceSAndroid Build Coastguard Worker
136*35238bceSAndroid Build Coastguard WorkerDerived functions:
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Worker| function | defined as           |
139*35238bceSAndroid Build Coastguard Worker|----------+----------------------|
140*35238bceSAndroid Build Coastguard Worker| pow(x)   | exp2(y * log2(x))    |
141*35238bceSAndroid Build Coastguard Worker| sqrt(x)  | 1.0 / inversesqrt(x) |
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker
144*35238bceSAndroid Build Coastguard Worker* Common functions
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard WorkerThe operations that don't do any arithmetic are required to produce
147*35238bceSAndroid Build Coastguard Workerexact results. The round() function is allowed to round in either
148*35238bceSAndroid Build Coastguard Workerdirection on a tie.
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard WorkerPrimitives:
151*35238bceSAndroid Build Coastguard Worker
152*35238bceSAndroid Build Coastguard Worker| function         | precision |
153*35238bceSAndroid Build Coastguard Worker|------------------+-----------|
154*35238bceSAndroid Build Coastguard Worker| abs(x)           |         0 |
155*35238bceSAndroid Build Coastguard Worker| sign(x)          |         0 |
156*35238bceSAndroid Build Coastguard Worker| floor(x)         |         0 |
157*35238bceSAndroid Build Coastguard Worker| trunc(x)         |         0 |
158*35238bceSAndroid Build Coastguard Worker| round(x)         |   special |
159*35238bceSAndroid Build Coastguard Worker| roundEven(x)     |         0 |
160*35238bceSAndroid Build Coastguard Worker| ceil(x)          |         0 |
161*35238bceSAndroid Build Coastguard Worker| modf(x, i)       |         0 |
162*35238bceSAndroid Build Coastguard Worker| min(x, y)        |         0 |
163*35238bceSAndroid Build Coastguard Worker| max(x, y)        |         0 |
164*35238bceSAndroid Build Coastguard Worker| clamp(x, lo, hi) |         0 |
165*35238bceSAndroid Build Coastguard Worker| step(edge, x)    |         0 |
166*35238bceSAndroid Build Coastguard Worker
167*35238bceSAndroid Build Coastguard WorkerDerived functions:
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker| function              | defined as                                     |
170*35238bceSAndroid Build Coastguard Worker|-----------------------+------------------------------------------------|
171*35238bceSAndroid Build Coastguard Worker| fract(x)              | x - floor(x)                                   |
172*35238bceSAndroid Build Coastguard Worker| mod(x, y)             | x - y * floor(x / y)                           |
173*35238bceSAndroid Build Coastguard Worker| mix(x, y, a)          | x * (1 - a) + y * a                            |
174*35238bceSAndroid Build Coastguard Worker| smoothstep(e0, e1, x) | { float t = clamp((x - e0) / (e1 - e0),0,1);   |
175*35238bceSAndroid Build Coastguard Worker|                       |   return t * t * (3 - 2*t);                  } |
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker
178*35238bceSAndroid Build Coastguard Worker* Geometric and matrix functions
179*35238bceSAndroid Build Coastguard Worker
180*35238bceSAndroid Build Coastguard WorkerThese are generally defined as derived forms with reference algorithms.
181*35238bceSAndroid Build Coastguard WorkerFor determinant and inverse operations only 2x2 matrices are tested:
182*35238bceSAndroid Build Coastguard Workerthere are a number of possible algorithms for larger matrices, and the
183*35238bceSAndroid Build Coastguard Workerspecification does not provide precision requirements for these operations.
184