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