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