1e5c31af7Sopenharmony_ci-------------------------------------------------------------------------
2e5c31af7Sopenharmony_cidrawElements Quality Program Test Specification
3e5c31af7Sopenharmony_ci-----------------------------------------------
4e5c31af7Sopenharmony_ci
5e5c31af7Sopenharmony_ciCopyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci
7e5c31af7Sopenharmony_ciLicensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ciyou may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ciYou may obtain a copy of the License at
10e5c31af7Sopenharmony_ci
11e5c31af7Sopenharmony_ci     http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci
13e5c31af7Sopenharmony_ciUnless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_cidistributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ciWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ciSee the License for the specific language governing permissions and
17e5c31af7Sopenharmony_cilimitations under the License.
18e5c31af7Sopenharmony_ci-------------------------------------------------------------------------
19e5c31af7Sopenharmony_ci    Shader operator performance tests
20e5c31af7Sopenharmony_ci
21e5c31af7Sopenharmony_ciTests:
22e5c31af7Sopenharmony_ci + dEQP-GLES3.performance.shaders.operator.*
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ciIncludes:
25e5c31af7Sopenharmony_ci + Arithmetic operators in vertex and fragment shaders
26e5c31af7Sopenharmony_ci   - Scalar and vector types
27e5c31af7Sopenharmony_ci + Computation-only built-in functions
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_ciExcludes:
30e5c31af7Sopenharmony_ci + Texture lookup built-in functions
31e5c31af7Sopenharmony_ci   - Covered in performance.texture.
32e5c31af7Sopenharmony_ci + Certain built-in functions; to be added in the future
33e5c31af7Sopenharmony_ci   - modf
34e5c31af7Sopenharmony_ci   - functions with uint/uvec* return or parameter types
35e5c31af7Sopenharmony_ci   - matrix functions that also deal with non-matrices (e.g. outerProduct)
36e5c31af7Sopenharmony_ci
37e5c31af7Sopenharmony_ciDescription:
38e5c31af7Sopenharmony_ci
39e5c31af7Sopenharmony_ciEach test case draws multiple times with different workload sizes. A workload
40e5c31af7Sopenharmony_cisize means the iteration count of a uniform loop in the shader. Time for each
41e5c31af7Sopenharmony_ciframe is measured, and the slope of the workload size vs frame time data is
42e5c31af7Sopenharmony_ciestimated. This slope tells us the estimated increase in frame time caused by
43e5c31af7Sopenharmony_cia workload increase of 1 loop iteration.
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ciGenerally, the shaders contain not just the operation we're interested in (e.g.
46e5c31af7Sopenharmony_ciaddition) but also some other things (e.g. loop overhead). To eliminate this
47e5c31af7Sopenharmony_cicost, we actually do the measurements described above paragraph with two
48e5c31af7Sopenharmony_ciprograms, which contain different amounts of computation in the loop. Then we
49e5c31af7Sopenharmony_cican compute the cost of just one operation by appropriately subtracting the
50e5c31af7Sopenharmony_ciestimated slopes, and dividing by the operation count difference between the
51e5c31af7Sopenharmony_citwo programs.
52e5c31af7Sopenharmony_ci
53e5c31af7Sopenharmony_ciAt this point, the result tells us the increase in frame time caused by the
54e5c31af7Sopenharmony_ciaddition of one operation. Dividing this by the amount of draw calls in a frame,
55e5c31af7Sopenharmony_ciand further by the amount of vertices or fragments in a draw call, we get the
56e5c31af7Sopenharmony_citime cost of one operation.
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ciIn reality, there sometimes isn't just a trivial linear dependence between
59e5c31af7Sopenharmony_ciworkload size and frame time. Instead, there tends to be some amount of initial
60e5c31af7Sopenharmony_ci"free" operations. That is, it may be that all workload sizes below some number
61e5c31af7Sopenharmony_ciC yield the same frame time, and only workload sizes beyond C increase the frame
62e5c31af7Sopenharmony_citime in a supposedly linear manner. Graphically, this means that there graph
63e5c31af7Sopenharmony_ciconsists of two parts: a horizontal left part, and a linearly increasing right
64e5c31af7Sopenharmony_cipart; the right part starts where the left parts ends. The principal task of
65e5c31af7Sopenharmony_cithese tests is to look at the slope of the increasing right part. Additionally
66e5c31af7Sopenharmony_cian estimate for the amount of initial free operations is calculated. Note that
67e5c31af7Sopenharmony_ciit is also normal to get graphs where the horizontal left part is of zero width,
68e5c31af7Sopenharmony_cii.e. there are no free operations.
69e5c31af7Sopenharmony_ci
70e5c31af7Sopenharmony_ciNote that the tests use several fixed constants, such as the extent to which the
71e5c31af7Sopenharmony_ciloops in the shaders are unrolled. These may not be the most suitable for all
72e5c31af7Sopenharmony_ciplatforms, and can be modified near the top of es2pShaderOperatorTests.cpp .
73e5c31af7Sopenharmony_ci
74e5c31af7Sopenharmony_ciThe unit of the test result is millions of operations per second.
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_ciSee performance.txt for more details on shader performance testing.
77