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 65734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <algorithm> 66734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <assert.h> 67734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cerrno> 68734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cmath> 69734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <cstdlib> 70734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <ctime> 71734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <libgen.h> 72734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sched.h> 73734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sstream> 74734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <stdint.h> 75734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <string.h> 76734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <unistd.h> 77734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <vector> 78734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 79734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/syscall.h> 80734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/types.h> 81734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sys/wait.h> 82734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 83734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <EGL/egl.h> 84734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <EGL/eglext.h> 85734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <GLES2/gl2.h> 86734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <GLES2/gl2ext.h> 87734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 88734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <ui/FramebufferNativeWindow.h> 89734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <ui/GraphicBuffer.h> 90734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 91734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define LOG_TAG "hwcColorEquivTest" 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 unsigned int pass; 171734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller char cmd[MAXCMD]; 172734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller string str; 173734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 174734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testSetLogCatTag(LOG_TAG); 175734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 176734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller assert(refFormat != NULL); 177734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 178653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller testSetLogCatTag(LOG_TAG); 179653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 180734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Parse command line arguments 181734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller while ((opt = getopt(argc, argv, "vs:e:r:D:?h")) != -1) { 182734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller switch (opt) { 183734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'D': // End of test delay 184734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Delay between completion of final pass and restart 185734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // of framework 186734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller endDelay = strtod(optarg, &chptr); 187734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((*chptr != '\0') || (endDelay < 0.0)) { 188734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified end of test delay " 189734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "of: %s", optarg); 190734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(1); 191734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 192734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 193734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 194734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 's': // Starting reference color 195734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller str = optarg; 196734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller while (optind < argc) { 197734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (*argv[optind] == '-') { break; } 198734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller char endChar = (str.length() > 1) ? str[str.length() - 1] : 0; 199734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((endChar == '>') || (endChar == ']')) { break; } 200734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller str += " " + string(argv[optind++]); 201734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 202734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller { 203734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller istringstream in(str); 204734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller startRefColor = hwcTestParseColor(in, error); 205734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Any parse error or characters not used by parser 206734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (error 207734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (((unsigned int) in.tellg() != in.str().length()) 208734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller && (in.tellg() != (streampos) -1))) { 209734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified start " 210734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "reference color of: %s", str.c_str()); 211734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(2); 212734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 213734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 214734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 215734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 216734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'e': // Ending reference color 217734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller str = optarg; 218734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller while (optind < argc) { 219734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (*argv[optind] == '-') { break; } 220734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller char endChar = (str.length() > 1) ? str[str.length() - 1] : 0; 221734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((endChar == '>') || (endChar == ']')) { break; } 222734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller str += " " + string(argv[optind++]); 223734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 224734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller { 225734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller istringstream in(str); 226734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller endRefColor = hwcTestParseColor(in, error); 227734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Any parse error or characters not used by parser 228734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (error 229734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (((unsigned int) in.tellg() != in.str().length()) 230734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller && (in.tellg() != (streampos) -1))) { 231734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Invalid command-line specified end " 232734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "reference color of: %s", str.c_str()); 233734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(3); 234734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 235734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 236734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 237734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 238734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'r': // Reference graphic format 239734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller refFormat = hwcTestGraphicFormatLookup(optarg); 240734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (refFormat == NULL) { 241734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Unkown command-line specified reference graphic " 242734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "format of: %s", optarg); 243734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printSyntax(basename(argv[0])); 244734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(4); 245734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 246734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 247734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 248734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'v': // Verbose 249734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller verbose = true; 250734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller break; 251734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 252734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case 'h': // Help 253734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller case '?': 254734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller default: 255734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printSyntax(basename(argv[0])); 256734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(((optopt == 0) || (optopt == '?')) ? 0 : 5); 257734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 258734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 259734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 260734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Expect a single positional parameter, which specifies the 261734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // equivalence graphic format. 262734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (argc != (optind + 1)) { 263734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Expected a single command-line postional parameter"); 264734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printSyntax(basename(argv[0])); 265734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(6); 266734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 267734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller equivFormat = hwcTestGraphicFormatLookup(argv[optind]); 268734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (equivFormat == NULL) { 269734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Unkown command-line specified equivalence graphic " 270734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller "format of: %s", argv[optind]); 271734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printSyntax(basename(argv[0])); 272734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(7); 273734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 274734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 275734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("refFormat: %u %s", refFormat->format, refFormat->desc); 276734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("equivFormat: %u %s", equivFormat->format, equivFormat->desc); 277734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("startRefColor: %s", ((string) startRefColor).c_str()); 278734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("endRefColor: %s", ((string) endRefColor).c_str()); 279734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("endDelay: %f", endDelay); 280734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 281734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Stop framework 282734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller rv = snprintf(cmd, sizeof(cmd), "%s", CMD_STOP_FRAMEWORK); 283734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (rv >= (signed) sizeof(cmd) - 1) { 284734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Command too long for: %s", CMD_STOP_FRAMEWORK); 285734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(8); 286734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 287734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testExecCmd(cmd); 288734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testDelay(1.0); // TODO - needs means to query whether asynchronous stop 289734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // framework operation has completed. For now, just wait 290734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // a long time. 291734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 292734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller init(); 293734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 294734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Use the upper third of the display for the reference frame and 295734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // the middle third for the equivalence frame. 296734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int refHeight = height / 3; 297734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int refPosY = 0; // Reference frame Y position 298734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int refPosX = 0; // Reference frame X position 299734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int refWidth = width - refPosX; 300734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((refWidth & refFormat->wMod) != 0) { 301734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller refWidth += refFormat->wMod - (refWidth % refFormat->wMod); 302734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 303734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int equivHeight = height / 3; 304734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int equivPosY = refHeight; // Equivalence frame Y position 305734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int equivPosX = 0; // Equivalence frame X position 306734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned int equivWidth = width - equivPosX; 307734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((equivWidth & equivFormat->wMod) != 0) { 308734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller equivWidth += equivFormat->wMod - (equivWidth % equivFormat->wMod); 309734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 310734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 311734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Create reference and equivalence graphic buffers 312734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const unsigned int numFrames = 2; 313734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller sp<GraphicBuffer> refFrame; 314734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller refFrame = new GraphicBuffer(refWidth, refHeight, 315734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller refFormat->format, texUsage); 316734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((rv = refFrame->initCheck()) != NO_ERROR) { 317734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("refFrame initCheck failed, rv: %i", rv); 318734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" width %u height: %u format: %u %s", refWidth, refHeight, 319734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller refFormat->format, 320734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestGraphicFormat2str(refFormat->format)); 321734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(9); 322734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 323734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("refFrame width: %u height: %u format: %u %s", 324734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller refWidth, refHeight, refFormat->format, 325734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestGraphicFormat2str(refFormat->format)); 326734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 327734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller sp<GraphicBuffer> equivFrame; 328734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller equivFrame = new GraphicBuffer(equivWidth, equivHeight, 329734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller equivFormat->format, texUsage); 330734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((rv = refFrame->initCheck()) != NO_ERROR) { 331734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("refFrame initCheck failed, rv: %i", rv); 332734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" width %u height: %u format: %u %s", refWidth, refHeight, 333734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller refFormat->format, 334734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestGraphicFormat2str(refFormat->format)); 335734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(10); 336734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 337734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("equivFrame width: %u height: %u format: %u %s", 338734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller equivWidth, equivHeight, equivFormat->format, 339734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestGraphicFormat2str(equivFormat->format)); 340734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 341734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Fill the frames with a horizontal blend 342734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestFillColorHBlend(refFrame.get(), refFormat->format, 343734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller startRefColor, endRefColor); 344734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestFillColorHBlend(equivFrame.get(), refFormat->format, 345734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller startRefColor, endRefColor); 346734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 347b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwc_display_contents_1_t *list; 348b685c542836b93c99cd85053e07696406ea37adbJesse Hall size_t size = sizeof(hwc_display_contents_1_t) + numFrames * sizeof(hwc_layer_1_t); 349b685c542836b93c99cd85053e07696406ea37adbJesse Hall if ((list = (hwc_display_contents_1_t *) calloc(1, size)) == NULL) { 350734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Allocate list failed"); 351734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(11); 352734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 353734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->flags = HWC_GEOMETRY_CHANGED; 354734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->numHwLayers = numFrames; 355734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 3565880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hall hwc_layer_1_t *layer = &list->hwLayers[0]; 357734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->handle = refFrame->handle; 358734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->blending = HWC_BLENDING_NONE; 359734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.left = 0; 360734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.top = 0; 361734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.right = width; 362734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.bottom = refHeight; 363734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.left = 0; 364734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.top = 0; 365734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.right = width; 366734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.bottom = refHeight; 367734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->visibleRegionScreen.numRects = 1; 368734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->visibleRegionScreen.rects = &layer->displayFrame; 369734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 370734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer++; 371734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->handle = equivFrame->handle; 372734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->blending = HWC_BLENDING_NONE; 373734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.left = 0; 374734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.top = 0; 375734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.right = width; 376734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->sourceCrop.bottom = equivHeight; 377734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.left = 0; 378734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.top = refHeight; 379734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.right = width; 380734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->displayFrame.bottom = layer->displayFrame.top + equivHeight; 381734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->visibleRegionScreen.numRects = 1; 382734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller layer->visibleRegionScreen.rects = &layer->displayFrame; 383734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 384734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Perform prepare operation 385734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { testPrintI("Prepare:"); hwcTestDisplayList(list); } 386b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwcDevice->prepare(hwcDevice, 1, &list); 387734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { 388734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("Post Prepare:"); 389734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestDisplayListPrepareModifiable(list); 390734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 391734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 392734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Turn off the geometry changed flag 393734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->flags &= ~HWC_GEOMETRY_CHANGED; 394734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 395734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) {hwcTestDisplayListHandles(list); } 396b685c542836b93c99cd85053e07696406ea37adbJesse Hall list->dpy = dpy; 397b685c542836b93c99cd85053e07696406ea37adbJesse Hall list->sur = surface; 398b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwcDevice->set(hwcDevice, 1, &list); 399734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 400734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testDelay(endDelay); 401734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 402734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Start framework 403734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller rv = snprintf(cmd, sizeof(cmd), "%s", CMD_START_FRAMEWORK); 404734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (rv >= (signed) sizeof(cmd) - 1) { 405734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("Command too long for: %s", CMD_START_FRAMEWORK); 406734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(12); 407734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 408734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testExecCmd(cmd); 409734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 410734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return 0; 411734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 412734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 413734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid init(void) 414734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 415734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Seed pseudo random number generator 416734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Seeding causes fill horizontal blend to fill the pad area with 417734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // a deterministic set of values. 418734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller srand48(0); 419734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 420734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestInitDisplay(verbose, &dpy, &surface, &width, &height); 421734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 422734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestOpenHwc(&hwcDevice); 423734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 424734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 425734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid printSyntax(const char *cmd) 426734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 427734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" %s [options] graphicFormat", cmd); 428734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" options:"); 429734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -s <0.##, 0.##, 0.##> - Starting reference color"); 430734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -e <0.##, 0.##, 0.##> - Ending reference color"); 431734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -r format - Reference graphic format"); 432734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -D #.## - End of test delay"); 433734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" -v Verbose"); 434734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(""); 435734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" graphic formats:"); 436734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int n1 = 0; n1 < NUMA(hwcTestGraphicFormat); n1++) { 437734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE(" %s", hwcTestGraphicFormat[n1].desc); 438734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 439734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 440