1653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller/* 2653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Copyright (C) 2011 The Android Open Source Project 3653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 4653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Licensed under the Apache License, Version 2.0 (the "License"); 5653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * you may not use this file except in compliance with the License. 6653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * You may obtain a copy of the License at 7653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 8653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * http://www.apache.org/licenses/LICENSE-2.0 9653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 10653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Unless required by applicable law or agreed to in writing, software 11653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * distributed under the License is distributed on an "AS IS" BASIS, 12653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * See the License for the specific language governing permissions and 14653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * limitations under the License. 15653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 16653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller */ 17653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 18653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller/* 19653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Hardware Composer Commit Points 20653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 21653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Synopsis 22653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * hwcCommit [options] graphicFormat ... 23653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * options: 24653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * -s [width, height] - Starting dimension 25653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * -v - Verbose 26653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 27653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * graphic formats: 28653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * RGBA8888 (reference frame default) 29653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * RGBX8888 30653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * RGB888 31653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * RGB565 32653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * BGRA8888 33653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * RGBA5551 34653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * RGBA4444 35653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * YV12 36653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 37653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Description 38653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * The Hardware Composer (HWC) Commit test is a benchmark that 39653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * discovers the points at which the HWC will commit to rendering an 40653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * overlay(s). Before rendering a set of overlays, the HWC is shown 41653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * the list through a prepare call. During the prepare call the HWC 42653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * is able to examine the list and specify which overlays it is able 43653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * to handle. The overlays that it can't handle are typically composited 44653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * by a higher level (e.g. Surface Flinger) and then the original list 45653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * plus a composit of what HWC passed on are provided back to the HWC 46653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * for rendering. 47653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 48653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Once an implementation of the HWC has been shipped, a regression would 49653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * likely occur if a latter implementation started passing on conditions 50653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * that it used to commit to. The primary purpose of this benchmark 51653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * is the automated discovery of the commit points, where an implementation 52653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * is on the edge between committing and not committing. These are commonly 53653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * referred to as commit points. Between implementations changes to the 54653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * commit points are allowed, as long as they improve what the HWC commits 55653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * to. Once an implementation of the HWC is shipped, the commit points are 56653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * not allowed to regress in future implementations. 57653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 58653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * This benchmark takes a sampling and then adjusts until it finds a 59653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * commit point. It doesn't exhaustively check all possible conditions, 60653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * which do to the number of combinations would be impossible. Instead 61653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * it starts its search from a starting dimension, that can be changed 62653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * via the -s option. The search is also bounded by a set of search 63653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * limits, that are hard-coded into a structure of constants named 64653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * searchLimits. Results that happen to reach a searchLimit are prefixed 65653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * with >=, so that it is known that the value could possibly be larger. 66653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 67653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Measurements are made for each of the graphic formats specified as 68653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * positional parameters on the command-line. If no graphic formats 69653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * are specified on the command line, then by default measurements are 70653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * made and reported for each of the known graphic format. 71653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller */ 72653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 73653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <algorithm> 74653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <assert.h> 75653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <cerrno> 76653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <cmath> 77653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <cstdlib> 78653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <ctime> 7906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller#include <iomanip> 80653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <istream> 81653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <libgen.h> 82653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <list> 83653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <sched.h> 84653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <sstream> 85653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <stdint.h> 86653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <string.h> 87653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <unistd.h> 88653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <vector> 89653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 90653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <sys/syscall.h> 91653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <sys/types.h> 92653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <sys/wait.h> 93653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 94653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <EGL/egl.h> 95653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <EGL/eglext.h> 96653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <GLES2/gl2.h> 97653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <GLES2/gl2ext.h> 98653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 99653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <ui/FramebufferNativeWindow.h> 100653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <ui/GraphicBuffer.h> 101653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 102653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#define LOG_TAG "hwcCommitTest" 103653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <utils/Log.h> 104653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <testUtil.h> 105653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 106653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <hardware/hwcomposer.h> 107653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 108653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#include <glTestLib.h> 109622cfadc8f0d294f875151fe1d8985e0553795eaMathias Agopian#include "hwcTestLib.h" 110653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 111653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerusing namespace std; 112653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerusing namespace android; 113653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 114653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Defaults 115653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst HwcTestDim defaultStartDim = HwcTestDim(100, 100); 116653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst bool defaultVerbose = false; 117653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 118653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst uint32_t defaultFormat = HAL_PIXEL_FORMAT_RGBA_8888; 119653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst int32_t defaultTransform = 0; 120653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst uint32_t defaultBlend = HWC_BLENDING_NONE; 121653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst ColorFract defaultColor(0.5, 0.5, 0.5); 122653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst float defaultAlpha = 1.0; // Opaque 123653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst HwcTestDim defaultSourceDim(1, 1); 124653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst struct hwc_rect defaultSourceCrop = {0, 0, 1, 1}; 125653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst struct hwc_rect defaultDisplayFrame = {0, 0, 100, 100}; 126653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 127653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Global Constants 12806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemillerconst uint32_t printFieldWidth = 2; 129653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst struct searchLimits { 130653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t numOverlays; 131653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim sourceCrop; 132653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} searchLimits = { 133653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 10, 134653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim(3000, 2000), 135653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller}; 136653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst struct transformType { 137653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const char *desc; 138653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t id; 139653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} transformType[] = { 140653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller {"fliph", HWC_TRANSFORM_FLIP_H}, 141653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller {"flipv", HWC_TRANSFORM_FLIP_V}, 142653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller {"rot90", HWC_TRANSFORM_ROT_90}, 143653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller {"rot180", HWC_TRANSFORM_ROT_180}, 144653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller {"rot270", HWC_TRANSFORM_ROT_270}, 145653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller}; 146653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst struct blendType { 147653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const char *desc; 148653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t id; 149653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} blendType[] = { 150653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller {"none", HWC_BLENDING_NONE}, 151653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller {"premult", HWC_BLENDING_PREMULT}, 152653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller {"coverage", HWC_BLENDING_COVERAGE}, 153653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller}; 154653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 155653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Defines 156653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#define MAXCMD 200 157653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#define CMD_STOP_FRAMEWORK "stop 2>&1" 158653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#define CMD_START_FRAMEWORK "start 2>&1" 159653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 160653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Macros 161653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller#define NUMA(a) (sizeof(a) / sizeof(a [0])) // Num elements in an array 162653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 163653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Local types 164653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerclass Rectangle { 165653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerpublic: 166653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle(uint32_t graphicFormat = defaultFormat, 167653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dfDim = HwcTestDim(1, 1), 168653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim sDim = HwcTestDim(1, 1)); 169653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller void setSourceDim(HwcTestDim dim); 170653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 171653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t format; 172653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t transform; 173653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller int32_t blend; 174653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ColorFract color; 175653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller float alpha; 176653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim sourceDim; 177653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller struct hwc_rect sourceCrop; 178653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller struct hwc_rect displayFrame; 179653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller}; 180653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 181653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerclass Range { 182653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerpublic: 183653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Range(void) : _l(0), _u(0) {} 184653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Range(uint32_t lower, uint32_t upper) : _l(lower), _u(upper) {} 185653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t lower(void) { return _l; } 186653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t upper(void) { return _u; } 187653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 188653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller operator string(); 189653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 190653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerprivate: 191653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t _l; // lower 192653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t _u; // upper 193653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller}; 194653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 195653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerRange::operator string() 196653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 197653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ostringstream out; 198653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 199653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller out << '[' << _l << ", " << _u << ']'; 200653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 201653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return out.str(); 202653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 203653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 204653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerclass Rational { 205653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerpublic: 206653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational(void) : _n(0), _d(1) {} 207653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational(uint32_t n, uint32_t d) : _n(n), _d(d) {} 208653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t numerator(void) { return _n; } 209653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t denominator(void) { return _d; } 210653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller void setNumerator(uint32_t numerator) { _n = numerator; } 211653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 212653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool operator==(const Rational& other) const; 213653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool operator!=(const Rational& other) const { return !(*this == other); } 214653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool operator<(const Rational& other) const; 215653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool operator>(const Rational& other) const { 216653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return (!(*this == other) && !(*this < other)); 217653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 218653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller static void double2Rational(double f, Range nRange, Range dRange, 219653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational& lower, Rational& upper); 220653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 221653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller operator string() const; 222653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller operator double() const { return (double) _n / (double) _d; } 223653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 224653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 225653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerprivate: 226653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t _n; 227653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t _d; 228653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller}; 229653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 230653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Globals 231653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstatic const int texUsage = GraphicBuffer::USAGE_HW_TEXTURE | 232653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller GraphicBuffer::USAGE_SW_WRITE_RARELY; 2335880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hallstatic hwc_composer_device_1_t *hwcDevice; 234653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstatic EGLDisplay dpy; 235653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstatic EGLSurface surface; 236653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstatic EGLint width, height; 23706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemillerstatic size_t maxHeadingLen; 23806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemillerstatic vector<string> formats; 239653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 240653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Measurements 241653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstruct meas { 242653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t format; 243653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t startDimOverlays; 244653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t maxNonOverlapping; 245653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t maxOverlapping; 246653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<uint32_t> transforms; 247653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<uint32_t> blends; 248653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller struct displayFrame { 249653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t minWidth; 250653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t minHeight; 251653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim minDim; 252653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t maxWidth; 253653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t maxHeight; 254653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim maxDim; 255653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } df; 256653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller struct sourceCrop { 257653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t minWidth; 258653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t minHeight; 259653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim minDim; 260653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t maxWidth; 261653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t maxHeight; 262653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim maxDim; 263653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational hScale; 264653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim hScaleBestDf; 265653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim hScaleBestSc; 266653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational vScale; 267653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim vScaleBestDf; 268653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim vScaleBestSc; 269653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } sc; 27006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller vector<uint32_t> overlapBlendNone; 27106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller vector<uint32_t> overlapBlendPremult; 27206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller vector<uint32_t> overlapBlendCoverage; 273653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller}; 274653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillervector<meas> measurements; 275653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 276653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Function prototypes 277653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t numOverlays(list<Rectangle>& rectList); 278653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t maxOverlays(uint32_t format, bool allowOverlap); 279653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerlist<uint32_t> supportedTransforms(uint32_t format); 280653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerlist<uint32_t> supportedBlends(uint32_t format); 281653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t dfMinWidth(uint32_t format); 282653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t dfMinHeight(uint32_t format); 283653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t dfMaxWidth(uint32_t format); 284653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t dfMaxHeight(uint32_t format); 285653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim dfMinDim(uint32_t format); 286653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim dfMaxDim(uint32_t format); 287653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t scMinWidth(uint32_t format, const HwcTestDim& dfDim); 288653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t scMinHeight(uint32_t format, const HwcTestDim& dfDim); 289653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t scMaxWidth(uint32_t format, const HwcTestDim& dfDim); 290653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t scMaxHeight(uint32_t format, const HwcTestDim& dfDim); 291653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim scMinDim(uint32_t format, const HwcTestDim& dfDim); 292653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim scMaxDim(uint32_t format, const HwcTestDim& dfDim); 293653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerRational scHScale(uint32_t format, 294653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const HwcTestDim& dfMin, const HwcTestDim& dfMax, 295653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const HwcTestDim& scMin, const HwcTestDim& scMax, 296653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim& outBestDf, HwcTestDim& outBestSc); 297653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerRational scVScale(uint32_t format, 298653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const HwcTestDim& dfMin, const HwcTestDim& dfMax, 299653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const HwcTestDim& scMin, const HwcTestDim& scMax, 300653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim& outBestDf, HwcTestDim& outBestSc); 30106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemilleruint32_t numOverlapping(uint32_t backgroundFormat, uint32_t foregroundFormat, 30206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller uint32_t backgroundBlend, uint32_t foregroundBlend); 303653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstring transformList2str(const list<uint32_t>& transformList); 304653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstring blendList2str(const list<uint32_t>& blendList); 305653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillervoid init(void); 30606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemillervoid printFormatHeadings(size_t indent); 30706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemillervoid printOverlapLine(size_t indent, const string formatStr, 30806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller const vector<uint32_t>& results); 309653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillervoid printSyntax(const char *cmd); 310653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 311653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Command-line option settings 312653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstatic bool verbose = defaultVerbose; 313653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstatic HwcTestDim startDim = defaultStartDim; 314653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 315653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller/* 316653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Main 317653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 318653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Performs the following high-level sequence of operations: 319653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 320653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 1. Command-line parsing 321653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 322653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 2. Form a list of command-line specified graphic formats. If 323653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * no formats are specified, then form a list of all known formats. 324653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 325653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 3. Stop framework 326653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Only one user at a time is allowed to use the HWC. Surface 327653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * Flinger uses the HWC and is part of the framework. Need to 328653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * stop the framework so that Surface Flinger will stop using 329653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * the HWC. 330653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 331653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 4. Initialization 332653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 333653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 5. For each graphic format in the previously formed list perform 334653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * measurements on that format and report the results. 335653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 336653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller * 6. Start framework 337653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller */ 338653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerint 339653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillermain(int argc, char *argv[]) 340653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 341653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller int rv, opt; 342653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller char *chptr; 343653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool error; 344653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller string str; 345653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller char cmd[MAXCMD]; 346653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 347653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 348653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testSetLogCatTag(LOG_TAG); 349653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 350653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Parse command line arguments 351653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller while ((opt = getopt(argc, argv, "s:v?h")) != -1) { 352653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller switch (opt) { 353653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 354653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller case 's': // Start Dimension 355653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Use arguments until next starts with a dash 356653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // or current ends with a > or ] 357653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller str = optarg; 358653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller while (optind < argc) { 359653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (*argv[optind] == '-') { break; } 360653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller char endChar = (str.length() > 1) ? str[str.length() - 1] : 0; 361653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if ((endChar == '>') || (endChar == ']')) { break; } 362653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller str += " " + string(argv[optind++]); 363653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 364653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller { 365653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller istringstream in(str); 366653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller startDim = hwcTestParseDim(in, error); 367653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Any parse error or characters not used by parser 368653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (error 369653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller || (((unsigned int) in.tellg() != in.str().length()) 370653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller && (in.tellg() != (streampos) -1))) { 371653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Invalid command-line specified start " 372653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller "dimension of: %s", str.c_str()); 373653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(8); 374653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 375653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 376653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller break; 377653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 378653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller case 'v': // Verbose 379653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = true; 380653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller break; 381653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 382653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller case 'h': // Help 383653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller case '?': 384653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller default: 385653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller printSyntax(basename(argv[0])); 386653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(((optopt == 0) || (optopt == '?')) ? 0 : 11); 387653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 388653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 389653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 390653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Positional parameters 391653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Positional parameters provide the names of graphic formats that 392653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // measurements are to be made on. Measurements are made on all 393653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // known graphic formats when no positional parameters are provided. 394653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (optind == argc) { 395653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // No command-line specified graphic formats 396653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Add all graphic formats to the list of formats to be measured 397653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int n1 = 0; n1 < NUMA(hwcTestGraphicFormat); n1++) { 398653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller formats.push_back(hwcTestGraphicFormat[n1].desc); 399653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 400653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } else { 401653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Add names of command-line specified graphic formats to the 402653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // list of formats to be tested 403653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (; argv[optind] != NULL; optind++) { 404653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller formats.push_back(argv[optind]); 405653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 406653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 407653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 40806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // Determine length of longest specified graphic format. 40906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // This value is used for output formating 41006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for (vector<string>::iterator it = formats.begin(); 41106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller it != formats.end(); ++it) { 41206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller maxHeadingLen = max(maxHeadingLen, it->length()); 41306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 41406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 415653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Stop framework 416653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rv = snprintf(cmd, sizeof(cmd), "%s", CMD_STOP_FRAMEWORK); 417653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (rv >= (signed) sizeof(cmd) - 1) { 418653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Command too long for: %s", CMD_STOP_FRAMEWORK); 419653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(14); 420653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 421653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testExecCmd(cmd); 422653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testDelay(1.0); // TODO - needs means to query whether asynchronous stop 423653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // framework operation has completed. For now, just wait 424653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // a long time. 425653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 426653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI("startDim: %s", ((string) startDim).c_str()); 427653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 428653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller init(); 429653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 430653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // For each of the graphic formats 43106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for (vector<string>::iterator itFormat = formats.begin(); 432653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller itFormat != formats.end(); ++itFormat) { 433653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 434653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Locate hwcTestLib structure that describes this format 435653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const struct hwcTestGraphicFormat *format; 436653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller format = hwcTestGraphicFormatLookup((*itFormat).c_str()); 437653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (format == NULL) { 438653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Unknown graphic format of: %s", (*itFormat).c_str()); 439653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(1); 440653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 441653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 442653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Display format header 443653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI("format: %s", format->desc); 444653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 445653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Create area to hold the measurements 446653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller struct meas meas; 447653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller struct meas *measPtr; 448653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller meas.format = format->format; 449653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measurements.push_back(meas); 450653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr = &measurements[measurements.size() - 1]; 451653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 452653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Start dimension num overlays 453653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format->format, startDim); 454653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 455653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 456653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->startDimOverlays = numOverlays(rectList); 457653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" startDimOverlays: %u", measPtr->startDimOverlays); 458653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 459653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Skip the rest of the measurements, when the start dimension 460653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // doesn't produce an overlay 461653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (measPtr->startDimOverlays == 0) { continue; } 462653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 463653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Max Overlays 464653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->maxNonOverlapping = maxOverlays(format->format, false); 465653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" max nonOverlapping overlays: %s%u", 466653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller (measPtr->maxNonOverlapping == searchLimits.numOverlays) 467653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ? ">= " : "", 468653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->maxNonOverlapping); 469653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->maxOverlapping = maxOverlays(format->format, true); 470653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" max Overlapping overlays: %s%u", 471653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller (measPtr->maxOverlapping == searchLimits.numOverlays) 472653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ? ">= " : "", 473653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->maxOverlapping); 474653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 475653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Transforms and blends 476653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->transforms = supportedTransforms(format->format); 477653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" transforms: %s", 478653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller transformList2str(measPtr->transforms).c_str()); 479653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->blends = supportedBlends(format->format); 480653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" blends: %s", 481653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller blendList2str(measPtr->blends).c_str()); 482653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 483653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Display frame measurements 484653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.minWidth = dfMinWidth(format->format); 485653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" dfMinWidth: %u", measPtr->df.minWidth); 486653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 487653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.minHeight = dfMinHeight(format->format); 488653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" dfMinHeight: %u", measPtr->df.minHeight); 489653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 490653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.maxWidth = dfMaxWidth(format->format); 491653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" dfMaxWidth: %u", measPtr->df.maxWidth); 492653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 493653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.maxHeight = dfMaxHeight(format->format); 494653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" dfMaxHeight: %u", measPtr->df.maxHeight); 495653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 496653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.minDim = dfMinDim(format->format); 497653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" dfMinDim: %s", ((string) measPtr->df.minDim).c_str()); 498653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 499653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.maxDim = dfMaxDim(format->format); 500653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" dfMaxDim: %s", ((string) measPtr->df.maxDim).c_str()); 501653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 502653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Source crop measurements 503653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.minWidth = scMinWidth(format->format, measPtr->df.minDim); 504653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scMinWidth: %u", measPtr->sc.minWidth); 505653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 506653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.minHeight = scMinHeight(format->format, measPtr->df.minDim); 507653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scMinHeight: %u", measPtr->sc.minHeight); 508653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 509653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.maxWidth = scMaxWidth(format->format, measPtr->df.maxDim); 510653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scMaxWidth: %s%u", (measPtr->sc.maxWidth 511653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller == searchLimits.sourceCrop.width()) ? ">= " : "", 512653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.maxWidth); 513653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 514653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.maxHeight = scMaxHeight(format->format, measPtr->df.maxDim); 515653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scMaxHeight: %s%u", (measPtr->sc.maxHeight 516653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller == searchLimits.sourceCrop.height()) ? ">= " : "", 517653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.maxHeight); 518653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 519653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.minDim = scMinDim(format->format, measPtr->df.minDim); 520653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scMinDim: %s", ((string) measPtr->sc.minDim).c_str()); 521653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 522653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.maxDim = scMaxDim(format->format, measPtr->df.maxDim); 523653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scMaxDim: %s%s", ((measPtr->sc.maxDim.width() 524653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller >= searchLimits.sourceCrop.width()) 525653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller || (measPtr->sc.maxDim.width() >= 526653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller searchLimits.sourceCrop.height())) ? ">= " : "", 527653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ((string) measPtr->sc.maxDim).c_str()); 528653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 529653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.hScale = scHScale(format->format, 530653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.minDim, measPtr->df.maxDim, 531653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.minDim, measPtr->sc.maxDim, 532653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.hScaleBestDf, 533653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.hScaleBestSc); 534653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scHScale: %s%f", 535653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller (measPtr->sc.hScale 536653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller >= Rational(searchLimits.sourceCrop.width(), 537653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.minDim.width())) ? ">= " : "", 538653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller (double) measPtr->sc.hScale); 539653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" HScale Best Display Frame: %s", 540653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ((string) measPtr->sc.hScaleBestDf).c_str()); 541653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" HScale Best Source Crop: %s", 542653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ((string) measPtr->sc.hScaleBestSc).c_str()); 543653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 544653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.vScale = scVScale(format->format, 545653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.minDim, measPtr->df.maxDim, 546653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.minDim, measPtr->sc.maxDim, 547653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.vScaleBestDf, 548653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->sc.vScaleBestSc); 549653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scVScale: %s%f", 550653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller (measPtr->sc.vScale 551653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller >= Rational(searchLimits.sourceCrop.height(), 552653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller measPtr->df.minDim.height())) ? ">= " : "", 553653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller (double) measPtr->sc.vScale); 554653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" VScale Best Display Frame: %s", 555653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ((string) measPtr->sc.vScaleBestDf).c_str()); 556653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" VScale Best Source Crop: %s", 557653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ((string) measPtr->sc.vScaleBestSc).c_str()); 558653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 55906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // Overlap two graphic formats and different blends 56006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // Results displayed after all overlap measurments with 56106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // current format in the foreground 56206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // TODO: make measurments with background blend other than 56306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // none. All of these measurements are done with a 56406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // background blend of HWC_BLENDING_NONE, with the 56506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // blend type of the foregound being varied. 56606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller uint32_t foregroundFormat = format->format; 56706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for (vector<string>::iterator it = formats.begin(); 56806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller it != formats.end(); ++it) { 56906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller uint32_t num; 57006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 57106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller const struct hwcTestGraphicFormat *backgroundFormatPtr 57206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller = hwcTestGraphicFormatLookup((*it).c_str()); 57306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller uint32_t backgroundFormat = backgroundFormatPtr->format; 57406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 57506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller num = numOverlapping(backgroundFormat, foregroundFormat, 57606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller HWC_BLENDING_NONE, HWC_BLENDING_NONE); 57706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller measPtr->overlapBlendNone.push_back(num); 57806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 57906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller num = numOverlapping(backgroundFormat, foregroundFormat, 58006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller HWC_BLENDING_NONE, HWC_BLENDING_PREMULT); 58106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller measPtr->overlapBlendPremult.push_back(num); 58206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 58306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller num = numOverlapping(backgroundFormat, foregroundFormat, 58406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller HWC_BLENDING_NONE, HWC_BLENDING_COVERAGE); 58506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller measPtr->overlapBlendCoverage.push_back(num); 58606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 58706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 58806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 58906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 59006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // Display overlap results 59106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller size_t indent = 2; 59206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI("overlapping blend: none"); 59306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller printFormatHeadings(indent); 59406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for (vector<string>::iterator it = formats.begin(); 59506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller it != formats.end(); ++it) { 59606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller printOverlapLine(indent, *it, measurements[it 59706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller - formats.begin()].overlapBlendNone); 59806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 59906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI(""); 60006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 60106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI("overlapping blend: premult"); 60206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller printFormatHeadings(indent); 60306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for (vector<string>::iterator it = formats.begin(); 60406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller it != formats.end(); ++it) { 60506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller printOverlapLine(indent, *it, measurements[it 60606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller - formats.begin()].overlapBlendPremult); 60706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 60806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI(""); 60906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 61006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI("overlapping blend: coverage"); 61106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller printFormatHeadings(indent); 61206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for (vector<string>::iterator it = formats.begin(); 61306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller it != formats.end(); ++it) { 61406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller printOverlapLine(indent, *it, measurements[it 61506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller - formats.begin()].overlapBlendCoverage); 616653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 61706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI(""); 618653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 619653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Start framework 620653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rv = snprintf(cmd, sizeof(cmd), "%s", CMD_START_FRAMEWORK); 621653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (rv >= (signed) sizeof(cmd) - 1) { 622653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Command too long for: %s", CMD_START_FRAMEWORK); 623653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(21); 624653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 625653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testExecCmd(cmd); 626653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 627653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return 0; 628653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 629653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 630653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Determine the maximum number of overlays that are all of the same format 631653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// that the HWC will commit to. If allowOverlap is true, then the rectangles 632653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// are laid out on a diagonal starting from the upper left corner. With 633653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// each rectangle adjust one pixel to the right and one pixel down. 634653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// When allowOverlap is false, the rectangles are tiled in column major 635653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// order. Note, column major ordering is used so that the initial rectangles 636653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// are all on different horizontal scan rows. It is common that hardware 637653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// has limits on the number of objects it can handle on any single row. 638653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t maxOverlays(uint32_t format, bool allowOverlap) 639653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 640653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller unsigned int max = 0; 641653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 642653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int numRects = 1; numRects <= searchLimits.numOverlays; 643653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller numRects++) { 644653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 645653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 646653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int x = 0; 647653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller (x + startDim.width()) < (unsigned int) width; 648653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller x += (allowOverlap) ? 1 : startDim.width()) { 649653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int y = 0; 650653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller (y + startDim.height()) < (unsigned int) height; 651653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller y += (allowOverlap) ? 1 : startDim.height()) { 652653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, startDim, startDim); 653653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.displayFrame.left = x; 654653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.displayFrame.top = y; 655653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.displayFrame.right = x + startDim.width(); 656653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.displayFrame.bottom = y + startDim.height(); 657653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 658653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 659653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 660653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (rectList.size() >= numRects) { break; } 661653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 662653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (rectList.size() >= numRects) { break; } 663653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 664653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 665653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 666653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > max) { max = num; } 667653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 668653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 669653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return max; 670653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 671653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 672653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Measures what transforms (i.e. flip horizontal, rotate 180) are 673653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// supported by the specified format 674653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerlist<uint32_t> supportedTransforms(uint32_t format) 675653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 676653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<uint32_t> rv; 677653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 678653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, startDim); 679653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 680653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // For each of the transform types 681653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int idx = 0; idx < NUMA(transformType); idx++) { 682653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller unsigned int id = transformType[idx].id; 683653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 684653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.transform = id; 685653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 686653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 687653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 688653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 689653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num == 1) { 690653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rv.push_back(id); 691653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 692653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 693653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 694653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return rv; 695653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 696653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 697653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Determines which types of blends (i.e. none, premult, coverage) are 698653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// supported by the specified format 699653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerlist<uint32_t> supportedBlends(uint32_t format) 700653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 701653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<uint32_t> rv; 702653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 703653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, startDim); 704653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 705653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // For each of the blend types 706653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int idx = 0; idx < NUMA(blendType); idx++) { 707653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller unsigned int id = blendType[idx].id; 708653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 709653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.blend = id; 710653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 711653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 712653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 713653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 714653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num == 1) { 715653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rv.push_back(id); 716653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 717653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 718653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 719653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return rv; 720653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 721653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 722653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Determines the minimum width of any display frame of the given format 723653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// that the HWC will commit to. 724653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t dfMinWidth(uint32_t format) 725653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 726653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t w; 727653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 728653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 729653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (w = 1; w <= startDim.width(); w++) { 730653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(w, startDim.height()); 731653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dim); 732653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 733653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 734653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 735653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 736653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return w; 737653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 738653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 739653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (w > startDim.width()) { 740653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Failed to locate display frame min width"); 741653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(33); 742653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 743653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 744653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return w; 745653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 746653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 747653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Display frame minimum height 748653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t dfMinHeight(uint32_t format) 749653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 750653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t h; 751653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 752653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 753653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (h = 1; h <= startDim.height(); h++) { 754653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(startDim.width(), h); 755653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dim); 756653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 757653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 758653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 759653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 760653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return h; 761653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 762653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 763653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (h > startDim.height()) { 764653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Failed to locate display frame min height"); 765653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(34); 766653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 767653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 768653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return h; 769653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 770653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 771653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Display frame maximum width 772653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t dfMaxWidth(uint32_t format) 773653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 774653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t w; 775653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 776653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 777653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (w = width; w >= startDim.width(); w--) { 778653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(w, startDim.height()); 779653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dim); 780653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 781653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 782653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 783653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 784653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return w; 785653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 786653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 787653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (w < startDim.width()) { 788653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Failed to locate display frame max width"); 789653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(35); 790653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 791653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 792653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return w; 793653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 794653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 795653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Display frame maximum height 796653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t dfMaxHeight(uint32_t format) 797653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 798653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t h; 799653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 800653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (h = height; h >= startDim.height(); h--) { 801653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(startDim.width(), h); 802653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dim); 803653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 804653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 805653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 806653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 807653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return h; 808653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 809653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 810653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (h < startDim.height()) { 811653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Failed to locate display frame max height"); 812653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(36); 813653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 814653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 815653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return h; 816653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 817653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 818653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Determine the minimum number of pixels that the HWC will ever commit to. 819653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Note, this might be different that dfMinWidth * dfMinHeight, in that this 820653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// function adjusts both the width and height from the starting dimension. 821653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim dfMinDim(uint32_t format) 822653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 823653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint64_t bestMinPixels = 0; 824653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim bestDim; 825653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool bestSet = false; // True when value has been assigned to 826653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // bestMinPixels and bestDim 827653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 828653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool origVerbose = verbose; // Temporarily turn off verbose 829653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = false; 830653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t w = 1; w <= startDim.width(); w++) { 831653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t h = 1; h <= startDim.height(); h++) { 832653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (bestSet && ((w > bestMinPixels) || (h > bestMinPixels))) { 833653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller break; 834653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 835653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 836653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(w, h); 837653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dim); 838653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 839653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 840653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 841653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 842653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint64_t pixels = dim.width() * dim.height(); 843653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (!bestSet || (pixels < bestMinPixels)) { 844653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestMinPixels = pixels; 845653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestDim = dim; 846653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestSet = true; 847653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 848653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 849653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 850653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 851653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = origVerbose; 852653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 853653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (!bestSet) { 854653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Unable to locate display frame min dimension"); 855653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(20); 856653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 857653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 858653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return bestDim; 859653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 860653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 861653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Display frame maximum dimension 862653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim dfMaxDim(uint32_t format) 863653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 864653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint64_t bestMaxPixels = 0; 865653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim bestDim; 866653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool bestSet = false; // True when value has been assigned to 867653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // bestMaxPixels and bestDim; 868653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 869653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Potentially increase benchmark performance by first checking 870653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // for the common case of supporting a full display frame. 871653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(width, height); 872653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dim); 873653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 874653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 875653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 876653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num == 1) { return dim; } 877653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 878653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // TODO: Use a binary search 879653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool origVerbose = verbose; // Temporarily turn off verbose 880653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = false; 881653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t w = startDim.width(); w <= (uint32_t) width; w++) { 882653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t h = startDim.height(); h <= (uint32_t) height; h++) { 883653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (bestSet && ((w * h) <= bestMaxPixels)) { continue; } 884653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 885653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(w, h); 886653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dim); 887653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 888653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 889653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 890653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 891653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint64_t pixels = dim.width() * dim.height(); 892653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (!bestSet || (pixels > bestMaxPixels)) { 893653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestMaxPixels = pixels; 894653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestDim = dim; 895653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestSet = true; 896653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 897653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 898653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 899653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 900653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = origVerbose; 901653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 902653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (!bestSet) { 903653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Unable to locate display frame max dimension"); 904653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(21); 905653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 906653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 907653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return bestDim; 908653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 909653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 910653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Source crop minimum width 911653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t scMinWidth(uint32_t format, const HwcTestDim& dfDim) 912653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 913653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t w; 914653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 915653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 916653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Source crop frame min width 917653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (w = 1; w <= dfDim.width(); w++) { 918653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, HwcTestDim(w, dfDim.height())); 919653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 920653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 921653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 922653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 923653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return w; 924653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 925653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 926653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Failed to locate source crop min width"); 927653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(35); 928653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 929653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 930653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Source crop minimum height 931653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t scMinHeight(uint32_t format, const HwcTestDim& dfDim) 932653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 933653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t h; 934653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 935653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 936653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (h = 1; h <= dfDim.height(); h++) { 937653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, HwcTestDim(dfDim.width(), h)); 938653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 939653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 940653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 941653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 942653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return h; 943653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 944653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 945653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Failed to locate source crop min height"); 946653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(36); 947653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 948653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 949653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Source crop maximum width 950653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t scMaxWidth(uint32_t format, const HwcTestDim& dfDim) 951653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 952653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t w; 953653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 954653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 955653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (w = searchLimits.sourceCrop.width(); w >= dfDim.width(); w--) { 956653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, HwcTestDim(w, dfDim.height())); 957653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 958653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 959653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 960653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 961653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return w; 962653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 963653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 964653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Failed to locate source crop max width"); 965653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(35); 966653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 967653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 968653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Source crop maximum height 969653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t scMaxHeight(uint32_t format, const HwcTestDim& dfDim) 970653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 971653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t h; 972653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 973653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 974653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (h = searchLimits.sourceCrop.height(); h >= dfDim.height(); h--) { 975653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, HwcTestDim(dfDim.width(), h)); 976653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.clear(); 977653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 978653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 979653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 980653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return h; 981653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 982653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 983653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Failed to locate source crop max height"); 984653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(36); 985653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 986653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 987653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Source crop minimum dimension 988653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Discovers the source crop with the least number of pixels that the 989653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// HWC will commit to. Note, this may be different from scMinWidth 990653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// * scMinHeight, in that this function searches for a combination of 991653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// width and height. While the other routines always keep one of the 992653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// dimensions equal to the corresponding start dimension. 993653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim scMinDim(uint32_t format, const HwcTestDim& dfDim) 994653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 995653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint64_t bestMinPixels = 0; 996653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim bestDim; 997653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool bestSet = false; // True when value has been assigned to 998653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // bestMinPixels and bestDim 999653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1000653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool origVerbose = verbose; // Temporarily turn off verbose 1001653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = false; 1002653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t w = 1; w <= dfDim.width(); w++) { 1003653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t h = 1; h <= dfDim.height(); h++) { 1004653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (bestSet && ((w > bestMinPixels) || (h > bestMinPixels))) { 1005653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller break; 1006653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1007653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1008653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(w, h); 1009653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, HwcTestDim(w, h)); 1010653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 1011653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 1012653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 1013653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 1014653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint64_t pixels = dim.width() * dim.height(); 1015653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (!bestSet || (pixels < bestMinPixels)) { 1016653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestMinPixels = pixels; 1017653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestDim = dim; 1018653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestSet = true; 1019653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1020653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1021653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1022653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1023653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = origVerbose; 1024653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1025653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (!bestSet) { 1026653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Unable to locate source crop min dimension"); 1027653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(20); 1028653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1029653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1030653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return bestDim; 1031653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1032653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1033653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Source crop maximum dimension 1034653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim scMaxDim(uint32_t format, const HwcTestDim& dfDim) 1035653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1036653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint64_t bestMaxPixels = 0; 1037653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim bestDim; 1038653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool bestSet = false; // True when value has been assigned to 1039653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // bestMaxPixels and bestDim; 1040653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1041653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Potentially increase benchmark performance by first checking 1042653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // for the common case of supporting the maximum checked source size 1043653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim = searchLimits.sourceCrop; 1044653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, searchLimits.sourceCrop); 1045653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 1046653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 1047653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 1048653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num == 1) { return dim; } 1049653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1050653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // TODO: Use a binary search 1051653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool origVerbose = verbose; // Temporarily turn off verbose 1052653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = false; 1053653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t w = dfDim.width(); 1054653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller w <= searchLimits.sourceCrop.width(); w++) { 1055653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t h = dfDim.height(); 1056653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller h <= searchLimits.sourceCrop.height(); h++) { 1057653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (bestSet && ((w * h) <= bestMaxPixels)) { continue; } 1058653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1059653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim dim(w, h); 1060653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, dim); 1061653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 1062653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 1063653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 1064653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num > 0) { 1065653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint64_t pixels = dim.width() * dim.height(); 1066653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (!bestSet || (pixels > bestMaxPixels)) { 1067653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestMaxPixels = pixels; 1068653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestDim = dim; 1069653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestSet = true; 1070653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1071653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1072653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1073653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1074653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller verbose = origVerbose; 1075653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1076653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (!bestSet) { 1077653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("Unable to locate source crop max dimension"); 1078653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(21); 1079653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1080653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1081653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return bestDim; 1082653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1083653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1084653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Source crop horizontal scale 1085653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Determines the maximum factor by which the source crop can be larger 1086653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// that the display frame. The commit point is discovered through a 1087653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// binary search of rational numbers. The numerator in each of the 1088653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// rational numbers contains the dimension for the source crop, while 1089653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// the denominator specifies the dimension for the display frame. On 1090653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// each pass of the binary search the mid-point between the greatest 1091653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// point committed to (best) and the smallest point in which a commit 1092653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// has failed is calculated. This mid-point is then passed to a function 1093653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// named double2Rational, which determines the closest rational numbers 1094653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// just below and above the mid-point. By default the lower rational 1095653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// number is used for the scale factor on the next pass of the binary 1096653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// search. The upper value is only used when best is already equal 1097653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// to the lower value. This only occurs when the lower value has already 1098653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// been tried. 1099653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerRational scHScale(uint32_t format, 1100653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const HwcTestDim& dfMin, const HwcTestDim& dfMax, 1101653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const HwcTestDim& scMin, const HwcTestDim& scMax, 1102653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim& outBestDf, HwcTestDim& outBestSc) 1103653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1104653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim scDim, dfDim; // Source crop and display frame dimension 1105653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational best(0, 1), minBad; // Current bounds for a binary search 1106653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // MinGood is set below the lowest 1107653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // possible scale. The value of minBad, 1108653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // will be set by the first pass 1109653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // of the binary search. 1110653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1111653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Perform the passes of the binary search 1112653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool firstPass = true; 1113653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller do { 1114653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // On first pass try the maximum scale within the search limits 1115653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (firstPass) { 1116653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Try the maximum possible scale, within the search limits 1117653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller scDim = HwcTestDim(searchLimits.sourceCrop.width(), scMin.height()); 1118653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller dfDim = dfMin; 1119653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } else { 1120653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Subsequent pass 1121653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Halve the difference between best and minBad. 1122653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational lower, upper, selected; 1123653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1124653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Try the closest ratio halfway between minBood and minBad; 1125653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // TODO: Avoid rounding issue by using Rational type for 1126653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // midpoint. For now will use double, which should 1127653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // have more than sufficient resolution. 1128653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller double mid = (double) best 1129653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller + ((double) minBad - (double) best) / 2.0; 1130653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational::double2Rational(mid, 1131653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Range(scMin.width(), scMax.width()), 1132653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Range(dfMin.width(), dfMax.width()), 1133653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller lower, upper); 1134653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (((lower == best) && (upper == minBad))) { 1135653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return best; 1136653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1137653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1138653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Use lower value unless its already been tried 1139653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller selected = (lower != best) ? lower : upper; 1140653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1141653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Assign the size of the source crop and display frame 1142653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // from the selected ratio of source crop to display frame. 1143653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller scDim = HwcTestDim(selected.numerator(), scMin.height()); 1144653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller dfDim = HwcTestDim(selected.denominator(), dfMin.height()); 1145653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1146653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1147653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // See if the HWC will commit to this combination 1148653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, scDim); 1149653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 1150653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 1151653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 1152653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1153653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (verbose) { 1154653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scHscale num: %u scale: %f dfDim: %s scDim: %s", 1155653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller num, (float) Rational(scDim.width(), dfDim.width()), 1156653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ((string) dfDim).c_str(), ((string) scDim).c_str()); 1157653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1158653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num == 1) { 1159653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // HWC committed to the combination 1160653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // This is the best scale factor seen so far. Report the 1161653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // dimensions to the caller, in case nothing better is seen. 1162653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller outBestDf = dfDim; 1163653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller outBestSc = scDim; 1164653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1165653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Success on the first pass means the largest possible scale 1166653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // is supported, in which case no need to search any further. 1167653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (firstPass) { return Rational(scDim.width(), dfDim.width()); } 1168653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1169653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Update the lower bound of the binary search 1170653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller best = Rational(scDim.width(), dfDim.width()); 1171653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } else { 1172653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // HWC didn't commit to this combination, so update the 1173653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // upper bound of the binary search. 1174653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller minBad = Rational(scDim.width(), dfDim.width()); 1175653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1176653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1177653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller firstPass = false; 1178653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } while (best != minBad); 1179653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1180653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return best; 1181653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1182653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1183653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Source crop vertical scale 1184653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Determines the maximum factor by which the source crop can be larger 1185653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// that the display frame. The commit point is discovered through a 1186653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// binary search of rational numbers. The numerator in each of the 1187653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// rational numbers contains the dimension for the source crop, while 1188653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// the denominator specifies the dimension for the display frame. On 1189653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// each pass of the binary search the mid-point between the greatest 1190653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// point committed to (best) and the smallest point in which a commit 1191653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// has failed is calculated. This mid-point is then passed to a function 1192653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// named double2Rational, which determines the closest rational numbers 1193653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// just below and above the mid-point. By default the lower rational 1194653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// number is used for the scale factor on the next pass of the binary 1195653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// search. The upper value is only used when best is already equal 1196653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// to the lower value. This only occurs when the lower value has already 1197653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// been tried. 1198653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerRational scVScale(uint32_t format, 1199653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const HwcTestDim& dfMin, const HwcTestDim& dfMax, 1200653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const HwcTestDim& scMin, const HwcTestDim& scMax, 1201653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim& outBestDf, HwcTestDim& outBestSc) 1202653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1203653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim scDim, dfDim; // Source crop and display frame dimension 1204653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational best(0, 1), minBad; // Current bounds for a binary search 1205653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // MinGood is set below the lowest 1206653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // possible scale. The value of minBad, 1207653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // will be set by the first pass 1208653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // of the binary search. 1209653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1210653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Perform the passes of the binary search 1211653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bool firstPass = true; 1212653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller do { 1213653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // On first pass try the maximum scale within the search limits 1214653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (firstPass) { 1215653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Try the maximum possible scale, within the search limits 1216653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller scDim = HwcTestDim(scMin.width(), searchLimits.sourceCrop.height()); 1217653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller dfDim = dfMin; 1218653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } else { 1219653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Subsequent pass 1220653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Halve the difference between best and minBad. 1221653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational lower, upper, selected; 1222653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1223653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Try the closest ratio halfway between minBood and minBad; 1224653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // TODO: Avoid rounding issue by using Rational type for 1225653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // midpoint. For now will use double, which should 1226653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // have more than sufficient resolution. 1227653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller double mid = (double) best 1228653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller + ((double) minBad - (double) best) / 2.0; 1229653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational::double2Rational(mid, 1230653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Range(scMin.height(), scMax.height()), 1231653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Range(dfMin.height(), dfMax.height()), 1232653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller lower, upper); 1233653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (((lower == best) && (upper == minBad))) { 1234653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return best; 1235653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1236653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1237653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Use lower value unless its already been tried 1238653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller selected = (lower != best) ? lower : upper; 1239653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1240653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Assign the size of the source crop and display frame 1241653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // from the selected ratio of source crop to display frame. 1242653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller scDim = HwcTestDim(scMin.width(), selected.numerator()); 1243653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller dfDim = HwcTestDim(dfMin.width(), selected.denominator()); 1244653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1245653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1246653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // See if the HWC will commit to this combination 1247653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rectangle rect(format, dfDim, scDim); 1248653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<Rectangle> rectList; 1249653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rectList.push_back(rect); 1250653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t num = numOverlays(rectList); 1251653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1252653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (verbose) { 1253653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI(" scHscale num: %u scale: %f dfDim: %s scDim: %s", 1254653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller num, (float) Rational(scDim.height(), dfDim.height()), 1255653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ((string) dfDim).c_str(), ((string) scDim).c_str()); 1256653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1257653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (num == 1) { 1258653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // HWC committed to the combination 1259653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // This is the best scale factor seen so far. Report the 1260653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // dimensions to the caller, in case nothing better is seen. 1261653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller outBestDf = dfDim; 1262653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller outBestSc = scDim; 1263653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1264653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Success on the first pass means the largest possible scale 1265653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // is supported, in which case no need to search any further. 1266653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (firstPass) { return Rational(scDim.height(), dfDim.height()); } 1267653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1268653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Update the lower bound of the binary search 1269653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller best = Rational(scDim.height(), dfDim.height()); 1270653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } else { 1271653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // HWC didn't commit to this combination, so update the 1272653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // upper bound of the binary search. 1273653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller minBad = Rational(scDim.height(), dfDim.height()); 1274653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1275653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1276653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller firstPass = false; 1277653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } while (best != minBad); 1278653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1279653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return best; 1280653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1281653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 128206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemilleruint32_t numOverlapping(uint32_t backgroundFormat, uint32_t foregroundFormat, 128306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller uint32_t backgroundBlend, uint32_t foregroundBlend) 128406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller{ 128506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller list<Rectangle> rectList; 1286ee8e64a539f147b8b01dffde4ec8654b64f855beLouis Huemiller 128706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller Rectangle background(backgroundFormat, startDim, startDim); 1288ee8e64a539f147b8b01dffde4ec8654b64f855beLouis Huemiller background.blend = backgroundBlend; 1289ee8e64a539f147b8b01dffde4ec8654b64f855beLouis Huemiller rectList.push_back(background); 129006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 129106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // TODO: Handle cases where startDim is so small that adding 5 129206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // causes frames not to overlap. 129306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // TODO: Handle cases where startDim is so large that adding 5 129406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // cause a portion or all of the foreground displayFrame 129506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller // to be off the display. 1296ee8e64a539f147b8b01dffde4ec8654b64f855beLouis Huemiller Rectangle foreground(foregroundFormat, startDim, startDim); 129706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller foreground.displayFrame.left += 5; 129806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller foreground.displayFrame.top += 5; 129906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller foreground.displayFrame.right += 5; 130006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller foreground.displayFrame.bottom += 5; 1301ee8e64a539f147b8b01dffde4ec8654b64f855beLouis Huemiller background.blend = foregroundBlend; 130206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller rectList.push_back(foreground); 1303ee8e64a539f147b8b01dffde4ec8654b64f855beLouis Huemiller 130406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller uint32_t num = numOverlays(rectList); 130506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 130606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller return num; 130706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller} 130806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 1309653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerRectangle::Rectangle(uint32_t graphicFormat, HwcTestDim dfDim, 1310653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller HwcTestDim sDim) : 1311653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller format(graphicFormat), transform(defaultTransform), 1312653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller blend(defaultBlend), color(defaultColor), alpha(defaultAlpha), 1313653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller sourceCrop(sDim), displayFrame(dfDim) 1314653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1315653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Set source dimension 1316653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Can't use a base initializer, because the setting of format 1317653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // must be done before setting the sourceDimension. 1318653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller setSourceDim(sDim); 1319653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1320653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1321653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillervoid Rectangle::setSourceDim(HwcTestDim dim) 1322653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1323653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller this->sourceDim = dim; 1324653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1325653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller const struct hwcTestGraphicFormat *attrib; 1326653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller attrib = hwcTestGraphicFormatLookup(this->format); 1327653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (attrib != NULL) { 1328653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (sourceDim.width() % attrib->wMod) { 1329653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller sourceDim.setWidth(sourceDim.width() + attrib->wMod 1330653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller - (sourceDim.width() % attrib->wMod)); 1331653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1332653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (sourceDim.height() % attrib->hMod) { 1333653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller sourceDim.setHeight(sourceDim.height() + attrib->hMod 1334653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller - (sourceDim.height() % attrib->hMod)); 1335653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1336653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1337653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1338653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1339653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Rational member functions 1340653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerbool Rational::operator==(const Rational& other) const 1341653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1342653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (((uint64_t) _n * other._d) 1343653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller == ((uint64_t) _d * other._n)) { return true; } 1344653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1345653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return false; 1346653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1347653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1348653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerbool Rational::operator<(const Rational& other) const 1349653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1350653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (((uint64_t) _n * other._d) 1351653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller < ((uint64_t) _d * other._n)) { return true; } 1352653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1353653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return false; 1354653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1355653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1356653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerRational::operator string() const 1357653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1358653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ostringstream out; 1359653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1360653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller out << _n << '/' << _d; 1361653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1362653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return out.str(); 1363653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1364653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1365653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillervoid Rational::double2Rational(double f, Range nRange, Range dRange, 1366653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational& lower, Rational& upper) 1367653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1368653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational bestLower(nRange.lower(), dRange.upper()); 1369653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational bestUpper(nRange.upper(), dRange.lower()); 1370653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1371653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Search for a better solution 1372653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (uint32_t d = dRange.lower(); d <= dRange.upper(); d++) { 1373653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller Rational val(d * f, d); // Lower, because double to int cast truncates 1374653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1375653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if ((val.numerator() < nRange.lower()) 1376653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller || (val.numerator() > nRange.upper())) { continue; } 1377653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1378653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (((double) val > (double) bestLower) && ((double) val <= f)) { 1379653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestLower = val; 1380653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1381653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1382653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller val.setNumerator(val.numerator() + 1); 1383653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (val.numerator() > nRange.upper()) { continue; } 1384653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1385653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (((double) val < (double) bestUpper) && ((double) val >= f)) { 1386653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller bestUpper = val; 1387653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1388653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1389653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1390653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller lower = bestLower; 1391653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller upper = bestUpper; 1392653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1393653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1394653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Local functions 1395653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1396653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Num Overlays 1397653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Given a list of rectangles, determine how many HWC will commit to render 1398653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemilleruint32_t numOverlays(list<Rectangle>& rectList) 1399653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1400b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwc_display_contents_1_t *hwcList; 1401653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller list<sp<GraphicBuffer> > buffers; 1402653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1403653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller hwcList = hwcTestCreateLayerList(rectList.size()); 1404653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (hwcList == NULL) { 1405653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE("numOverlays create hwcList failed"); 1406653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller exit(30); 1407653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1408653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 14095880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hall hwc_layer_1_t *layer = &hwcList->hwLayers[0]; 1410653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (std::list<Rectangle>::iterator it = rectList.begin(); 1411653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller it != rectList.end(); ++it, ++layer) { 1412653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Allocate the texture for the source frame 1413653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // and push it onto the buffers list, so that it 1414653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // stays in scope until a return from this function. 1415653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller sp<GraphicBuffer> texture; 1416653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller texture = new GraphicBuffer(it->sourceDim.width(), 1417653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller it->sourceDim.height(), 1418653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller it->format, texUsage); 1419653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller buffers.push_back(texture); 1420653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1421653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller layer->handle = texture->handle; 1422653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller layer->blending = it->blend; 1423653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller layer->transform = it->transform; 1424653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller layer->sourceCrop = it->sourceCrop; 1425653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller layer->displayFrame = it->displayFrame; 1426653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1427653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller layer->visibleRegionScreen.numRects = 1; 1428653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller layer->visibleRegionScreen.rects = &layer->displayFrame; 1429653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1430653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1431653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Perform prepare operation 1432653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (verbose) { testPrintI("Prepare:"); hwcTestDisplayList(hwcList); } 1433b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwcDevice->prepare(hwcDevice, 1, &hwcList); 1434653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (verbose) { 1435653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintI("Post Prepare:"); 1436653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller hwcTestDisplayListPrepareModifiable(hwcList); 1437653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1438653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1439653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Count the number of overlays 1440653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t total = 0; 1441653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int n1 = 0; n1 < hwcList->numHwLayers; n1++) { 1442653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (hwcList->hwLayers[n1].compositionType == HWC_OVERLAY) { 1443653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller total++; 1444653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1445653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1446653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1447653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller // Free the layer list and graphic buffers 1448653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller hwcTestFreeLayerList(hwcList); 1449653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1450653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return total; 1451653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1452653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1453653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstring transformList2str(const list<uint32_t>& transformList) 1454653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1455653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ostringstream out; 1456653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1457653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (list<uint32_t>::const_iterator it = transformList.begin(); 1458653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller it != transformList.end(); ++it) { 1459653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t id = *it; 1460653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1461653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (it != transformList.begin()) { 1462653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller out << ", "; 1463653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1464653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller out << id; 1465653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1466653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int idx = 0; idx < NUMA(transformType); idx++) { 1467653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (id == transformType[idx].id) { 1468653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller out << " (" << transformType[idx].desc << ')'; 1469653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller break; 1470653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1471653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1472653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1473653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1474653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return out.str(); 1475653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1476653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1477653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerstring blendList2str(const list<uint32_t>& blendList) 1478653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1479653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller ostringstream out; 1480653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1481653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (list<uint32_t>::const_iterator it = blendList.begin(); 1482653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller it != blendList.end(); ++it) { 1483653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller uint32_t id = *it; 1484653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1485653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (it != blendList.begin()) { 1486653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller out << ", "; 1487653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1488653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller out << id; 1489653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1490653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int idx = 0; idx < NUMA(blendType); idx++) { 1491653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (id == blendType[idx].id) { 1492653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller out << " (" << blendType[idx].desc << ')'; 1493653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller break; 1494653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1495653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1496653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1497653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1498653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return out.str(); 1499653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1500653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1501653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillervoid init(void) 1502653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1503653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller srand48(0); 1504653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1505653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller hwcTestInitDisplay(verbose, &dpy, &surface, &width, &height); 1506653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 1507653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller hwcTestOpenHwc(&hwcDevice); 1508653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1509653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 151006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemillervoid printFormatHeadings(size_t indent) 151106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller{ 151206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for (size_t row = 0; row <= maxHeadingLen; row++) { 151306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller ostringstream line; 151406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for(vector<string>::iterator it = formats.begin(); 151506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller it != formats.end(); ++it) { 151606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller if ((maxHeadingLen - row) <= it->length()) { 151706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller if (row != maxHeadingLen) { 151806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller char ch = (*it)[it->length() - (maxHeadingLen - row)]; 151906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller line << ' ' << setw(printFieldWidth) << ch; 152006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } else { 152106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller line << ' ' << string(printFieldWidth, '-'); 152206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 152306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } else { 152406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller line << ' ' << setw(printFieldWidth) << ""; 152506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 152606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 152706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI("%*s%s", indent + maxHeadingLen, "", 152806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller line.str().c_str()); 152906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 153006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller} 153106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 153206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemillervoid printOverlapLine(size_t indent, const string formatStr, 153306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller const vector<uint32_t>& results) 153406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller{ 153506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller ostringstream line; 153606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 153706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller line << setw(indent + maxHeadingLen - formatStr.length()) << ""; 153806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 153906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller line << formatStr; 154006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 154106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller for (vector<uint32_t>::const_iterator it = results.begin(); 154206c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller it != results.end(); ++it) { 154306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller line << ' ' << setw(printFieldWidth) << *it; 154406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 154506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 154606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI("%s", line.str().c_str()); 154706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller} 154806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller 1549653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillervoid printSyntax(const char *cmd) 1550653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 1551653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE(" %s [options] [graphicFormat] ...", 1552653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller cmd); 1553653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE(" options:"); 1554653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE(" -s [width, height] - start dimension"); 1555653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE(" -v - Verbose"); 1556653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE(""); 1557653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE(" graphic formats:"); 1558653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int n1 = 0; n1 < NUMA(hwcTestGraphicFormat); n1++) { 1559653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testPrintE(" %s", hwcTestGraphicFormat[n1].desc); 1560653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 1561653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 1562