1734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/*
2734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Copyright (C) 2011 The Android Open Source Project
3734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
4734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Licensed under the Apache License, Version 2.0 (the "License");
5734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * you may not use this file except in compliance with the License.
6734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * You may obtain a copy of the License at
7734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
8734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *      http://www.apache.org/licenses/LICENSE-2.0
9734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
10734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Unless required by applicable law or agreed to in writing, software
11734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * distributed under the License is distributed on an "AS IS" BASIS,
12734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * See the License for the specific language governing permissions and
14734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * limitations under the License.
15734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
16734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */
17734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
18734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/*
19734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Hardware Composer Color Equivalence
20734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
21734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Synopsis
22734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   hwc_colorequiv [options] eFmt
23734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
24734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *     options:
25734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller         -v - verbose
26734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       -s <0.##, 0.##, 0.##> - Start color (default: <0.0, 0.0, 0.0>
27734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       -e <0.##, 0.##, 0.##> - Ending color (default: <1.0, 1.0, 1.0>
28734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       -r fmt - reference graphic format
29734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       -D #.## - End of test delay
30734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
31734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *     graphic formats:
32734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       RGBA8888 (reference frame default)
33734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       RGBX8888
34734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       RGB888
35734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       RGB565
36734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       BGRA8888
37734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       RGBA5551
38734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       RGBA4444
39734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *       YV12
40734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
41734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Description
42734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   Renders a horizontal blend in two frames.  The first frame is rendered
43734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   in the upper third of the display and is called the reference frame.
44734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   The second frame is displayed in the middle third and is called the
45734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   equivalence frame.  The primary purpose of this utility is to verify
46734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   that the colors produced in the reference and equivalence frames are
47734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   the same.  The colors are the same when the colors are the same
48734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   vertically between the reference and equivalence frames.
49734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
50734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   By default the reference frame is rendered through the use of the
51734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   RGBA8888 graphic format.  The -r option can be used to specify a
52734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   non-default reference frame graphic format.  The graphic format of
53734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   the equivalence frame is determined by a single required positional
54734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   parameter.  Intentionally there is no default for the graphic format
55734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   of the equivalence frame.
56734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
57734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   The horizontal blend in the reference frame is produced from a linear
58734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   interpolation from a start color (default: <0.0, 0.0, 0.0> on the left
59734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   side to an end color (default <1.0, 1.0, 1.0> on the right side.  Where
60734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   possible the equivalence frame is rendered with the equivalent color
61734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   from the reference frame.  A color of black is used in the equivalence
62734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   frame for cases where an equivalent color does not exist.
63734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */
64734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
65d1d16998adea189d5f24a774aa06e0e4e5f3e7ebAurimas Liutikas#define LOG_TAG "hwcColorEquivTest"
66d1d16998adea189d5f24a774aa06e0e4e5f3e7ebAurimas Liutikas
67734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <algorithm>
68734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <assert.h>
69734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cerrno>
70734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cmath>
71734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cstdlib>
72734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <ctime>
73734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <libgen.h>
74734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sched.h>
75734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sstream>
76734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <stdint.h>
77734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <string.h>
78734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <unistd.h>
79734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <vector>
80734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
81734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/syscall.h>
82734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/types.h>
83734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/wait.h>
84734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
85734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <EGL/egl.h>
86734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <EGL/eglext.h>
87734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <GLES2/gl2.h>
88734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <GLES2/gl2ext.h>
89734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
90734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <ui/GraphicBuffer.h>
91734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
92734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <utils/Log.h>
93734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <testUtil.h>
94734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
95734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <hardware/hwcomposer.h>
96734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
97734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include "hwcTestLib.h"
98734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
99734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerusing namespace std;
100734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerusing namespace android;
101734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
102734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Defaults for command-line options
103734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst bool defaultVerbose = false;
104734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst ColorFract defaultStartColor(0.0, 0.0, 0.0);
105734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst ColorFract defaultEndColor(1.0, 1.0, 1.0);
106734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst char *defaultRefFormat = "RGBA8888";
107734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst float defaultEndDelay = 2.0; // Default delay after rendering graphics
108734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
109734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Defines
110734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define MAXSTR               100
111734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define MAXCMD               200
112734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define BITSPERBYTE            8 // TODO: Obtain from <values.h>, once
113734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                                 // it has been added
114734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
115734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define CMD_STOP_FRAMEWORK   "stop 2>&1"
116734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define CMD_START_FRAMEWORK  "start 2>&1"
117734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
118734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Macros
119734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define NUMA(a) (sizeof(a) / sizeof(a [0])) // Num elements in an array
120734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define MEMCLR(addr, size) do { \
121734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        memset((addr), 0, (size)); \
122734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    } while (0)
123734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
124734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Globals
125734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic const int texUsage = GraphicBuffer::USAGE_HW_TEXTURE |
126734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        GraphicBuffer::USAGE_SW_WRITE_RARELY;
1275880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hallstatic hwc_composer_device_1_t *hwcDevice;
128734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic EGLDisplay dpy;
129734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic EGLSurface surface;
130734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic EGLint width, height;
131734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
132734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Functions prototypes
133734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid init(void);
134734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid printSyntax(const char *cmd);
135734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
136734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Command-line option settings
137734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic bool verbose = defaultVerbose;
138734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic ColorFract startRefColor = defaultStartColor;
139734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic ColorFract endRefColor = defaultEndColor;
140734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic float endDelay = defaultEndDelay;
141734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic const struct hwcTestGraphicFormat *refFormat
142734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    = hwcTestGraphicFormatLookup(defaultRefFormat);
143734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic const struct hwcTestGraphicFormat *equivFormat;
144734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
145734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/*
146734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Main
147734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
148734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Performs the following high-level sequence of operations:
149734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
150734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   1. Command-line parsing
151734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
152734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   2. Stop framework
153734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
154734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   3. Initialization
155734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
156734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   4. Create Hardware Composer description of reference and equivalence frames
157734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
158734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   5. Have Hardware Composer render the reference and equivalence frames
159734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
160734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   6. Delay for amount of time given by endDelay
161734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *
162734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *   7. Start framework
163734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */
164734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerint
165734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillermain(int argc, char *argv[])
166734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{
167734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    int rv, opt;
168734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    bool error;
169734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    char *chptr;
170734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    char cmd[MAXCMD];
171734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    string str;
172734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
173734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testSetLogCatTag(LOG_TAG);
174734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
175734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    assert(refFormat != NULL);
176734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
177653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller    testSetLogCatTag(LOG_TAG);
178653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller
179734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Parse command line arguments
180734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    while ((opt = getopt(argc, argv, "vs:e:r:D:?h")) != -1) {
181734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        switch (opt) {
182734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller          case 'D': // End of test delay
183734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    // Delay between completion of final pass and restart
184734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    // of framework
185734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            endDelay = strtod(optarg, &chptr);
186734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            if ((*chptr != '\0') || (endDelay < 0.0)) {
187734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                testPrintE("Invalid command-line specified end of test delay "
188734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                           "of: %s", optarg);
189734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                exit(1);
190734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            }
191734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            break;
192734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
193734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller          case 's': // Starting reference color
194734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            str = optarg;
195734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            while (optind < argc) {
196734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                if (*argv[optind] == '-') { break; }
197734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                char endChar = (str.length() > 1) ? str[str.length() - 1] : 0;
198734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                if ((endChar == '>') || (endChar == ']')) { break; }
199734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                str += " " + string(argv[optind++]);
200734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            }
201734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            {
202734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                istringstream in(str);
203734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                startRefColor = hwcTestParseColor(in, error);
204734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                // Any parse error or characters not used by parser
205734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                if (error
206734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    || (((unsigned int) in.tellg() != in.str().length())
207734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                        && (in.tellg() != (streampos) -1))) {
208734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    testPrintE("Invalid command-line specified start "
209734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                               "reference color of: %s", str.c_str());
210734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    exit(2);
211734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                }
212734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            }
213734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            break;
214734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
215734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller          case 'e': // Ending reference color
216734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            str = optarg;
217734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            while (optind < argc) {
218734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                if (*argv[optind] == '-') { break; }
219734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                char endChar = (str.length() > 1) ? str[str.length() - 1] : 0;
220734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                if ((endChar == '>') || (endChar == ']')) { break; }
221734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                str += " " + string(argv[optind++]);
222734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            }
223734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            {
224734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                istringstream in(str);
225734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                endRefColor = hwcTestParseColor(in, error);
226734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                // Any parse error or characters not used by parser
227734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                if (error
228734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    || (((unsigned int) in.tellg() != in.str().length())
229734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                        && (in.tellg() != (streampos) -1))) {
230734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    testPrintE("Invalid command-line specified end "
231734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                               "reference color of: %s", str.c_str());
232734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    exit(3);
233734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                }
234734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            }
235734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            break;
236734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
237734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller          case 'r': // Reference graphic format
238734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            refFormat = hwcTestGraphicFormatLookup(optarg);
239734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            if (refFormat == NULL) {
240734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                testPrintE("Unkown command-line specified reference graphic "
241734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                           "format of: %s", optarg);
242734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                printSyntax(basename(argv[0]));
243734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                exit(4);
244734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            }
245734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            break;
246734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
247734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller          case 'v': // Verbose
248734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            verbose = true;
249734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            break;
250734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
251734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller          case 'h': // Help
252734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller          case '?':
253734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller          default:
254734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            printSyntax(basename(argv[0]));
255734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller            exit(((optopt == 0) || (optopt == '?')) ? 0 : 5);
256734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        }
257734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
258734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
259734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Expect a single positional parameter, which specifies the
260734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // equivalence graphic format.
261734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if (argc != (optind + 1)) {
262734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("Expected a single command-line postional parameter");
263734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        printSyntax(basename(argv[0]));
264734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        exit(6);
265734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
266734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    equivFormat = hwcTestGraphicFormatLookup(argv[optind]);
267734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if (equivFormat == NULL) {
268734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("Unkown command-line specified equivalence graphic "
269734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                   "format of: %s", argv[optind]);
270734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        printSyntax(basename(argv[0]));
271734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        exit(7);
272734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
273734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
274734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintI("refFormat: %u %s", refFormat->format, refFormat->desc);
275734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintI("equivFormat: %u %s", equivFormat->format, equivFormat->desc);
276734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintI("startRefColor: %s", ((string) startRefColor).c_str());
277734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintI("endRefColor: %s", ((string) endRefColor).c_str());
278734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintI("endDelay: %f", endDelay);
279734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
280734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Stop framework
281734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    rv = snprintf(cmd, sizeof(cmd), "%s", CMD_STOP_FRAMEWORK);
282734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if (rv >= (signed) sizeof(cmd) - 1) {
283734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("Command too long for: %s", CMD_STOP_FRAMEWORK);
284734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        exit(8);
285734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
286734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testExecCmd(cmd);
287734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testDelay(1.0); // TODO - needs means to query whether asynchronous stop
288734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    // framework operation has completed.  For now, just wait
289734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                    // a long time.
290734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
291734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    init();
292734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
293734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Use the upper third of the display for the reference frame and
294734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // the middle third for the equivalence frame.
295734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    unsigned int refHeight = height / 3;
296734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    unsigned int refPosX = 0; // Reference frame X position
297734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    unsigned int refWidth = width - refPosX;
298734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if ((refWidth & refFormat->wMod) != 0) {
299734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        refWidth += refFormat->wMod - (refWidth % refFormat->wMod);
300734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
301734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    unsigned int equivHeight = height / 3;
302734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    unsigned int equivPosX = 0;         // Equivalence frame X position
303734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    unsigned int equivWidth = width - equivPosX;
304734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if ((equivWidth & equivFormat->wMod) != 0) {
305734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        equivWidth += equivFormat->wMod - (equivWidth % equivFormat->wMod);
306734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
307734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
308734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Create reference and equivalence graphic buffers
309734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    const unsigned int numFrames = 2;
310734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    sp<GraphicBuffer> refFrame;
311734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    refFrame = new GraphicBuffer(refWidth, refHeight,
312734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                                 refFormat->format, texUsage);
313734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if ((rv = refFrame->initCheck()) != NO_ERROR) {
314734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("refFrame initCheck failed, rv: %i", rv);
315734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("  width %u height: %u format: %u %s", refWidth, refHeight,
316734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                   refFormat->format,
317734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                   hwcTestGraphicFormat2str(refFormat->format));
318734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        exit(9);
319734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
320734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintI("refFrame width: %u height: %u format: %u %s",
321734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller               refWidth, refHeight, refFormat->format,
322734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller               hwcTestGraphicFormat2str(refFormat->format));
323734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
324734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    sp<GraphicBuffer> equivFrame;
325734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    equivFrame = new GraphicBuffer(equivWidth, equivHeight,
326734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                                   equivFormat->format, texUsage);
327734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if ((rv = refFrame->initCheck()) != NO_ERROR) {
328734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("refFrame initCheck failed, rv: %i", rv);
329734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("  width %u height: %u format: %u %s", refWidth, refHeight,
330734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                   refFormat->format,
331734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                   hwcTestGraphicFormat2str(refFormat->format));
332734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        exit(10);
333734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
334734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintI("equivFrame width: %u height: %u format: %u %s",
335734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller               equivWidth, equivHeight, equivFormat->format,
336734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller               hwcTestGraphicFormat2str(equivFormat->format));
337734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
338734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Fill the frames with a horizontal blend
339734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    hwcTestFillColorHBlend(refFrame.get(), refFormat->format,
340734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                           startRefColor, endRefColor);
341734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    hwcTestFillColorHBlend(equivFrame.get(), refFormat->format,
342734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller                           startRefColor, endRefColor);
343734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
344b685c542836b93c99cd85053e07696406ea37adbJesse Hall    hwc_display_contents_1_t *list;
345b685c542836b93c99cd85053e07696406ea37adbJesse Hall    size_t size = sizeof(hwc_display_contents_1_t) + numFrames * sizeof(hwc_layer_1_t);
346b685c542836b93c99cd85053e07696406ea37adbJesse Hall    if ((list = (hwc_display_contents_1_t *) calloc(1, size)) == NULL) {
347734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("Allocate list failed");
348734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        exit(11);
349734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
350734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    list->flags = HWC_GEOMETRY_CHANGED;
351734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    list->numHwLayers = numFrames;
352734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
3535880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hall    hwc_layer_1_t *layer = &list->hwLayers[0];
354734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->handle = refFrame->handle;
355734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->blending = HWC_BLENDING_NONE;
356734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->sourceCrop.left = 0;
357734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->sourceCrop.top = 0;
358734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->sourceCrop.right = width;
359734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->sourceCrop.bottom = refHeight;
360734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->displayFrame.left = 0;
361734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->displayFrame.top = 0;
362734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->displayFrame.right = width;
363734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->displayFrame.bottom = refHeight;
364734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->visibleRegionScreen.numRects = 1;
365734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->visibleRegionScreen.rects = &layer->displayFrame;
366734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
367734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer++;
368734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->handle = equivFrame->handle;
369734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->blending = HWC_BLENDING_NONE;
370734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->sourceCrop.left = 0;
371734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->sourceCrop.top = 0;
372734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->sourceCrop.right = width;
373734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->sourceCrop.bottom = equivHeight;
374734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->displayFrame.left = 0;
375734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->displayFrame.top = refHeight;
376734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->displayFrame.right = width;
377734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->displayFrame.bottom = layer->displayFrame.top + equivHeight;
378734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->visibleRegionScreen.numRects = 1;
379734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    layer->visibleRegionScreen.rects = &layer->displayFrame;
380734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
381734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Perform prepare operation
382734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if (verbose) { testPrintI("Prepare:"); hwcTestDisplayList(list); }
383b685c542836b93c99cd85053e07696406ea37adbJesse Hall    hwcDevice->prepare(hwcDevice, 1, &list);
384734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if (verbose) {
385734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintI("Post Prepare:");
386734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        hwcTestDisplayListPrepareModifiable(list);
387734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
388734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
389734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Turn off the geometry changed flag
390734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    list->flags &= ~HWC_GEOMETRY_CHANGED;
391734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
392734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if (verbose) {hwcTestDisplayListHandles(list); }
393b685c542836b93c99cd85053e07696406ea37adbJesse Hall    list->dpy = dpy;
394b685c542836b93c99cd85053e07696406ea37adbJesse Hall    list->sur = surface;
395b685c542836b93c99cd85053e07696406ea37adbJesse Hall    hwcDevice->set(hwcDevice, 1, &list);
396734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
397734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testDelay(endDelay);
398734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
399734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Start framework
400734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    rv = snprintf(cmd, sizeof(cmd), "%s", CMD_START_FRAMEWORK);
401734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    if (rv >= (signed) sizeof(cmd) - 1) {
402734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("Command too long for: %s", CMD_START_FRAMEWORK);
403734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        exit(12);
404734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
405734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testExecCmd(cmd);
406734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
407734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    return 0;
408734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller}
409734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
410734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid init(void)
411734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{
412734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Seed pseudo random number generator
413734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // Seeding causes fill horizontal blend to fill the pad area with
414734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    // a deterministic set of values.
415734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    srand48(0);
416734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
417734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    hwcTestInitDisplay(verbose, &dpy, &surface, &width, &height);
418734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
419734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    hwcTestOpenHwc(&hwcDevice);
420734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller}
421734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller
422734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid printSyntax(const char *cmd)
423734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{
424734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("  %s [options] graphicFormat", cmd);
425734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("    options:");
426734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("      -s <0.##, 0.##, 0.##> - Starting reference color");
427734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("      -e <0.##, 0.##, 0.##> - Ending reference color");
428734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("      -r format - Reference graphic format");
429734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("      -D #.## - End of test delay");
430734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("      -v Verbose");
431734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("");
432734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    testPrintE("    graphic formats:");
433734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    for (unsigned int n1 = 0; n1 < NUMA(hwcTestGraphicFormat); n1++) {
434734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller        testPrintE("      %s", hwcTestGraphicFormat[n1].desc);
435734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller    }
436734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller}
437