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