1734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 2734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Copyright (C) 2010 The Android Open Source Project 3734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 4734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Licensed under the Apache License, Version 2.0 (the "License"); 5734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * you may not use this file except in compliance with the License. 6734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * You may obtain a copy of the License at 7734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 8734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * http://www.apache.org/licenses/LICENSE-2.0 9734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 10734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Unless required by applicable law or agreed to in writing, software 11734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * distributed under the License is distributed on an "AS IS" BASIS, 12734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * See the License for the specific language governing permissions and 14734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * limitations under the License. 15734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 16734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 17734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 18734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 19734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Hardware Composer stress test 20734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 21734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Performs a pseudo-random (prandom) sequence of operations to the 22734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Hardware Composer (HWC), for a specified number of passes or for 23734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * a specified period of time. By default the period of time is FLT_MAX, 24734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * so that the number of passes will take precedence. 25734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 26734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * The passes are grouped together, where (pass / passesPerGroup) specifies 27734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * which group a particular pass is in. This causes every passesPerGroup 28734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * worth of sequential passes to be within the same group. Computationally 29734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * intensive operations are performed just once at the beginning of a group 30734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * of passes and then used by all the passes in that group. This is done 31734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * so as to increase both the average and peak rate of graphic operations, 32734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * by moving computationally intensive operations to the beginning of a group. 33734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * In particular, at the start of each group of passes a set of 34734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * graphic buffers are created, then used by the first and remaining 35734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * passes of that group of passes. 36734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 37734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * The per-group initialization of the graphic buffers is performed 38734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * by a function called initFrames. This function creates an array 39734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * of smart pointers to the graphic buffers, in the form of a vector 40734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * of vectors. The array is accessed in row major order, so each 41734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * row is a vector of smart pointers. All the pointers of a single 42734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * row point to graphic buffers which use the same pixel format and 43734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * have the same dimension, although it is likely that each one is 44734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * filled with a different color. This is done so that after doing 45734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * the first HWC prepare then set call, subsequent set calls can 46734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * be made with each of the layer handles changed to a different 47734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * graphic buffer within the same row. Since the graphic buffers 48734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * in a particular row have the same pixel format and dimension, 49734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * additional HWC set calls can be made, without having to perform 50734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * an HWC prepare call. 51734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 52734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * This test supports the following command-line options: 53734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 54734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -v Verbose 55734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -s num Starting pass 56734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -e num Ending pass 57734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -p num Execute the single pass specified by num 58734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -n num Number of set operations to perform after each prepare operation 59734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -t float Maximum time in seconds to execute the test 60734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -d float Delay in seconds performed after each set operation 61734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -D float Delay in seconds performed after the last pass is executed 62734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 63734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Typically the test is executed for a large range of passes. By default 64734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * passes 0 through 99999 (100,000 passes) are executed. Although this test 65734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * does not validate the generated image, at times it is useful to reexecute 66734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * a particular pass and leave the displayed image on the screen for an 67734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * extended period of time. This can be done either by setting the -s 68734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * and -e options to the desired pass, along with a large value for -D. 69734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * This can also be done via the -p option, again with a large value for 70734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * the -D options. 71734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 72734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * So far this test only contains code to create graphic buffers with 73734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * a continuous solid color. Although this test is unable to validate the 74734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * image produced, any image that contains other than rectangles of a solid 75734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * color are incorrect. Note that the rectangles may use a transparent 76734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * color and have a blending operation that causes the color in overlapping 77734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * rectangles to be mixed. In such cases the overlapping portions may have 78734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * a different color from the rest of the rectangle. 79734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 80734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 81d1d16998adea189d5f24a774aa06e0e4e5f3e7ebAurimas Liutikas#define LOG_TAG "hwcStressTest" 82d1d16998adea189d5f24a774aa06e0e4e5f3e7ebAurimas Liutikas 83734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <algorithm> 84734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <assert.h> 85734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cerrno> 86734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cmath> 87734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cstdlib> 88734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <ctime> 89734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <libgen.h> 90734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sched.h> 91734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sstream> 92734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <stdint.h> 93734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <string.h> 94734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <unistd.h> 95734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <vector> 96734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 97734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/syscall.h> 98734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/types.h> 99734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/wait.h> 100734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 101734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <EGL/egl.h> 102734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <EGL/eglext.h> 103734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <GLES2/gl2.h> 104734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <GLES2/gl2ext.h> 105734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 106734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <ui/GraphicBuffer.h> 107734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 108734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <utils/Log.h> 109734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <testUtil.h> 110734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 111734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <hardware/hwcomposer.h> 112734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 113734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <glTestLib.h> 114622cfadc8f0d294f875151fe1d8985e0553795eaMathias Agopian#include "hwcTestLib.h" 115734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 116734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerusing namespace std; 117734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerusing namespace android; 118734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 119734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst float maxSizeRatio = 1.3; // Graphic buffers can be upto this munch 120734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // larger than the default screen size 121734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst unsigned int passesPerGroup = 10; // A group of passes all use the same 122734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // graphic buffers 123734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 124734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Ratios at which rare and frequent conditions should be produced 125734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst float rareRatio = 0.1; 126734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst float freqRatio = 0.9; 127734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 128734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Defaults for command-line options 129734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst bool defaultVerbose = false; 130734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst unsigned int defaultStartPass = 0; 131734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst unsigned int defaultEndPass = 99999; 132734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst unsigned int defaultPerPassNumSet = 10; 133734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst float defaultPerSetDelay = 0.0; // Default delay after each set 134734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // operation. Default delay of 135734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // zero used so as to perform the 136734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // the set operations as quickly 137734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // as possible. 138734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst float defaultEndDelay = 2.0; // Default delay between completion of 139734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // final pass and restart of framework 140734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst float defaultDuration = FLT_MAX; // A fairly long time, so that 141734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // range of passes will have 142734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // precedence 143734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 144734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Command-line option settings 145734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic bool verbose = defaultVerbose; 146734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic unsigned int startPass = defaultStartPass; 147734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic unsigned int endPass = defaultEndPass; 148734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic unsigned int numSet = defaultPerPassNumSet; 149734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic float perSetDelay = defaultPerSetDelay; 150734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic float endDelay = defaultEndDelay; 151734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic float duration = defaultDuration; 152734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 153734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Command-line mutual exclusion detection flags. 154734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Corresponding flag set true once an option is used. 155734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerbool eFlag, sFlag, pFlag; 156734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 157734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define MAXSTR 100 158734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define MAXCMD 200 159734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define BITSPERBYTE 8 // TODO: Obtain from <values.h>, once 160734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // it has been added 161734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 162734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define CMD_STOP_FRAMEWORK "stop 2>&1" 163734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define CMD_START_FRAMEWORK "start 2>&1" 164734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 165734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define NUMA(a) (sizeof(a) / sizeof(a [0])) 166734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define MEMCLR(addr, size) do { \ 167734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller memset((addr), 0, (size)); \ 168734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } while (0) 169734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 170734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// File scope constants 171734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst unsigned int blendingOps[] = { 172734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller HWC_BLENDING_NONE, 173734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller HWC_BLENDING_PREMULT, 174734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller HWC_BLENDING_COVERAGE, 175734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller}; 176734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst unsigned int layerFlags[] = { 177734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller HWC_SKIP_LAYER, 178734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller}; 179734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst vector<unsigned int> vecLayerFlags(layerFlags, 180734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layerFlags + NUMA(layerFlags)); 181734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 182734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst unsigned int transformFlags[] = { 183734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller HWC_TRANSFORM_FLIP_H, 184734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller HWC_TRANSFORM_FLIP_V, 185734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller HWC_TRANSFORM_ROT_90, 186734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // ROT_180 & ROT_270 intentionally not listed, because they 187734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // they are formed from combinations of the flags already listed. 188734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller}; 189734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst vector<unsigned int> vecTransformFlags(transformFlags, 190734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller transformFlags + NUMA(transformFlags)); 191734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 192734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// File scope globals 193734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic const int texUsage = GraphicBuffer::USAGE_HW_TEXTURE | 194734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller GraphicBuffer::USAGE_SW_WRITE_RARELY; 1955880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hallstatic hwc_composer_device_1_t *hwcDevice; 196734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic EGLDisplay dpy; 197734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic EGLSurface surface; 198734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic EGLint width, height; 199734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic vector <vector <sp<GraphicBuffer> > > frames; 200734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 201734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// File scope prototypes 202734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid init(void); 203734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid initFrames(unsigned int seed); 204734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillertemplate <class T> vector<T> vectorRandSelect(const vector<T>& vec, size_t num); 205734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillertemplate <class T> T vectorOr(const vector<T>& vec); 206734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 207734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 208734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Main 209734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 210734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Performs the following high-level sequence of operations: 211734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 212734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 1. Command-line parsing 213734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 214734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 2. Initialization 215734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 216734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 3. For each pass: 217734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 218734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * a. If pass is first pass or in a different group from the 219734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * previous pass, initialize the array of graphic buffers. 220734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 221734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * b. Create a HWC list with room to specify a prandomly 222734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * selected number of layers. 223734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 224734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * c. Select a subset of the rows from the graphic buffer array, 225734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * such that there is a unique row to be used for each 226734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * of the layers in the HWC list. 227734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 228734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * d. Prandomly fill in the HWC list with handles 229734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * selected from any of the columns of the selected row. 230734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 231734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * e. Pass the populated list to the HWC prepare call. 232734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 233734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * f. Pass the populated list to the HWC set call. 234734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 235734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * g. If additional set calls are to be made, then for each 236734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * additional set call, select a new set of handles and 237734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * perform the set call. 238734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 239734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerint 240734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillermain(int argc, char *argv[]) 241734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 242734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int rv, opt; 243734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller char *chptr; 244734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int pass; 245734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller char cmd[MAXCMD]; 246734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller struct timeval startTime, currentTime, delta; 247734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 248734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testSetLogCatTag(LOG_TAG); 249734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 250734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Parse command line arguments 251734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller while ((opt = getopt(argc, argv, "vp:d:D:n:s:e:t:?h")) != -1) { 252734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller switch (opt) { 253734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'd': // Delay after each set operation 254734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller perSetDelay = strtod(optarg, &chptr); 255734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((*chptr != '\0') || (perSetDelay < 0.0)) { 256734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified per pass delay of: " 257734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "%s", optarg); 258734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(1); 259734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 260734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 261734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 262734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'D': // End of test delay 263734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Delay between completion of final pass and restart 264734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // of framework 265734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller endDelay = strtod(optarg, &chptr); 266734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((*chptr != '\0') || (endDelay < 0.0)) { 267734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified end of test delay " 268734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "of: %s", optarg); 269734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(2); 270734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 271734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 272734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 273734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 't': // Duration 274734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller duration = strtod(optarg, &chptr); 275734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((*chptr != '\0') || (duration < 0.0)) { 276734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified duration of: %s", 277734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller optarg); 278734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(3); 279734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 280734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 281734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 282734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'n': // Num set operations per pass 283734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller numSet = strtoul(optarg, &chptr, 10); 284734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (*chptr != '\0') { 285734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified num set per pass " 286734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "of: %s", optarg); 287734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(4); 288734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 289734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 290734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 291734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 's': // Starting Pass 292734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller sFlag = true; 293734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (pFlag) { 294734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid combination of command-line options."); 295734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" The -p option is mutually exclusive from the"); 296734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -s and -e options."); 297734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(5); 298734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 299734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller startPass = strtoul(optarg, &chptr, 10); 300734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (*chptr != '\0') { 301734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified starting pass " 302734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "of: %s", optarg); 303734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(6); 304734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 305734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 306734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 307734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'e': // Ending Pass 308734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller eFlag = true; 309734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (pFlag) { 310734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid combination of command-line options."); 311734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" The -p option is mutually exclusive from the"); 312734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -s and -e options."); 313734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(7); 314734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 315734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller endPass = strtoul(optarg, &chptr, 10); 316734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (*chptr != '\0') { 317734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified ending pass " 318734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "of: %s", optarg); 319734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(8); 320734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 321734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 322734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 323734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'p': // Run a single specified pass 324734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pFlag = true; 325734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (sFlag || eFlag) { 326734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid combination of command-line options."); 327734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" The -p option is mutually exclusive from the"); 328734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -s and -e options."); 329734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(9); 330734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 331734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller startPass = endPass = strtoul(optarg, &chptr, 10); 332734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (*chptr != '\0') { 333734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified pass of: %s", 334734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller optarg); 335734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(10); 336734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 337734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 338734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 339734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'v': // Verbose 340734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller verbose = true; 341734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 342734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 343734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'h': // Help 344734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case '?': 345734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller default: 346734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" %s [options]", basename(argv[0])); 347734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" options:"); 348734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -p Execute specified pass"); 349734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -s Starting pass"); 350734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -e Ending pass"); 351734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -t Duration"); 352734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -d Delay after each set operation"); 353734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -D End of test delay"); 354734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -n Num set operations per pass"); 355734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -v Verbose"); 356734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(((optopt == 0) || (optopt == '?')) ? 0 : 11); 357734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 358734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 359734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (endPass < startPass) { 360734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Unexpected ending pass before starting pass"); 361734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" startPass: %u endPass: %u", startPass, endPass); 362734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(12); 363734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 364734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (argc != optind) { 365734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Unexpected command-line postional argument"); 366734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" %s [-s start_pass] [-e end_pass] [-t duration]", 367734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller basename(argv[0])); 368734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(13); 369734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 370734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("duration: %g", duration); 371734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("startPass: %u", startPass); 372734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("endPass: %u", endPass); 373734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("numSet: %u", numSet); 374734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 375734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Stop framework 376734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller rv = snprintf(cmd, sizeof(cmd), "%s", CMD_STOP_FRAMEWORK); 377734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (rv >= (signed) sizeof(cmd) - 1) { 378734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Command too long for: %s", CMD_STOP_FRAMEWORK); 379734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(14); 380734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 381734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testExecCmd(cmd); 382734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testDelay(1.0); // TODO - need means to query whether asyncronous stop 383734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // framework operation has completed. For now, just wait 384734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // a long time. 385734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 386734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller init(); 387734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 388734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // For each pass 389734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller gettimeofday(&startTime, NULL); 390734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (pass = startPass; pass <= endPass; pass++) { 391734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Stop if duration of work has already been performed 392734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller gettimeofday(¤tTime, NULL); 393734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller delta = tvDelta(&startTime, ¤tTime); 394734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (tv2double(&delta) > duration) { break; } 395734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 396734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Regenerate a new set of test frames when this pass is 397734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // either the first pass or is in a different group then 398734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // the previous pass. A group of passes are passes that 399734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // all have the same quotient when their pass number is 400734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // divided by passesPerGroup. 401734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((pass == startPass) 402734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || ((pass / passesPerGroup) != ((pass - 1) / passesPerGroup))) { 403734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller initFrames(pass / passesPerGroup); 404734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 405734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 406734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("==== Starting pass: %u", pass); 407734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 408734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Cause deterministic sequence of prandom numbers to be 409734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // generated for this pass. 410734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller srand48(pass); 411734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 412b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwc_display_contents_1_t *list; 413734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list = hwcTestCreateLayerList(testRandMod(frames.size()) + 1); 414734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (list == NULL) { 415734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hwcTestCreateLayerList failed"); 416734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(20); 417734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 418734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 419734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Prandomly select a subset of frames to be used by this pass. 420734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller vector <vector <sp<GraphicBuffer> > > selectedFrames; 421734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller selectedFrames = vectorRandSelect(frames, list->numHwLayers); 422734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 423734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Any transform tends to create a layer that the hardware 424734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // composer is unable to support and thus has to leave for 425734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // SurfaceFlinger. Place heavy bias on specifying no transforms. 426734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller bool noTransform = testRandFract() > rareRatio; 427734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 428734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int n1 = 0; n1 < list->numHwLayers; n1++) { 429734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int idx = testRandMod(selectedFrames[n1].size()); 430734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller sp<GraphicBuffer> gBuf = selectedFrames[n1][idx]; 4315880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hall hwc_layer_1_t *layer = &list->hwLayers[n1]; 432734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->handle = gBuf->handle; 433734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 434734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->blending = blendingOps[testRandMod(NUMA(blendingOps))]; 435734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->flags = (testRandFract() > rareRatio) ? 0 436734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller : vectorOr(vectorRandSelect(vecLayerFlags, 437734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testRandMod(vecLayerFlags.size() + 1))); 438734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->transform = (noTransform || testRandFract() > rareRatio) ? 0 439734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller : vectorOr(vectorRandSelect(vecTransformFlags, 440734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testRandMod(vecTransformFlags.size() + 1))); 441734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.left = testRandMod(gBuf->getWidth()); 442734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.top = testRandMod(gBuf->getHeight()); 443734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.right = layer->sourceCrop.left 444734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + testRandMod(gBuf->getWidth() - layer->sourceCrop.left) + 1; 445734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.bottom = layer->sourceCrop.top 446734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + testRandMod(gBuf->getHeight() - layer->sourceCrop.top) + 1; 447734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.left = testRandMod(width); 448734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.top = testRandMod(height); 449734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.right = layer->displayFrame.left 450734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + testRandMod(width - layer->displayFrame.left) + 1; 451734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.bottom = layer->displayFrame.top 452734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + testRandMod(height - layer->displayFrame.top) + 1; 453734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 454734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Increase the frequency that a scale factor of 1.0 from 455734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // the sourceCrop to displayFrame occurs. This is the 456734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // most common scale factor used by applications and would 457734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // be rarely produced by this stress test without this 458734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // logic. 459734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (testRandFract() <= freqRatio) { 460734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Only change to scale factor to 1.0 if both the 461734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // width and height will fit. 462734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int sourceWidth = layer->sourceCrop.right 463734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller - layer->sourceCrop.left; 464734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int sourceHeight = layer->sourceCrop.bottom 465734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller - layer->sourceCrop.top; 466734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (((layer->displayFrame.left + sourceWidth) <= width) 467734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller && ((layer->displayFrame.top + sourceHeight) <= height)) { 468734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.right = layer->displayFrame.left 469734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + sourceWidth; 470734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.bottom = layer->displayFrame.top 471734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + sourceHeight; 472734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 473734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 474734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 475734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->visibleRegionScreen.numRects = 1; 476734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->visibleRegionScreen.rects = &layer->displayFrame; 477734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 478734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 479734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Perform prepare operation 480734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { testPrintI("Prepare:"); hwcTestDisplayList(list); } 481b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwcDevice->prepare(hwcDevice, 1, &list); 482734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { 483734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("Post Prepare:"); 484734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestDisplayListPrepareModifiable(list); 485734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 486734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 487734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Turn off the geometry changed flag 488734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->flags &= ~HWC_GEOMETRY_CHANGED; 489734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 490734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Perform the set operation(s) 491734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) {testPrintI("Set:"); } 492734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int n1 = 0; n1 < numSet; n1++) { 493734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { hwcTestDisplayListHandles(list); } 494b685c542836b93c99cd85053e07696406ea37adbJesse Hall list->dpy = dpy; 495b685c542836b93c99cd85053e07696406ea37adbJesse Hall list->sur = surface; 496b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwcDevice->set(hwcDevice, 1, &list); 497734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 498734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Prandomly select a new set of handles 499734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int n1 = 0; n1 < list->numHwLayers; n1++) { 500734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int idx = testRandMod(selectedFrames[n1].size()); 501734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller sp<GraphicBuffer> gBuf = selectedFrames[n1][idx]; 5025880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hall hwc_layer_1_t *layer = &list->hwLayers[n1]; 503734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->handle = (native_handle_t *) gBuf->handle; 504734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 505734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 506734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testDelay(perSetDelay); 507734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 508734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 509734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestFreeLayerList(list); 510734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("==== Completed pass: %u", pass); 511734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 512734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 513734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testDelay(endDelay); 514734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 515734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Start framework 516734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller rv = snprintf(cmd, sizeof(cmd), "%s", CMD_START_FRAMEWORK); 517734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (rv >= (signed) sizeof(cmd) - 1) { 518734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Command too long for: %s", CMD_START_FRAMEWORK); 519734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(21); 520734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 521734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testExecCmd(cmd); 522734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 523734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("Successfully completed %u passes", pass - startPass); 524734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 525734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return 0; 526734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 527734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 528734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid init(void) 529734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 530734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller srand48(0); // Defensively set pseudo random number generator. 531734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Should not need to set this, because a stress test 532734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // sets the seed on each pass. Defensively set it here 533734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // so that future code that uses pseudo random numbers 534734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // before the first pass will be deterministic. 535734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 536734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestInitDisplay(verbose, &dpy, &surface, &width, &height); 537734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 538734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestOpenHwc(&hwcDevice); 539734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 540734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 541734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 542734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Initialize Frames 543734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 544734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Creates an array of graphic buffers, within the global variable 545734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * named frames. The graphic buffers are contained within a vector of 546734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * vectors. All the graphic buffers in a particular row are of the same 547734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * format and dimension. Each graphic buffer is uniformly filled with a 548734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * prandomly selected color. It is likely that each buffer, even 549734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * in the same row, will be filled with a unique color. 550734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 551734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid initFrames(unsigned int seed) 552734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 553734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int rv; 554734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const size_t maxRows = 5; 555734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const size_t minCols = 2; // Need at least double buffering 556734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const size_t maxCols = 4; // One more than triple buffering 557734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 558734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { testPrintI("initFrames seed: %u", seed); } 559734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller srand48(seed); 560734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t rows = testRandMod(maxRows) + 1; 561734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 562734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller frames.clear(); 563734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller frames.resize(rows); 564734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 565734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int row = 0; row < rows; row++) { 566734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // All frames within a row have to have the same format and 567734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // dimensions. Width and height need to be >= 1. 568734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int formatIdx = testRandMod(NUMA(hwcTestGraphicFormat)); 569734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const struct hwcTestGraphicFormat *formatPtr 570734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller = &hwcTestGraphicFormat[formatIdx]; 571734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int format = formatPtr->format; 572734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 573734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Pick width and height, which must be >= 1 and the size 574734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // mod the wMod/hMod value must be equal to 0. 575734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t w = (width * maxSizeRatio) * testRandFract(); 576734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t h = (height * maxSizeRatio) * testRandFract(); 577e933c0396f1350c71b6753a5e25a82d800b1a9aeMark Salyzyn w = max(size_t(1u), w); 578e933c0396f1350c71b6753a5e25a82d800b1a9aeMark Salyzyn h = max(size_t(1u), h); 579734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((w % formatPtr->wMod) != 0) { 580734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller w += formatPtr->wMod - (w % formatPtr->wMod); 581734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 582734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((h % formatPtr->hMod) != 0) { 583734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller h += formatPtr->hMod - (h % formatPtr->hMod); 584734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 585734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { 586734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" frame %u width: %u height: %u format: %u %s", 587734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller row, w, h, format, hwcTestGraphicFormat2str(format)); 588734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 589734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 590734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t cols = testRandMod((maxCols + 1) - minCols) + minCols; 591734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller frames[row].resize(cols); 592734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int col = 0; col < cols; col++) { 593734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ColorFract color(testRandFract(), testRandFract(), testRandFract()); 594734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float alpha = testRandFract(); 595734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 596734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller frames[row][col] = new GraphicBuffer(w, h, format, texUsage); 597734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((rv = frames[row][col]->initCheck()) != NO_ERROR) { 598734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("GraphicBuffer initCheck failed, rv: %i", rv); 599734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" frame %u width: %u height: %u format: %u %s", 600734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller row, w, h, format, hwcTestGraphicFormat2str(format)); 601734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(80); 602734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 603734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 604734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestFillColor(frames[row][col].get(), color, alpha); 605734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { 606734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" buf: %p handle: %p color: %s alpha: %f", 607734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller frames[row][col].get(), frames[row][col]->handle, 608734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller string(color).c_str(), alpha); 609734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 610734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 611734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 612734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 613734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 614734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 615734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Vector Random Select 616734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 617734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Prandomly selects and returns num elements from vec. 618734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 619734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillertemplate <class T> 620734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervector<T> vectorRandSelect(const vector<T>& vec, size_t num) 621734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 622734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller vector<T> rv = vec; 623734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 624734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller while (rv.size() > num) { 625734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller rv.erase(rv.begin() + testRandMod(rv.size())); 626734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 627734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 628734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return rv; 629734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 630734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 631734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 632734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Vector Or 633734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 634734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Or's togethen the values of each element of vec and returns the result. 635734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 636734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillertemplate <class T> 637734d8d898c6b0b315e431b231cc6759514da361bLouis HuemillerT vectorOr(const vector<T>& vec) 638734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 639734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller T rv = 0; 640734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 641734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (size_t n1 = 0; n1 < vec.size(); n1++) { 642734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller rv |= vec[n1]; 643734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 644734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 645734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return rv; 646734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 647