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