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