| ------------------------------------------------------------------------- |
| 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. |
| ------------------------------------------------------------------------- |
| Shader operator performance tests |
| |
| Tests: |
| + dEQP-GLES3.performance.shaders.operator.* |
| |
| Includes: |
| + Arithmetic operators in vertex and fragment shaders |
| - Scalar and vector types |
| + Computation-only built-in functions |
| |
| Excludes: |
| + Texture lookup built-in functions |
| - Covered in performance.texture. |
| + Certain built-in functions; to be added in the future |
| - modf |
| - functions with uint/uvec* return or parameter types |
| - matrix functions that also deal with non-matrices (e.g. outerProduct) |
| |
| Description: |
| |
| Each test case draws multiple times with different workload sizes. A workload |
| size means the iteration count of a uniform loop in the shader. Time for each |
| frame is measured, and the slope of the workload size vs frame time data is |
| estimated. This slope tells us the estimated increase in frame time caused by |
| a workload increase of 1 loop iteration. |
| |
| Generally, the shaders contain not just the operation we're interested in (e.g. |
| addition) but also some other things (e.g. loop overhead). To eliminate this |
| cost, we actually do the measurements described above paragraph with two |
| programs, which contain different amounts of computation in the loop. Then we |
| can compute the cost of just one operation by appropriately subtracting the |
| estimated slopes, and dividing by the operation count difference between the |
| two programs. |
| |
| At this point, the result tells us the increase in frame time caused by the |
| addition of one operation. Dividing this by the amount of draw calls in a frame, |
| and further by the amount of vertices or fragments in a draw call, we get the |
| time cost of one operation. |
| |
| In reality, there sometimes isn't just a trivial linear dependence between |
| workload size and frame time. Instead, there tends to be some amount of initial |
| "free" operations. That is, it may be that all workload sizes below some number |
| C yield the same frame time, and only workload sizes beyond C increase the frame |
| time in a supposedly linear manner. Graphically, this means that there graph |
| consists of two parts: a horizontal left part, and a linearly increasing right |
| part; the right part starts where the left parts ends. The principal task of |
| these tests is to look at the slope of the increasing right part. Additionally |
| an estimate for the amount of initial free operations is calculated. Note that |
| it is also normal to get graphs where the horizontal left part is of zero width, |
| i.e. there are no free operations. |
| |
| Note that the tests use several fixed constants, such as the extent to which the |
| loops in the shaders are unrolled. These may not be the most suitable for all |
| platforms, and can be modified near the top of es2pShaderOperatorTests.cpp . |
| |
| The unit of the test result is millions of operations per second. |
| |
| See performance.txt for more details on shader performance testing. |