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