19c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis/* 29c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Copyright (C) 2012 The Android Open Source Project 39c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * 49c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 59c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * you may not use this file except in compliance with the License. 69c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * You may obtain a copy of the License at 79c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * 89c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 99c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * 109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Unless required by applicable law or agreed to in writing, software 119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * See the License for the specific language governing permissions and 149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * limitations under the License. 159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis */ 169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#define ATRACE_TAG ATRACE_TAG_ALWAYS 189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <gui/Surface.h> 20b7daa0dadebdb043d63e585975a128c5fc087168Mathias Agopian#include <gui/SurfaceControl.h> 219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <gui/GLConsumer.h> 22e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <ui/Fence.h> 249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <utils/Trace.h> 259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <EGL/egl.h> 279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <GLES2/gl2.h> 289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <math.h> 309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <getopt.h> 319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "Flatland.h" 339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "GLHelper.h" 349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisusing namespace ::android; 369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic uint32_t g_SleepBetweenSamplesMs = 0; 389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic bool g_PresentToWindow = false; 399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic size_t g_BenchmarkNameLen = 0; 409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstruct BenchmarkDesc { 429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The name of the test. 439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const char* name; 449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The dimensions of the space in which window layers are specified. 469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t width; 479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t height; 489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The screen heights at which to run the test. 509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t runHeights[MAX_TEST_RUNS]; 519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The list of window layers. 539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis LayerDesc layers[MAX_NUM_LAYERS]; 549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic const BenchmarkDesc benchmarks[] = { 579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { "16:10 Single Static Window", 5863d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling 2560, 1600, { 800, 1200, 1600, 2400 }, 599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Window 619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Status bar 659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 0, 2560, 50, 679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Navigation bar 699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 1504, 2560, 96, 719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 75b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchand { "4:3 Single Static Window", 767bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 2048, 1536, { 1536 }, 777bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { 787bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Window 797bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 807bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 50, 2048, 1440, 817bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 827bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Status bar 837bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 847bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 0, 2048, 50, 857bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 867bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Navigation bar 877bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 887bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 1440, 2048, 96, 897bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 907bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 917bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 927bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { "16:10 App -> Home Transition", 9463d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling 2560, 1600, { 800, 1200, 1600, 2400 }, 959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Wallpaper 979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Launcher 1019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blend, 1029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 1039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Outgoing activity 1059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blendShrink, 1069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 20, 70, 2520, 1414, 1079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Status bar 1099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 1109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 0, 2560, 50, 1119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Navigation bar 1139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 1149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 1504, 2560, 96, 1159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 119b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchand { "4:3 App -> Home Transition", 1207bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 2048, 1536, { 1536 }, 1217bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { 1227bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Wallpaper 1237bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 1247bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 50, 2048, 1440, 1257bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1267bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Launcher 1277bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, blend, 1287bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 50, 2048, 1440, 1297bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1307bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Outgoing activity 1317bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, blendShrink, 1327bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 20, 70, 2048, 1400, 1337bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1347bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Status bar 1357bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 1367bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 0, 2048, 50, 1377bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1387bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Navigation bar 1397bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 1407bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 1440, 2048, 96, 1417bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1427bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1437bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1447bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { "16:10 SurfaceView -> Home Transition", 14663d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling 2560, 1600, { 800, 1200, 1600, 2400 }, 1479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 1489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Wallpaper 1499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 1509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 1519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Launcher 1539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blend, 1549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 1559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Outgoing SurfaceView 1579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blendShrink, 1589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 20, 70, 2520, 1414, 1599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Outgoing activity 1619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blendShrink, 1629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 20, 70, 2520, 1414, 1639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Status bar 1659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 1669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 0, 2560, 50, 1679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Navigation bar 1699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 1709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 1504, 2560, 96, 1719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1747bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 175b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchand { "4:3 SurfaceView -> Home Transition", 1767bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 2048, 1536, { 1536 }, 1777bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { 1787bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Wallpaper 1797bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 1807bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 50, 2048, 1440, 1817bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1827bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Launcher 1837bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, blend, 1847bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 50, 2048, 1440, 1857bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1867bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Outgoing SurfaceView 1877bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, blendShrink, 1887bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 20, 70, 2048, 1400, 1897bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1907bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Outgoing activity 1917bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, blendShrink, 1927bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 20, 70, 2048, 1400, 1937bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1947bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Status bar 1957bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 1967bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 0, 2048, 50, 1977bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 1987bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling { // Navigation bar 1997bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, staticGradient, opaque, 2007bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 0, 1440, 2048, 96, 2017bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 2027bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 2037bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }, 2049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 2059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic const ShaderDesc shaders[] = { 2079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 2082660c7a85bd449e67df74c91d00309c443c1bb5aAurimas Liutikas .name="Blit", 2092660c7a85bd449e67df74c91d00309c443c1bb5aAurimas Liutikas .vertexShader={ 2109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "precision mediump float;", 2119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "attribute vec4 position;", 2139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "attribute vec4 uv;", 2149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "varying vec4 texCoords;", 2169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform mat4 objToNdc;", 2189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform mat4 uvToTex;", 2199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "void main() {", 2219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_Position = objToNdc * position;", 2229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " texCoords = uvToTex * uv;", 2239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "}", 2249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 2252660c7a85bd449e67df74c91d00309c443c1bb5aAurimas Liutikas .fragmentShader={ 2269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "#extension GL_OES_EGL_image_external : require", 2279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "precision mediump float;", 2289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "varying vec4 texCoords;", 2309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform samplerExternalOES blitSrc;", 2329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform vec4 modColor;", 2339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "void main() {", 2359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_FragColor = texture2D(blitSrc, texCoords.xy);", 2369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_FragColor *= modColor;", 2379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "}", 2389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 2399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 2409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 2422660c7a85bd449e67df74c91d00309c443c1bb5aAurimas Liutikas .name="Gradient", 2432660c7a85bd449e67df74c91d00309c443c1bb5aAurimas Liutikas .vertexShader={ 2449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "precision mediump float;", 2459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "attribute vec4 position;", 2479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "attribute vec4 uv;", 2489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "varying float interp;", 2509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform mat4 objToNdc;", 2529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform mat4 uvToInterp;", 2539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "void main() {", 2559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_Position = objToNdc * position;", 2569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " interp = (uvToInterp * uv).x;", 2579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "}", 2589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 2592660c7a85bd449e67df74c91d00309c443c1bb5aAurimas Liutikas .fragmentShader={ 2609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "precision mediump float;", 2619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "varying float interp;", 2639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform vec4 color0;", 2659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform vec4 color1;", 2669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform sampler2D ditherKernel;", 2689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform float invDitherKernelSize;", 2699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform float invDitherKernelSizeSq;", 2709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 2719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "void main() {", 2729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " float dither = texture2D(ditherKernel,", 2739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_FragCoord.xy * invDitherKernelSize).a;", 2749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " dither *= invDitherKernelSizeSq;", 2759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " vec4 color = mix(color0, color1, clamp(interp, 0.0, 1.0));", 2769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_FragColor = color + vec4(dither, dither, dither, 0.0);", 2779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "}", 2789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 2799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 2809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 2819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass Layer { 2839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennispublic: 2859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Layer() : 2879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mFirstFrame(true), 2889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper(NULL), 2899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSurface(EGL_NO_SURFACE) { 2909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool setUp(const LayerDesc& desc, GLHelper* helper) { 2939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool result; 2949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mDesc = desc; 2969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper = helper; 2979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->createSurfaceTexture(mDesc.width, mDesc.height, 2999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis &mGLConsumer, &mSurface, &mTexName); 3009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 3019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mRenderer = desc.rendererFactory(); 3059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mRenderer->setUp(helper); 3069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 3079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mComposer = desc.composerFactory(); 3119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mComposer->setUp(desc, helper); 3129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 3139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 3179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis void tearDown() { 3209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mComposer != NULL) { 3219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mComposer->tearDown(); 3229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis delete mComposer; 3239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mComposer = NULL; 3249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mRenderer != NULL) { 3279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mRenderer->tearDown(); 3289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis delete mRenderer; 3299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mRenderer = NULL; 3309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mSurface != EGL_NO_SURFACE) { 3339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper->destroySurface(&mSurface); 3349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLConsumer->abandon(); 3359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper = NULL; 3379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLConsumer.clear(); 3389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool render() { 3419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mRenderer->render(mSurface); 3429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool prepareComposition() { 3459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis status_t err; 3469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis err = mGLConsumer->updateTexImage(); 3489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (err < 0) { 3499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "GLConsumer::updateTexImage error: %d\n", err); 3509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 3549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool compose() { 3579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mComposer->compose(mTexName, mGLConsumer); 3589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisprivate: 3619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool mFirstFrame; 3629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis LayerDesc mDesc; 3649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis GLHelper* mGLHelper; 3669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis GLuint mTexName; 3689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<GLConsumer> mGLConsumer; 3699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis EGLSurface mSurface; 3709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Renderer* mRenderer; 3729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Composer* mComposer; 3739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 3749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass BenchmarkRunner { 3769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennispublic: 3789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis BenchmarkRunner(const BenchmarkDesc& desc, size_t instance) : 3809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mDesc(desc), 3819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mInstance(instance), 3829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumLayers(countLayers(desc)), 3839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper(NULL), 3849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSurface(EGL_NO_SURFACE), 3859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mWindowSurface(EGL_NO_SURFACE) { 3869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool setUp() { 3899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ATRACE_CALL(); 3909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool result; 3929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis EGLint resulte; 3939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis float scaleFactor = float(mDesc.runHeights[mInstance]) / 3959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis float(mDesc.height); 3969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t w = uint32_t(scaleFactor * float(mDesc.width)); 3979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t h = mDesc.runHeights[mInstance]; 3989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper = new GLHelper(); 4009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->setUp(shaders, NELEMS(shaders)); 4019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis GLuint texName; 4069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->createSurfaceTexture(w, h, &mGLConsumer, &mSurface, 4079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis &texName); 4089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 4139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Scale the layer to match the current screen size. 4149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis LayerDesc ld = mDesc.layers[i]; 4159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ld.x = int32_t(scaleFactor * float(ld.x)); 4169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ld.y = int32_t(scaleFactor * float(ld.y)); 4179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ld.width = uint32_t(scaleFactor * float(ld.width)); 4189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ld.height = uint32_t(scaleFactor * float(ld.height)); 4199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Set up the layer. 4219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mLayers[i].setUp(ld, mGLHelper); 4229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (g_PresentToWindow) { 4289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->createWindowSurface(w, h, &mSurfaceControl, 4299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis &mWindowSurface); 4309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = doFrame(mWindowSurface); 4359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 4419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis void tearDown() { 4449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ATRACE_CALL(); 4459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 4479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLayers[i].tearDown(); 4489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mGLHelper != NULL) { 4519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mWindowSurface != EGL_NO_SURFACE) { 4529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper->destroySurface(&mWindowSurface); 4539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper->destroySurface(&mSurface); 4559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLConsumer->abandon(); 4569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLConsumer.clear(); 4579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSurfaceControl.clear(); 4589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper->tearDown(); 4599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis delete mGLHelper; 4609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper = NULL; 4619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis nsecs_t run(uint32_t warmUpFrames, uint32_t totalFrames) { 4659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ATRACE_CALL(); 4669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool result; 4689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis status_t err; 4699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis resetColorGenerator(); 4719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Do the warm-up frames. 4739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (uint32_t i = 0; i < warmUpFrames; i++) { 4749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = doFrame(mSurface); 4759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return -1; 4779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Grab the fence for the start timestamp. 4819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<Fence> startFence = mGLConsumer->getCurrentFence(); 4829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // the timed frames. 4849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (uint32_t i = warmUpFrames; i < totalFrames; i++) { 4859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = doFrame(mSurface); 4869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return -1; 4889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Grab the fence for the end timestamp. 4929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<Fence> endFence = mGLConsumer->getCurrentFence(); 4939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Keep doing frames until the end fence has signaled. 4959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis while (endFence->wait(0) == -ETIME) { 4969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = doFrame(mSurface); 4979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return -1; 4999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Compute the time delta. 5039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis nsecs_t startTime = startFence->getSignalTime(); 5049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis nsecs_t endTime = endFence->getSignalTime(); 5059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return endTime - startTime; 5079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisprivate: 5109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool doFrame(EGLSurface surface) { 5129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool result; 5139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis status_t err; 5149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 5169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mLayers[i].render(); 5179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 5189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 5199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 5239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mLayers[i].prepareComposition(); 5249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 5259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 5269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->makeCurrent(surface); 5309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 5319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 5329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis glClearColor(1.0f, 0.0f, 0.0f, 0.0f); 5359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis glClear(GL_COLOR_BUFFER_BIT); 5369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 5389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mLayers[i].compose(); 5399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 5409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 5419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->swapBuffers(surface); 5459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 5469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 5479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis err = mGLConsumer->updateTexImage(); 5509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (err < 0) { 5519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "GLConsumer::updateTexImage error: %d\n", err); 5529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 5539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 5569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis static size_t countLayers(const BenchmarkDesc& desc) { 5599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t i; 5609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (i = 0; i < MAX_NUM_LAYERS; i++) { 5619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (desc.layers[i].rendererFactory == NULL) { 5629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 5639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return i; 5669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const BenchmarkDesc& mDesc; 5699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const size_t mInstance; 5709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const size_t mNumLayers; 5719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis GLHelper* mGLHelper; 5739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The surface into which layers are composited 5759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<GLConsumer> mGLConsumer; 5769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis EGLSurface mSurface; 5779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Used for displaying the surface to a window. 5799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis EGLSurface mWindowSurface; 5809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<SurfaceControl> mSurfaceControl; 5819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Layer mLayers[MAX_NUM_LAYERS]; 5839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 5849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic int cmpDouble(const double* lhs, const double* rhs) { 5869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (*lhs < *rhs) { 5879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return -1; 5889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else if (*rhs < *lhs) { 5899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return 1; 5909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return 0; 5929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis// Run a single benchmark and print the result. 5959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic bool runTest(const BenchmarkDesc b, size_t run) { 5969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool success = true; 5979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis double prevResult = 0.0, result = 0.0; 5989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Vector<double> samples; 5999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t runHeight = b.runHeights[run]; 6019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t runWidth = b.width * runHeight / b.height; 60292dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn printf(" %-*s | %4d x %4d | ", static_cast<int>(g_BenchmarkNameLen), b.name, 6039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis runWidth, runHeight); 6049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fflush(stdout); 6059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis BenchmarkRunner r(b, run); 6079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!r.setUp()) { 6089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "error initializing runner.\n"); 6099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 6109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The slowest 1/outlierFraction sample results are ignored as potential 6139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // outliers. 6149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const uint32_t outlierFraction = 16; 6159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const double threshold = .0025; 6169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t warmUpFrames = 1; 6189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t totalFrames = 5; 6199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Find the number of frames needed to run for over 100ms. 6219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis double runTime = 0.0; 6229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis while (true) { 6239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis runTime = double(r.run(warmUpFrames, totalFrames)); 6249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (runTime < 50e6) { 6259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis warmUpFrames *= 2; 6269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis totalFrames *= 2; 6279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else { 6289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 6299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (totalFrames - warmUpFrames > 16) { 6349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The test runs too fast to get a stable result. Skip it. 6359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" fast"); 6369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis goto done; 6379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else if (totalFrames == 5 && runTime > 200e6) { 6389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The test runs too slow to be very useful. Skip it. 6399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" slow"); 6409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis goto done; 6419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis do { 6449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t newSamples = samples.size(); 6459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (newSamples == 0) { 6469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis newSamples = 4*outlierFraction; 6479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (newSamples > 512) { 6509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf("varies"); 6519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis goto done; 6529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < newSamples; i++) { 6559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis double sample = double(r.run(warmUpFrames, totalFrames)); 6569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (g_SleepBetweenSamplesMs > 0) { 6589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis usleep(g_SleepBetweenSamplesMs * 1000); 6599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (sample < 0.0) { 6629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis success = false; 6639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis goto done; 6649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis samples.add(sample); 6679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis samples.sort(cmpDouble); 6709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis prevResult = result; 6729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t elem = (samples.size() * (outlierFraction-1) / outlierFraction); 6739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = (samples[elem-1] + samples[elem]) * 0.5; 6749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } while (fabs(result - prevResult) > threshold * result); 6759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf("%6.3f", result / double(totalFrames - warmUpFrames) / 1e6); 6779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisdone: 6799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf("\n"); 6819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fflush(stdout); 6829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis r.tearDown(); 6839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return success; 6859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic void printResultsTableHeader() { 6889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const char* scenario = "Scenario"; 6899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t len = strlen(scenario); 6909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t leftPad = (g_BenchmarkNameLen - len) / 2; 6919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t rightPad = g_BenchmarkNameLen - len - leftPad; 69292dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn printf(" %*s%s%*s | Resolution | Time (ms)\n", 69392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn static_cast<int>(leftPad), "", 69492dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn "Scenario", static_cast<int>(rightPad), ""); 6959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis// Run ALL the benchmarks! 6989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic bool runTests() { 6999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printResultsTableHeader(); 7009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < NELEMS(benchmarks); i++) { 7029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const BenchmarkDesc& b = benchmarks[i]; 7039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t j = 0; j < MAX_TEST_RUNS && b.runHeights[j]; j++) { 7049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!runTest(b, j)) { 7059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 7069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 7109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 7119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis// Return the length longest benchmark name. 7139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic size_t maxBenchmarkNameLen() { 7149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t maxLen = 0; 7159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < NELEMS(benchmarks); i++) { 7169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const BenchmarkDesc& b = benchmarks[i]; 7179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t len = strlen(b.name); 7189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (len > maxLen) { 7199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis maxLen = len; 7209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return maxLen; 7239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 7249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis// Print the command usage help to stderr. 7269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic void showHelp(const char *cmd) { 7279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "usage: %s [options]\n", cmd); 7289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "options include:\n" 7299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " -s N sleep for N ms between samples\n" 7309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " -d display the test frame to a window\n" 7319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " --help print this helpful message and exit\n" 7329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ); 7339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 7349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisint main(int argc, char** argv) { 7369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (argc == 2 && 0 == strcmp(argv[1], "--help")) { 7379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis showHelp(argv[0]); 7389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis exit(0); 7399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (;;) { 7429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int ret; 7439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int option_index = 0; 7449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis static struct option long_options[] = { 7459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis {"help", no_argument, 0, 0 }, 7469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 0, 0, 0, 0 } 7479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }; 7489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ret = getopt_long(argc, argv, "ds:", 7509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis long_options, &option_index); 7519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (ret < 0) { 7539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 7549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch(ret) { 7579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case 'd': 7589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis g_PresentToWindow = true; 7599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 7609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case 's': 7629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis g_SleepBetweenSamplesMs = atoi(optarg); 7639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 7649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case 0: 7669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (strcmp(long_options[option_index].name, "help")) { 7679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis showHelp(argv[0]); 7689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis exit(0); 7699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 7719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 7739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis showHelp(argv[0]); 7749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis exit(2); 7759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis g_BenchmarkNameLen = maxBenchmarkNameLen(); 7799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" cmdline:"); 7819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (int i = 0; i < argc; i++) { 7829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" %s", argv[i]); 7839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf("\n"); 7859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!runTests()) { 7879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "exiting due to error.\n"); 7889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return 1; 7899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 791