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