Main.cpp revision b7daa0dadebdb043d63e585975a128c5fc087168
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/GraphicBufferAlloc.h> 209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <gui/Surface.h> 21b7daa0dadebdb043d63e585975a128c5fc087168Mathias Agopian#include <gui/SurfaceControl.h> 229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <gui/GLConsumer.h> 23e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <ui/Fence.h> 259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <utils/Trace.h> 269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <EGL/egl.h> 289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <GLES2/gl2.h> 299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <math.h> 319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <getopt.h> 329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "Flatland.h" 349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "GLHelper.h" 359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisusing namespace ::android; 379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic uint32_t g_SleepBetweenSamplesMs = 0; 399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic bool g_PresentToWindow = false; 409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic size_t g_BenchmarkNameLen = 0; 419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstruct BenchmarkDesc { 439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The name of the test. 449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const char* name; 459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The dimensions of the space in which window layers are specified. 479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t width; 489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t height; 499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The screen heights at which to run the test. 519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t runHeights[MAX_TEST_RUNS]; 529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The list of window layers. 549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis LayerDesc layers[MAX_NUM_LAYERS]; 559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic const BenchmarkDesc benchmarks[] = { 589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { "16:10 Single Static Window", 599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2560, 1600, { 800, 1600, 2400 }, 609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Window 629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Status bar 669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 0, 2560, 50, 689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Navigation bar 709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 1504, 2560, 96, 729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { "16:10 App -> Home Transition", 779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2560, 1600, { 800, 1600, 2400 }, 789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Wallpaper 809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Launcher 849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blend, 859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Outgoing activity 889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blendShrink, 899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 20, 70, 2520, 1414, 909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Status bar 929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 0, 2560, 50, 949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Navigation bar 969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 1504, 2560, 96, 989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { "16:10 SurfaceView -> Home Transition", 1039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2560, 1600, { 800, 1600, 2400 }, 1049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 1059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Wallpaper 1069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 1079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 1089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Launcher 1109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blend, 1119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 50, 2560, 1454, 1129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Outgoing SurfaceView 1149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blendShrink, 1159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 20, 70, 2520, 1414, 1169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Outgoing activity 1189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, blendShrink, 1199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 20, 70, 2520, 1414, 1209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Status bar 1229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 1239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 0, 2560, 50, 1249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { // Navigation bar 1269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, staticGradient, opaque, 1279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 0, 1504, 2560, 96, 1289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 1329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic const ShaderDesc shaders[] = { 1349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 1359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis name: "Blit", 1369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis vertexShader: { 1379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "precision mediump float;", 1389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "attribute vec4 position;", 1409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "attribute vec4 uv;", 1419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "varying vec4 texCoords;", 1439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform mat4 objToNdc;", 1459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform mat4 uvToTex;", 1469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "void main() {", 1489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_Position = objToNdc * position;", 1499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " texCoords = uvToTex * uv;", 1509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "}", 1519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fragmentShader: { 1539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "#extension GL_OES_EGL_image_external : require", 1549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "precision mediump float;", 1559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "varying vec4 texCoords;", 1579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform samplerExternalOES blitSrc;", 1599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform vec4 modColor;", 1609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "void main() {", 1629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_FragColor = texture2D(blitSrc, texCoords.xy);", 1639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_FragColor *= modColor;", 1649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "}", 1659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 1699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis name: "Gradient", 1709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis vertexShader: { 1719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "precision mediump float;", 1729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "attribute vec4 position;", 1749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "attribute vec4 uv;", 1759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "varying float interp;", 1779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform mat4 objToNdc;", 1799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform mat4 uvToInterp;", 1809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "void main() {", 1829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_Position = objToNdc * position;", 1839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " interp = (uvToInterp * uv).x;", 1849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "}", 1859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 1869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fragmentShader: { 1879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "precision mediump float;", 1889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "varying float interp;", 1909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform vec4 color0;", 1929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform vec4 color1;", 1939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform sampler2D ditherKernel;", 1959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform float invDitherKernelSize;", 1969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "uniform float invDitherKernelSizeSq;", 1979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "", 1989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "void main() {", 1999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " float dither = texture2D(ditherKernel,", 2009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_FragCoord.xy * invDitherKernelSize).a;", 2019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " dither *= invDitherKernelSizeSq;", 2029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " vec4 color = mix(color0, color1, clamp(interp, 0.0, 1.0));", 2039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " gl_FragColor = color + vec4(dither, dither, dither, 0.0);", 2049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "}", 2059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 2069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }, 2079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 2089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass Layer { 2109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennispublic: 2129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Layer() : 2149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mFirstFrame(true), 2159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper(NULL), 2169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSurface(EGL_NO_SURFACE) { 2179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool setUp(const LayerDesc& desc, GLHelper* helper) { 2209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool result; 2219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mDesc = desc; 2239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper = helper; 2249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->createSurfaceTexture(mDesc.width, mDesc.height, 2269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis &mGLConsumer, &mSurface, &mTexName); 2279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 2289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 2299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mRenderer = desc.rendererFactory(); 2329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mRenderer->setUp(helper); 2339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 2349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 2359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mComposer = desc.composerFactory(); 2389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mComposer->setUp(desc, helper); 2399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 2409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 2419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 2449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis void tearDown() { 2479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mComposer != NULL) { 2489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mComposer->tearDown(); 2499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis delete mComposer; 2509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mComposer = NULL; 2519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mRenderer != NULL) { 2549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mRenderer->tearDown(); 2559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis delete mRenderer; 2569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mRenderer = NULL; 2579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mSurface != EGL_NO_SURFACE) { 2609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper->destroySurface(&mSurface); 2619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLConsumer->abandon(); 2629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper = NULL; 2649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLConsumer.clear(); 2659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool render() { 2689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mRenderer->render(mSurface); 2699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool prepareComposition() { 2729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis status_t err; 2739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis err = mGLConsumer->updateTexImage(); 2759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (err < 0) { 2769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "GLConsumer::updateTexImage error: %d\n", err); 2779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 2789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 2819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool compose() { 2849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mComposer->compose(mTexName, mGLConsumer); 2859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisprivate: 2889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool mFirstFrame; 2899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis LayerDesc mDesc; 2919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis GLHelper* mGLHelper; 2939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis GLuint mTexName; 2959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<GLConsumer> mGLConsumer; 2969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis EGLSurface mSurface; 2979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Renderer* mRenderer; 2999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Composer* mComposer; 3009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 3019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisclass BenchmarkRunner { 3039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennispublic: 3059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis BenchmarkRunner(const BenchmarkDesc& desc, size_t instance) : 3079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mDesc(desc), 3089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mInstance(instance), 3099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumLayers(countLayers(desc)), 3109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper(NULL), 3119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSurface(EGL_NO_SURFACE), 3129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mWindowSurface(EGL_NO_SURFACE) { 3139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool setUp() { 3169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ATRACE_CALL(); 3179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool result; 3199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis EGLint resulte; 3209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis float scaleFactor = float(mDesc.runHeights[mInstance]) / 3229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis float(mDesc.height); 3239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t w = uint32_t(scaleFactor * float(mDesc.width)); 3249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t h = mDesc.runHeights[mInstance]; 3259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper = new GLHelper(); 3279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->setUp(shaders, NELEMS(shaders)); 3289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 3299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis GLuint texName; 3339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->createSurfaceTexture(w, h, &mGLConsumer, &mSurface, 3349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis &texName); 3359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 3369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 3409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Scale the layer to match the current screen size. 3419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis LayerDesc ld = mDesc.layers[i]; 3429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ld.x = int32_t(scaleFactor * float(ld.x)); 3439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ld.y = int32_t(scaleFactor * float(ld.y)); 3449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ld.width = uint32_t(scaleFactor * float(ld.width)); 3459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ld.height = uint32_t(scaleFactor * float(ld.height)); 3469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Set up the layer. 3489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mLayers[i].setUp(ld, mGLHelper); 3499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 3509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (g_PresentToWindow) { 3559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->createWindowSurface(w, h, &mSurfaceControl, 3569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis &mWindowSurface); 3579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 3589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = doFrame(mWindowSurface); 3629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 3639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 3649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 3689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis void tearDown() { 3719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ATRACE_CALL(); 3729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 3749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLayers[i].tearDown(); 3759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mGLHelper != NULL) { 3789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mWindowSurface != EGL_NO_SURFACE) { 3799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper->destroySurface(&mWindowSurface); 3809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper->destroySurface(&mSurface); 3829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLConsumer->abandon(); 3839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLConsumer.clear(); 3849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSurfaceControl.clear(); 3859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper->tearDown(); 3869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis delete mGLHelper; 3879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mGLHelper = NULL; 3889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis nsecs_t run(uint32_t warmUpFrames, uint32_t totalFrames) { 3929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ATRACE_CALL(); 3939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool result; 3959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis status_t err; 3969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis resetColorGenerator(); 3989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Do the warm-up frames. 4009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (uint32_t i = 0; i < warmUpFrames; i++) { 4019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = doFrame(mSurface); 4029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return -1; 4049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Grab the fence for the start timestamp. 4089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<Fence> startFence = mGLConsumer->getCurrentFence(); 4099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // the timed frames. 4119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (uint32_t i = warmUpFrames; i < totalFrames; i++) { 4129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = doFrame(mSurface); 4139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return -1; 4159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Grab the fence for the end timestamp. 4199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<Fence> endFence = mGLConsumer->getCurrentFence(); 4209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Keep doing frames until the end fence has signaled. 4229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis while (endFence->wait(0) == -ETIME) { 4239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = doFrame(mSurface); 4249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return -1; 4269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Compute the time delta. 4309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis nsecs_t startTime = startFence->getSignalTime(); 4319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis nsecs_t endTime = endFence->getSignalTime(); 4329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return endTime - startTime; 4349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisprivate: 4379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool doFrame(EGLSurface surface) { 4399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool result; 4409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis status_t err; 4419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 4439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mLayers[i].render(); 4449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 4509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mLayers[i].prepareComposition(); 4519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->makeCurrent(surface); 4579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis glClearColor(1.0f, 0.0f, 0.0f, 0.0f); 4629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis glClear(GL_COLOR_BUFFER_BIT); 4639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < mNumLayers; i++) { 4659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mLayers[i].compose(); 4669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = mGLHelper->swapBuffers(surface); 4729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!result) { 4739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis err = mGLConsumer->updateTexImage(); 4779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (err < 0) { 4789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "GLConsumer::updateTexImage error: %d\n", err); 4799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 4809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 4839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis static size_t countLayers(const BenchmarkDesc& desc) { 4869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t i; 4879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (i = 0; i < MAX_NUM_LAYERS; i++) { 4889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (desc.layers[i].rendererFactory == NULL) { 4899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 4909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return i; 4939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const BenchmarkDesc& mDesc; 4969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const size_t mInstance; 4979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const size_t mNumLayers; 4989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis GLHelper* mGLHelper; 5009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The surface into which layers are composited 5029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<GLConsumer> mGLConsumer; 5039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis EGLSurface mSurface; 5049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Used for displaying the surface to a window. 5069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis EGLSurface mWindowSurface; 5079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sp<SurfaceControl> mSurfaceControl; 5089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Layer mLayers[MAX_NUM_LAYERS]; 5109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}; 5119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic int cmpDouble(const double* lhs, const double* rhs) { 5139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (*lhs < *rhs) { 5149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return -1; 5159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else if (*rhs < *lhs) { 5169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return 1; 5179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return 0; 5199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis// Run a single benchmark and print the result. 5229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic bool runTest(const BenchmarkDesc b, size_t run) { 5239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool success = true; 5249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis double prevResult = 0.0, result = 0.0; 5259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Vector<double> samples; 5269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t runHeight = b.runHeights[run]; 5289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t runWidth = b.width * runHeight / b.height; 5299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" %-*s | %4d x %4d | ", g_BenchmarkNameLen, b.name, 5309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis runWidth, runHeight); 5319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fflush(stdout); 5329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis BenchmarkRunner r(b, run); 5349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!r.setUp()) { 5359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "error initializing runner.\n"); 5369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 5379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The slowest 1/outlierFraction sample results are ignored as potential 5409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // outliers. 5419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const uint32_t outlierFraction = 16; 5429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const double threshold = .0025; 5439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t warmUpFrames = 1; 5459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis uint32_t totalFrames = 5; 5469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Find the number of frames needed to run for over 100ms. 5489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis double runTime = 0.0; 5499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis while (true) { 5509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis runTime = double(r.run(warmUpFrames, totalFrames)); 5519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (runTime < 50e6) { 5529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis warmUpFrames *= 2; 5539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis totalFrames *= 2; 5549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else { 5559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 5569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (totalFrames - warmUpFrames > 16) { 5619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The test runs too fast to get a stable result. Skip it. 5629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" fast"); 5639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis goto done; 5649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else if (totalFrames == 5 && runTime > 200e6) { 5659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // The test runs too slow to be very useful. Skip it. 5669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" slow"); 5679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis goto done; 5689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis do { 5719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t newSamples = samples.size(); 5729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (newSamples == 0) { 5739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis newSamples = 4*outlierFraction; 5749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (newSamples > 512) { 5779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf("varies"); 5789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis goto done; 5799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < newSamples; i++) { 5829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis double sample = double(r.run(warmUpFrames, totalFrames)); 5839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (g_SleepBetweenSamplesMs > 0) { 5859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis usleep(g_SleepBetweenSamplesMs * 1000); 5869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (sample < 0.0) { 5899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis success = false; 5909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis goto done; 5919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis samples.add(sample); 5949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis samples.sort(cmpDouble); 5979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis prevResult = result; 5999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t elem = (samples.size() * (outlierFraction-1) / outlierFraction); 6009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis result = (samples[elem-1] + samples[elem]) * 0.5; 6019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } while (fabs(result - prevResult) > threshold * result); 6029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf("%6.3f", result / double(totalFrames - warmUpFrames) / 1e6); 6049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisdone: 6069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf("\n"); 6089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fflush(stdout); 6099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis r.tearDown(); 6109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return success; 6129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic void printResultsTableHeader() { 6159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const char* scenario = "Scenario"; 6169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t len = strlen(scenario); 6179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t leftPad = (g_BenchmarkNameLen - len) / 2; 6189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t rightPad = g_BenchmarkNameLen - len - leftPad; 6199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" %*s%s%*s | Resolution | Time (ms)\n", leftPad, "", 6209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "Scenario", rightPad, ""); 6219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis// Run ALL the benchmarks! 6249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic bool runTests() { 6259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printResultsTableHeader(); 6269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < NELEMS(benchmarks); i++) { 6289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const BenchmarkDesc& b = benchmarks[i]; 6299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t j = 0; j < MAX_TEST_RUNS && b.runHeights[j]; j++) { 6309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!runTest(b, j)) { 6319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return false; 6329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return true; 6369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis// Return the length longest benchmark name. 6399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic size_t maxBenchmarkNameLen() { 6409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t maxLen = 0; 6419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (size_t i = 0; i < NELEMS(benchmarks); i++) { 6429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const BenchmarkDesc& b = benchmarks[i]; 6439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis size_t len = strlen(b.name); 6449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (len > maxLen) { 6459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis maxLen = len; 6469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return maxLen; 6499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis// Print the command usage help to stderr. 6529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatic void showHelp(const char *cmd) { 6539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "usage: %s [options]\n", cmd); 6549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "options include:\n" 6559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " -s N sleep for N ms between samples\n" 6569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " -d display the test frame to a window\n" 6579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis " --help print this helpful message and exit\n" 6589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ); 6599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisint main(int argc, char** argv) { 6629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (argc == 2 && 0 == strcmp(argv[1], "--help")) { 6639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis showHelp(argv[0]); 6649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis exit(0); 6659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (;;) { 6689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int ret; 6699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int option_index = 0; 6709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis static struct option long_options[] = { 6719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis {"help", no_argument, 0, 0 }, 6729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 0, 0, 0, 0 } 6739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }; 6749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ret = getopt_long(argc, argv, "ds:", 6769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis long_options, &option_index); 6779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (ret < 0) { 6799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 6809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch(ret) { 6839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case 'd': 6849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis g_PresentToWindow = true; 6859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 6869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case 's': 6889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis g_SleepBetweenSamplesMs = atoi(optarg); 6899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 6909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case 0: 6929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (strcmp(long_options[option_index].name, "help")) { 6939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis showHelp(argv[0]); 6949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis exit(0); 6959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 6979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 6999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis showHelp(argv[0]); 7009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis exit(2); 7019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis g_BenchmarkNameLen = maxBenchmarkNameLen(); 7059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" cmdline:"); 7079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis for (int i = 0; i < argc; i++) { 7089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf(" %s", argv[i]); 7099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis printf("\n"); 7119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!runTests()) { 7139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(stderr, "exiting due to error.\n"); 7149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return 1; 7159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 717