| ------------------------------------------------------------------------- |
| 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 compiler performance tests |
| |
| Tests: |
| + dEQP-GLES2.performance.compiler.* |
| |
| Includes: |
| + Shader compile, link and specialization (draw call -time) time measurements |
| + Tests for impact of cache hits on compilation time (note: in release 2012.4) |
| + Front-end time estimation with invalid shaders |
| + Typical use cases |
| - Vertex and fragment lighting |
| - Mandelbrot viewer |
| - Normal mapping, parallax and relief mapping (note: in release 2012.4) |
| + Synthetic cases |
| - A number of texture lookups blended together in fragment shader |
| - Single or nested loops |
| - Single expression consisting of a variable number of vec4 multiplications |
| + Shaders designed to stress compiler (note: in release 2012.4) |
| - High register pressure |
| - Lots of control flow |
| |
| Excludes: |
| + Shader functional testing |
| |
| Description: |
| |
| Shader compiler performance tests measure the time to compile GLSL shader programs. |
| The tests will take into account implementations that postpone final compilation |
| until execution of a draw call. |
| |
| Separate cases are made for testing compilation time when avoiding cache hits and |
| when allowing them (note that tests that allow cache will be in release 2012.4). |
| Cache-avoiding cases use a different shader for different iterations of the same |
| test case, whereas cache-allowing cases use the same shader for all iterations. |
| Cache hits are however only ever allowed between the iterations of a case and not |
| across separate cases. |
| |
| The method for defeating the shader cache is to append a postfix to all uniform, |
| attribute and varying names. The postfix depends on the current time as well as |
| the case that is in question. In case of cache-avoiding cases, the postfix also |
| depends on the current iteration. This method forces at least re-linking. |
| |
| Front-end time is estimated by compiling invalid shaders with either an invalid |
| character at the end of the shader or an invalid statement at the end of the main() |
| block. |
| |
| The result value is the average number of milliseconds used per test case |
| iteration. In cases that allow cache hits the average excludes the first |
| compilation. |
| |
| Before any measurements are done, each test case first draws with a simple dummy |
| shader for warm-up. |
| |
| Overview for valid shader cases: |
| - 1. Create program and shaders; compile and link |
| - 2. Set inputs and draw a small quad |
| - 3. Flush |
| - 4. Repeat without step 1 |
| - 5. Compute difference of times measured for 1-3 and 4 and record it as |
| compilation time |
| - Repeat the above steps several times and compute average |
| |
| Overview for invalid shader cases (front-end time estimation): |
| - 1. Create program and invalid shaders; compile (expect failure) |
| - 2. Record time measured for step 1 |
| - Repeat the above steps several times and compute average |