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 Test Library 20734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Utility library functions for use by the Hardware Composer test cases 21734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 22734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 23734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <sstream> 24734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <string> 25734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 26734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#include <arpa/inet.h> // For ntohl() and htonl() 27734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 28622cfadc8f0d294f875151fe1d8985e0553795eaMathias Agopian#include "hwcTestLib.h" 29734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 30870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#include "EGLUtils.h" 31870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian 32734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Defines 33734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define NUMA(a) (sizeof(a) / sizeof(a [0])) 34734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 35734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Function Prototypes 36734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic void printGLString(const char *name, GLenum s); 37734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE); 38734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic void checkGlError(const char* op); 39734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic void printEGLConfiguration(EGLDisplay dpy, EGLConfig config); 40734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 41734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerusing namespace std; 42734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerusing namespace android; 43734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 44734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 45734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define BITSPERBYTE 8 // TODO: Obtain from <values.h>, once 46734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // it has been added 47734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 48734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Initialize Display 49734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid hwcTestInitDisplay(bool verbose, EGLDisplay *dpy, EGLSurface *surface, 50734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLint *width, EGLint *height) 51734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 52734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller static EGLContext context; 53734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 54734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int rv; 55734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 56734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLBoolean returnValue; 57734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLConfig myConfig = {0}; 58734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 59734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLint sConfigAttribs[] = { 60734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 61734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 62734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGL_NONE }; 63734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLint majorVersion, minorVersion; 64734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 65734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("<init>"); 66734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 67734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("eglGetDisplay"); 68734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (*dpy == EGL_NO_DISPLAY) { 69734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("eglGetDisplay returned EGL_NO_DISPLAY"); 70734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(70); 71734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 72734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 73734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller returnValue = eglInitialize(*dpy, &majorVersion, &minorVersion); 74734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("eglInitialize", returnValue); 75734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { 76734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("EGL version %d.%d", majorVersion, minorVersion); 77734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 78734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (returnValue != EGL_TRUE) { 79734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("eglInitialize failed"); 80734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(71); 81734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 82734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 836ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden // The tests want to stop the framework and play with the hardware 846ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden // composer, which means it doesn't make sense to use WindowSurface 856ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden // here. android_createDisplaySurface() is going away, so just 866ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden // politely fail here. 876ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden EGLNativeWindowType window = NULL; //android_createDisplaySurface(); 88734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (window == NULL) { 89734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("android_createDisplaySurface failed"); 90734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(72); 91734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 92734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller returnValue = EGLUtils::selectConfigForNativeWindow(*dpy, 93734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller sConfigAttribs, window, &myConfig); 94734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (returnValue) { 95734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("EGLUtils::selectConfigForNativeWindow() returned %d", 96734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller returnValue); 97734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(73); 98734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 99734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("EGLUtils::selectConfigForNativeWindow"); 100734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 101734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { 102734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("Chose this configuration:"); 103734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printEGLConfiguration(*dpy, myConfig); 104734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 105734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 106734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *surface = eglCreateWindowSurface(*dpy, myConfig, window, NULL); 107734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("eglCreateWindowSurface"); 108734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (*surface == EGL_NO_SURFACE) { 109734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("gelCreateWindowSurface failed."); 110734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(74); 111734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 112734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 113734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller context = eglCreateContext(*dpy, myConfig, EGL_NO_CONTEXT, contextAttribs); 114734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("eglCreateContext"); 115734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (context == EGL_NO_CONTEXT) { 116734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("eglCreateContext failed"); 117734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(75); 118734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 119734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller returnValue = eglMakeCurrent(*dpy, *surface, *surface, context); 120734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("eglMakeCurrent", returnValue); 121734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (returnValue != EGL_TRUE) { 122734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("eglMakeCurrent failed"); 123734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(76); 124734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 125734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller eglQuerySurface(*dpy, *surface, EGL_WIDTH, width); 126734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("eglQuerySurface"); 127734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller eglQuerySurface(*dpy, *surface, EGL_HEIGHT, height); 128734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller checkEglError("eglQuerySurface"); 129734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 130734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (verbose) { 131734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("Window dimensions: %d x %d", *width, *height); 132734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 133734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printGLString("Version", GL_VERSION); 134734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printGLString("Vendor", GL_VENDOR); 135734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printGLString("Renderer", GL_RENDERER); 136734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller printGLString("Extensions", GL_EXTENSIONS); 137734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 138734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 139734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 140734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Open Hardware Composer Device 1415880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hallvoid hwcTestOpenHwc(hwc_composer_device_1_t **hwcDevicePtr) 142734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 143734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int rv; 144734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hw_module_t const *hwcModule; 145734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 146734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((rv = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwcModule)) != 0) { 147734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hw_get_module failed, rv: %i", rv); 148734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller errno = -rv; 149734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller perror(NULL); 150734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(77); 151734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 1525880cc573823148237eac9ab7bc586b8e4eb7160Jesse Hall if ((rv = hwc_open_1(hwcModule, hwcDevicePtr)) != 0) { 153734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hwc_open failed, rv: %i", rv); 154734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller errno = -rv; 155734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller perror(NULL); 156734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(78); 157734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 158734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 159734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 160734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Color fraction class to string conversion 161734d8d898c6b0b315e431b231cc6759514da361bLouis HuemillerColorFract::operator string() 162734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 163734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ostringstream out; 164734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 165734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller out << '[' << this->c1() << ", " 166734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller << this->c2() << ", " 167734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller << this->c3() << ']'; 168734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 169734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return out.str(); 170734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 171734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 172734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Dimension class to string conversion 173734d8d898c6b0b315e431b231cc6759514da361bLouis HuemillerHwcTestDim::operator string() 174734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 175734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ostringstream out; 176734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 177734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller out << '[' << this->width() << ", " 178734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller << this->height() << ']'; 179734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 180734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return out.str(); 181734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 182734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 183653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Dimension class to hwc_rect conversion 184653f81087920d479d8916a6ae6d2575dd80ed665Louis HuemillerHwcTestDim::operator hwc_rect() const 185653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 186653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller hwc_rect rect; 187653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 188653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.left = rect.top = 0; 189653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 190653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.right = this->_w; 191653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller rect.bottom = this->_h; 192653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 193653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return rect; 194653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 195653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 196734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Hardware Composer rectangle to string conversion 197734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstring hwcTestRect2str(const struct hwc_rect& rect) 198734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 199734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ostringstream out; 200734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 201734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller out << '['; 202734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller out << rect.left << ", "; 203734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller out << rect.top << ", "; 204734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller out << rect.right << ", "; 205734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller out << rect.bottom; 206734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller out << ']'; 207734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 208734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return out.str(); 209734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 210734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 211734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Parse HWC rectangle description of form [left, top, right, bottom] 212734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstruct hwc_rect hwcTestParseHwcRect(istringstream& in, bool& error) 213734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 214734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller struct hwc_rect rect; 215734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller char chStart, ch; 216734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 217734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Defensively specify that an error occurred. Will clear 218734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // error flag if all of parsing succeeds. 219734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller error = true; 220734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 221734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // First character should be a [ or < 222734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> chStart; 223734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || ((chStart != '<') && (chStart != '['))) { return rect; } 224734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 225734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Left 226734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> rect.left; 227734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return rect; } 228734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 229734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || (ch != ',')) { return rect; } 230734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 231734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Top 232734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> rect.top; 233734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return rect; } 234734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 235734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || (ch != ',')) { return rect; } 236734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 237734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Right 238734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> rect.right; 239734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return rect; } 240734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 241734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || (ch != ',')) { return rect; } 242734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 243734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Bottom 244734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> rect.bottom; 245734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return rect; } 246734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 247734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Closing > or ] 248734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 249734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return rect; } 250734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (((chStart == '<') && (ch != '>')) 251734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || ((chStart == '[') && (ch != ']'))) { return rect; } 252734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 253734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Validate right and bottom are greater than left and top 254734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((rect.right <= rect.left) || (rect.bottom <= rect.top)) { return rect; } 255734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 256734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Made It, clear error indicator 257734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller error = false; 258734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 259734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return rect; 260734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 261734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 262734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Parse dimension of form [width, height] 263734d8d898c6b0b315e431b231cc6759514da361bLouis HuemillerHwcTestDim hwcTestParseDim(istringstream& in, bool& error) 264734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 265734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller HwcTestDim dim; 266734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller char chStart, ch; 267734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t val; 268734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 269734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Defensively specify that an error occurred. Will clear 270734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // error flag if all of parsing succeeds. 271734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller error = true; 272734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 273734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // First character should be a [ or < 274734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> chStart; 275734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || ((chStart != '<') && (chStart != '['))) { return dim; } 276734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 277734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Width 278734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> val; 279734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return dim; } 280734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller dim.setWidth(val); 281734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 282734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || (ch != ',')) { return dim; } 283734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 284734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Height 285734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> val; 286734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return dim; } 287734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller dim.setHeight(val); 288734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 289734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Closing > or ] 290734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 291734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return dim; } 292734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (((chStart == '<') && (ch != '>')) 293734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || ((chStart == '[') && (ch != ']'))) { return dim; } 294734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 295734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Validate width and height greater than 0 296734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((dim.width() <= 0) || (dim.height() <= 0)) { return dim; } 297734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 298734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Made It, clear error indicator 299734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller error = false; 300734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return dim; 301734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 302734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 303734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Parse fractional color of form [0.##, 0.##, 0.##] 304734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Fractional values can be from 0.0 to 1.0 inclusive. Note, integer 305734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// values of 0.0 and 1.0, which are non-fractional, are considered valid. 306734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// They are an exception, all other valid inputs are fractions. 307734d8d898c6b0b315e431b231cc6759514da361bLouis HuemillerColorFract hwcTestParseColor(istringstream& in, bool& error) 308734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 309734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ColorFract color; 310734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller char chStart, ch; 311734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float c1, c2, c3; 312734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 313734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Defensively specify that an error occurred. Will clear 314734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // error flag if all of parsing succeeds. 315734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller error = true; 316734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 317734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // First character should be a [ or < 318734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> chStart; 319734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || ((chStart != '<') && (chStart != '['))) { return color; } 320734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 321734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // 1st Component 322734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> c1; 323734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return color; } 324734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((c1 < 0.0) || (c1 > 1.0)) { return color; } 325734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 326734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || (ch != ',')) { return color; } 327734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 328734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // 2nd Component 329734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> c2; 330734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return color; } 331734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((c2 < 0.0) || (c2 > 1.0)) { return color; } 332734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 333734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in || (ch != ',')) { return color; } 334734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 335734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // 3rd Component 336734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> c3; 337734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return color; } 338734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((c3 < 0.0) || (c3 > 1.0)) { return color; } 339734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 340734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Closing > or ] 341734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller in >> ch; 342734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (!in) { return color; } 343734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (((chStart == '<') && (ch != '>')) 344734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || ((chStart == '[') && (ch != ']'))) { return color; } 345734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 346734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Are all the components fractional 347734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((c1 < 0.0) || (c1 > 1.0) 348734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (c2 < 0.0) || (c2 > 1.0) 349734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (c3 < 0.0) || (c3 > 1.0)) { return color; } 350734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 351734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Made It, clear error indicator 352734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller error = false; 353734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 354734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return ColorFract(c1, c2, c3); 355734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 356734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 357734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Look up and return pointer to structure with the characteristics 358734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// of the graphic format named by the desc parameter. Search failure 359734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// indicated by the return of NULL. 360734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst struct hwcTestGraphicFormat *hwcTestGraphicFormatLookup(const char *desc) 361734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 362734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int n1 = 0; n1 < NUMA(hwcTestGraphicFormat); n1++) { 363734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (string(desc) == string(hwcTestGraphicFormat[n1].desc)) { 364734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return &hwcTestGraphicFormat[n1]; 365734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 366734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 367734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 368734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return NULL; 369734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 370734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 371653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// Look up and return pointer to structure with the characteristics 372653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// of the graphic format specified by the id parameter. Search failure 373653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller// indicated by the return of NULL. 374653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemillerconst struct hwcTestGraphicFormat *hwcTestGraphicFormatLookup(uint32_t id) 375653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller{ 376653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller for (unsigned int n1 = 0; n1 < NUMA(hwcTestGraphicFormat); n1++) { 377653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller if (id == hwcTestGraphicFormat[n1].format) { 378653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return &hwcTestGraphicFormat[n1]; 379653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 380653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller } 381653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 382653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller return NULL; 383653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller} 384653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 385653f81087920d479d8916a6ae6d2575dd80ed665Louis Huemiller 386734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Given the integer ID of a graphic format, return a pointer to 387734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// a string that describes the format. 388734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerconst char *hwcTestGraphicFormat2str(uint32_t format) 389734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 390734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const static char *unknown = "unknown"; 391734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 392734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int n1 = 0; n1 < NUMA(hwcTestGraphicFormat); n1++) { 393734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (format == hwcTestGraphicFormat[n1].format) { 394734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return hwcTestGraphicFormat[n1].desc; 395734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 396734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 397734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 398734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return unknown; 399734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 400734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 401734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 402734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * hwcTestCreateLayerList 403734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Dynamically creates layer list with numLayers worth 404734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * of hwLayers entries. 405734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 406b685c542836b93c99cd85053e07696406ea37adbJesse Hallhwc_display_contents_1_t *hwcTestCreateLayerList(size_t numLayers) 407734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 408b685c542836b93c99cd85053e07696406ea37adbJesse Hall hwc_display_contents_1_t *list; 409734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 410b685c542836b93c99cd85053e07696406ea37adbJesse Hall size_t size = sizeof(hwc_display_contents_1_t) + numLayers * sizeof(hwc_layer_1_t); 411b685c542836b93c99cd85053e07696406ea37adbJesse Hall if ((list = (hwc_display_contents_1_t *) calloc(1, size)) == NULL) { 412734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return NULL; 413734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 414734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->flags = HWC_GEOMETRY_CHANGED; 415734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->numHwLayers = numLayers; 416734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 417734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return list; 418734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 419734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 420734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 421734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * hwcTestFreeLayerList 422734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Frees memory previous allocated via hwcTestCreateLayerList(). 423734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 424b685c542836b93c99cd85053e07696406ea37adbJesse Hallvoid hwcTestFreeLayerList(hwc_display_contents_1_t *list) 425734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 426734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller free(list); 427734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 428734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 429734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Display the settings of the layer list pointed to by list 430b685c542836b93c99cd85053e07696406ea37adbJesse Hallvoid hwcTestDisplayList(hwc_display_contents_1_t *list) 431734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 432734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" flags: %#x%s", list->flags, 433734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->flags & HWC_GEOMETRY_CHANGED) ? " GEOMETRY_CHANGED" : ""); 434734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" numHwLayers: %u", list->numHwLayers); 435734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 436734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int layer = 0; layer < list->numHwLayers; layer++) { 437734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" layer %u compositionType: %#x%s%s", layer, 438734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->hwLayers[layer].compositionType, 439734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].compositionType == HWC_FRAMEBUFFER) 440734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " FRAMEBUFFER" : "", 441734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].compositionType == HWC_OVERLAY) 442734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " OVERLAY" : ""); 443734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 444734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" hints: %#x", 445734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->hwLayers[layer].hints, 446734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].hints & HWC_HINT_TRIPLE_BUFFER) 447734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " TRIPLE_BUFFER" : "", 448734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].hints & HWC_HINT_CLEAR_FB) 449734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " CLEAR_FB" : ""); 450734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 451734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" flags: %#x%s", 452734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->hwLayers[layer].flags, 453734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].flags & HWC_SKIP_LAYER) 454734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " SKIP_LAYER" : ""); 455734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 456734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" handle: %p", 457734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->hwLayers[layer].handle); 458734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 459734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Intentionally skipped display of ROT_180 & ROT_270, 460734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // which are formed from combinations of the other flags. 461734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" transform: %#x%s%s%s", 462734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->hwLayers[layer].transform, 463734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].transform & HWC_TRANSFORM_FLIP_H) 464734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " FLIP_H" : "", 465734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].transform & HWC_TRANSFORM_FLIP_V) 466734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " FLIP_V" : "", 467734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].transform & HWC_TRANSFORM_ROT_90) 468734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " ROT_90" : ""); 469734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 470734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" blending: %#x%s%s%s", 471734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->hwLayers[layer].blending, 472734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].blending == HWC_BLENDING_NONE) 473734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " NONE" : "", 474734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].blending == HWC_BLENDING_PREMULT) 475734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " PREMULT" : "", 476734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].blending == HWC_BLENDING_COVERAGE) 477734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " COVERAGE" : ""); 478734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 479734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" sourceCrop: %s", 480734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestRect2str(list->hwLayers[layer].sourceCrop).c_str()); 481734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" displayFrame: %s", 482734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestRect2str(list->hwLayers[layer].displayFrame).c_str()); 483734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" scaleFactor: [%f, %f]", 48406c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller (float) (list->hwLayers[layer].sourceCrop.right 48506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller - list->hwLayers[layer].sourceCrop.left) 48606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller / (float) (list->hwLayers[layer].displayFrame.right 48706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller - list->hwLayers[layer].displayFrame.left), 48806c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller (float) (list->hwLayers[layer].sourceCrop.bottom 48906c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller - list->hwLayers[layer].sourceCrop.top) 49006c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller / (float) (list->hwLayers[layer].displayFrame.bottom 49106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller - list->hwLayers[layer].displayFrame.top)); 492734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 493734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 494734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 495734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 496734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Display List Prepare Modifiable 497734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 498734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Displays the portions of a list that are meant to be modified by 499734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * a prepare call. 500734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 501b685c542836b93c99cd85053e07696406ea37adbJesse Hallvoid hwcTestDisplayListPrepareModifiable(hwc_display_contents_1_t *list) 502734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 50306c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller uint32_t numOverlays = 0; 504734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int layer = 0; layer < list->numHwLayers; layer++) { 50506c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller if (list->hwLayers[layer].compositionType == HWC_OVERLAY) { 50606c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller numOverlays++; 50706c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller } 508734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" layer %u compositionType: %#x%s%s", layer, 509734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->hwLayers[layer].compositionType, 510734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].compositionType == HWC_FRAMEBUFFER) 511734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " FRAMEBUFFER" : "", 512734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].compositionType == HWC_OVERLAY) 513734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " OVERLAY" : ""); 514734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" hints: %#x%s%s", 515734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller list->hwLayers[layer].hints, 516734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].hints & HWC_HINT_TRIPLE_BUFFER) 517734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " TRIPLE_BUFFER" : "", 518734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (list->hwLayers[layer].hints & HWC_HINT_CLEAR_FB) 519734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? " CLEAR_FB" : ""); 520734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 52106c3ae9457d602461d249b0146e92b84a740eb32Louis Huemiller testPrintI(" numOverlays: %u", numOverlays); 522734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 523734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 524734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 525734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Display List Handles 526734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 527734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Displays the handles of all the graphic buffers in the list. 528734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 529b685c542836b93c99cd85053e07696406ea37adbJesse Hallvoid hwcTestDisplayListHandles(hwc_display_contents_1_t *list) 530734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 531734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const unsigned int maxLayersPerLine = 6; 532734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 533734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ostringstream str(" layers:"); 534734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int layer = 0; layer < list->numHwLayers; layer++) { 535734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller str << ' ' << list->hwLayers[layer].handle; 536734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (((layer % maxLayersPerLine) == (maxLayersPerLine - 1)) 537734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller && (layer != list->numHwLayers - 1)) { 538734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("%s", str.str().c_str()); 539734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller str.str(" "); 540734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 541734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 542734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("%s", str.str().c_str()); 543734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 544734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 545734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Returns a uint32_t that contains a format specific representation of a 546734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// single pixel of the given color and alpha values. 547734d8d898c6b0b315e431b231cc6759514da361bLouis Huemilleruint32_t hwcTestColor2Pixel(uint32_t format, ColorFract color, float alpha) 548734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 549734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const struct attrib { 550734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t format; 551734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller bool hostByteOrder; 552734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t bytes; 553734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t c1Offset; 554734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t c1Size; 555734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t c2Offset; 556734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t c2Size; 557734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t c3Offset; 558734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t c3Size; 559734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t aOffset; 560734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t aSize; 561734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } attributes[] = { 562734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGBA_8888, false, 4, 0, 8, 8, 8, 16, 8, 24, 8}, 563734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGBX_8888, false, 4, 0, 8, 8, 8, 16, 8, 0, 0}, 564734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGB_888, false, 3, 0, 8, 8, 8, 16, 8, 0, 0}, 565734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGB_565, true, 2, 0, 5, 5, 6, 11, 5, 0, 0}, 566734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_BGRA_8888, false, 4, 16, 8, 8, 8, 0, 8, 24, 8}, 567734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_YV12, true, 3, 16, 8, 8, 8, 0, 8, 0, 0}, 568734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller }; 569734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 570734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const struct attrib *attrib; 571734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (attrib = attributes; attrib < attributes + NUMA(attributes); 572734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller attrib++) { 573734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (attrib->format == format) { break; } 574734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 575734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (attrib >= attributes + NUMA(attributes)) { 576734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("colorFract2Pixel unsupported format of: %u", format); 577734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(80); 578734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 579734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 580734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t pixel; 581734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel = htonl((uint32_t) round((((1 << attrib->c1Size) - 1) * color.c1())) 582734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller << ((sizeof(pixel) * BITSPERBYTE) 583734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller - (attrib->c1Offset + attrib->c1Size))); 584734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel |= htonl((uint32_t) round((((1 << attrib->c2Size) - 1) * color.c2())) 585734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller << ((sizeof(pixel) * BITSPERBYTE) 586734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller - (attrib->c2Offset + attrib->c2Size))); 587734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel |= htonl((uint32_t) round((((1 << attrib->c3Size) - 1) * color.c3())) 588734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller << ((sizeof(pixel) * BITSPERBYTE) 589734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller - (attrib->c3Offset + attrib->c3Size))); 590734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (attrib->aSize) { 591734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel |= htonl((uint32_t) round((((1 << attrib->aSize) - 1) * alpha)) 592734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller << ((sizeof(pixel) * BITSPERBYTE) 593734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller - (attrib->aOffset + attrib->aSize))); 594734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 595734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (attrib->hostByteOrder) { 596734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel = ntohl(pixel); 597734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel >>= sizeof(pixel) * BITSPERBYTE - attrib->bytes * BITSPERBYTE; 598734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 599734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 600734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return pixel; 601734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 602734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 603734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Sets the pixel at the given x and y coordinates to the color and alpha 604734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// value given by pixel. The contents of pixel is format specific. It's 605734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// value should come from a call to hwcTestColor2Pixel(). 606734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid hwcTestSetPixel(GraphicBuffer *gBuf, unsigned char *buf, 607734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t x, uint32_t y, uint32_t pixel) 608734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 609734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 610734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const struct attrib { 611734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int format; 612734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller size_t bytes; 613734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } attributes[] = { 614734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGBA_8888, 4}, 615734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGBX_8888, 4}, 616734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGB_888, 3}, 617734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGB_565, 2}, 618734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_BGRA_8888, 4}, 619734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller }; 620734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 621734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (gBuf->getPixelFormat() == HAL_PIXEL_FORMAT_YV12) { 622734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t yPlaneOffset, uPlaneOffset, vPlaneOffset; 623734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t yPlaneStride = gBuf->getStride(); 624734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t uPlaneStride = ((gBuf->getStride() / 2) + 0xf) & ~0xf; 625734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t vPlaneStride = uPlaneStride; 626734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller yPlaneOffset = 0; 627734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller vPlaneOffset = yPlaneOffset + yPlaneStride * gBuf->getHeight(); 628734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uPlaneOffset = vPlaneOffset 629734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + vPlaneStride * (gBuf->getHeight() / 2); 630734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *(buf + yPlaneOffset + y * yPlaneStride + x) = pixel & 0xff; 631734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *(buf + uPlaneOffset + (y / 2) * uPlaneStride + (x / 2)) 632734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller = (pixel & 0xff00) >> 8; 633734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller *(buf + vPlaneOffset + (y / 2) * vPlaneStride + (x / 2)) 634734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller = (pixel & 0xff0000) >> 16; 635734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 636734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return; 637734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 638734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 639734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const struct attrib *attrib; 640734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (attrib = attributes; attrib < attributes + NUMA(attributes); 641734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller attrib++) { 642734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (attrib->format == gBuf->getPixelFormat()) { break; } 643734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 644734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (attrib >= attributes + NUMA(attributes)) { 645734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("setPixel unsupported format of: %u", 646734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller gBuf->getPixelFormat()); 647734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(90); 648734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 649734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 650734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller memmove(buf + ((gBuf->getStride() * attrib->bytes) * y) 651734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + (attrib->bytes * x), &pixel, attrib->bytes); 652734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 653734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 654734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Fill a given graphic buffer with a uniform color and alpha 655734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid hwcTestFillColor(GraphicBuffer *gBuf, ColorFract color, float alpha) 656734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 657734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned char* buf = NULL; 658734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller status_t err; 659734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t pixel; 660734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 661734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel = hwcTestColor2Pixel(gBuf->getPixelFormat(), color, alpha); 662734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 663734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller err = gBuf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&buf)); 664734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (err != 0) { 665734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hwcTestFillColor lock failed: %d", err); 666734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(100); 667734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 668734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 669734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int x = 0; x < gBuf->getStride(); x++) { 670734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int y = 0; y < gBuf->getHeight(); y++) { 671734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t val = pixel; 672734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestSetPixel(gBuf, buf, x, y, (x < gBuf->getWidth()) 673734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ? pixel : testRand()); 674734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 675734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 676734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 677734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller err = gBuf->unlock(); 678734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (err != 0) { 679734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hwcTestFillColor unlock failed: %d", err); 680734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(101); 681734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 682734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 683734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 684734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// Fill the given buffer with a horizontal blend of colors, with the left 685734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// side color given by startColor and the right side color given by 686734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// endColor. The startColor and endColor values are specified in the format 687734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// given by colorFormat, which might be different from the format of the 688734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// graphic buffer. When different, a color conversion is done when possible 689734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// to the graphic format of the graphic buffer. A color of black is 690734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// produced for cases where the conversion is impossible (e.g. out of gamut 691734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// values). 692734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid hwcTestFillColorHBlend(GraphicBuffer *gBuf, uint32_t colorFormat, 693734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ColorFract startColor, ColorFract endColor) 694734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 695734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller status_t err; 696734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller unsigned char* buf = NULL; 697734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const uint32_t width = gBuf->getWidth(); 698734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const uint32_t height = gBuf->getHeight(); 699734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const uint32_t stride = gBuf->getStride(); 700734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 701734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller err = gBuf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&buf)); 702734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (err != 0) { 703734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hwcTestFillColorHBlend lock failed: %d", err); 704734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(110); 705734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 706734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 707734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (unsigned int x = 0; x < stride; x++) { 708734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t pixel; 709734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (x < width) { 710734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ColorFract color(startColor.c1() + (endColor.c1() - startColor.c1()) 711734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * ((float) x / (float) (width - 1)), 712734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller startColor.c2() + (endColor.c2() - startColor.c2()) 713734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * ((float) x / (float) (width - 1)), 714734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller startColor.c3() + (endColor.c3() - startColor.c3()) 715734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * ((float) x / (float) (width - 1))); 716734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 717734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // When formats differ, convert colors. 718734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Important to not convert when formats are the same, since 719734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // out of gamut colors are always converted to black. 720734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (colorFormat != (uint32_t) gBuf->getPixelFormat()) { 721734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestColorConvert(colorFormat, gBuf->getPixelFormat(), color); 722734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 723734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel = hwcTestColor2Pixel(gBuf->getPixelFormat(), color, 1.0); 724734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } else { 725734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Fill pad with random values 726734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller pixel = testRand(); 727734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 728734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 7299a8244b8f8d7f1acf9e475123959301666e03406Louis Huemiller for (unsigned int y = 0; y < height; y++) { 730734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestSetPixel(gBuf, buf, x, y, pixel); 731734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 732734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 733734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 734734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller err = gBuf->unlock(); 735734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (err != 0) { 736734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hwcTestFillColorHBlend unlock failed: %d", err); 737734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(111); 738734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 739734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 740734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 741734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller/* 742734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * When possible, converts color specified as a full range value in 743734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * the fromFormat, into an equivalent full range color in the toFormat. 744734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * When conversion is impossible (e.g. out of gamut color) a color 745734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * or black in the full range output format is produced. The input 746734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * color is given as a fractional color in the parameter named color. 747734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * The produced color is written over the same parameter used to 748734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * provide the input color. 749734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 750734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * Each graphic format has 3 color components and each of these 751734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * components has both a full and in gamut range. This function uses 752734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * a table that provides the full and in gamut ranges of each of the 753734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * supported graphic formats. The full range is given by members named 754734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * c[123]Min to c[123]Max, while the in gamut range is given by members 755734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * named c[123]Low to c[123]High. In most cases the full and in gamut 756734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * ranges are equivalent. This occurs when the c[123]Min == c[123]Low and 757734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * c[123]High == c[123]Max. 758734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 759734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * The input and produced colors are both specified as a fractional amount 760734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * of the full range. The diagram below provides an overview of the 761734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * conversion process. The main steps are: 762734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 763734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 1. Produce black if the input color is out of gamut. 764734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 765734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 2. Convert the in gamut color into the fraction of the fromFromat 766734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * in gamut range. 767734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 768734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 3. Convert from the fraction of the in gamut from format range to 769734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * the fraction of the in gamut to format range. Produce black 770734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * if an equivalent color does not exists. 771734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 772734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 4. Covert from the fraction of the in gamut to format to the 773734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * fraction of the full range to format. 774734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * 775734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * From Format To Format 776734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * max high high max 777734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * ----+ +-----------+ 778734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * high \ / \ high 779734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * ------\-------------+ +--------> 780734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * \ 781734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * \ +--- black --+ 782734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * \ / \ 783734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * \ / +--> 784734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * low \ / low 785734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * -------- ---+-- black --+ 786734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * min low low min 787734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * ^ ^ ^ ^ ^ 788734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * | | | | | 789734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * | | | | +-- fraction of full range 790734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * | | | +-- fraction of valid range 791734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * | | +-- fromFormat to toFormat color conversion 792734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * | +-- fraction of valid range 793734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller * +-- fraction of full range 794734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller */ 795734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillervoid hwcTestColorConvert(uint32_t fromFormat, uint32_t toFormat, 796734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller ColorFract& color) 797734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 798734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const struct attrib { 799734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller uint32_t format; 800734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller bool rgb; 801734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller bool yuv; 802734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int c1Min, c1Low, c1High, c1Max; 803734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int c2Min, c2Low, c2High, c2Max; 804734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller int c3Min, c3Low, c3High, c3Max; 805734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } attributes[] = { 806734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGBA_8888, true, false, 807734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255}, 808734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGBX_8888, true, false, 809734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255}, 810734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGB_888, true, false, 811734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255}, 812734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_RGB_565, true, false, 813734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 0, 0, 31, 31, 0, 0, 63, 63, 0, 0, 31, 31}, 814734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_BGRA_8888, true, false, 815734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255}, 816734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller {HAL_PIXEL_FORMAT_YV12, false, true, 817734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 0, 16, 235, 255, 0, 16, 240, 255, 0, 16, 240, 255}, 818734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller }; 819734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 820734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const struct attrib *fromAttrib; 821734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (fromAttrib = attributes; fromAttrib < attributes + NUMA(attributes); 822734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller fromAttrib++) { 823734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (fromAttrib->format == fromFormat) { break; } 824734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 825734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (fromAttrib >= attributes + NUMA(attributes)) { 826734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hwcTestColorConvert unsupported from format of: %u", 827734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller fromFormat); 828734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(120); 829734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 830734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 831734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const struct attrib *toAttrib; 832734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (toAttrib = attributes; toAttrib < attributes + NUMA(attributes); 833734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller toAttrib++) { 834734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (toAttrib->format == toFormat) { break; } 835734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 836734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (toAttrib >= attributes + NUMA(attributes)) { 837734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("hwcTestColorConvert unsupported to format of: %u", 838734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller toFormat); 839734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller exit(121); 840734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 841734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 842734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Produce black if any of the from components are outside the 843734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // valid color range 844734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float c1Val = fromAttrib->c1Min 845734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + ((float) (fromAttrib->c1Max - fromAttrib->c1Min) * color.c1()); 846734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float c2Val = fromAttrib->c2Min 847734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + ((float) (fromAttrib->c2Max - fromAttrib->c2Min) * color.c2()); 848734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float c3Val = fromAttrib->c3Min 849734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + ((float) (fromAttrib->c3Max - fromAttrib->c3Min) * color.c3()); 850734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((c1Val < fromAttrib->c1Low) || (c1Val > fromAttrib->c1High) 851734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (c2Val < fromAttrib->c2Low) || (c2Val > fromAttrib->c2High) 852734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (c3Val < fromAttrib->c3Low) || (c3Val > fromAttrib->c3High)) { 853734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 854734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Return black 855734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Will use representation of black from RGBA8888 graphic format 856734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // and recursively convert it to the requested graphic format. 857734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller color = ColorFract(0.0, 0.0, 0.0); 858734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller hwcTestColorConvert(HAL_PIXEL_FORMAT_RGBA_8888, toFormat, color); 859734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller return; 860734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 861734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 862734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Within from format, convert from fraction of full range 863734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // to fraction of valid range 864734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller color = ColorFract((c1Val - fromAttrib->c1Low) 865734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller / (fromAttrib->c1High - fromAttrib->c1Low), 866734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (c2Val - fromAttrib->c2Low) 867734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller / (fromAttrib->c2High - fromAttrib->c2Low), 868734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (c3Val - fromAttrib->c3Low) 869734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller / (fromAttrib->c3High - fromAttrib->c3Low)); 870734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 871734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // If needed perform RGB to YUV conversion 872734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float wr = 0.2126, wg = 0.7152, wb = 0.0722; // ITU709 recommended constants 873734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (fromAttrib->rgb && toAttrib->yuv) { 874734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float r = color.c1(), g = color.c2(), b = color.c3(); 875734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float y = wr * r + wg * g + wb * b; 876734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float u = 0.5 * ((b - y) / (1.0 - wb)) + 0.5; 877734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float v = 0.5 * ((r - y) / (1.0 - wr)) + 0.5; 878734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 879734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Produce black if color is outside the YUV gamut 880734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((y < 0.0) || (y > 1.0) 881734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (u < 0.0) || (u > 1.0) 882734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (v < 0.0) || (v > 1.0)) { 883734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller y = 0.0; 884734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller u = v = 0.5; 885734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 886734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 887734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller color = ColorFract(y, u, v); 888734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 889734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 890734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // If needed perform YUV to RGB conversion 891734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Equations determined from the ITU709 equations for RGB to YUV 892734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // conversion, plus the following algebra: 893734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // 894734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // u = 0.5 * ((b - y) / (1.0 - wb)) + 0.5 895734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // 0.5 * ((b - y) / (1.0 - wb)) = u - 0.5 896734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // (b - y) / (1.0 - wb) = 2 * (u - 0.5) 897734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // b - y = 2 * (u - 0.5) * (1.0 - wb) 898734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // b = 2 * (u - 0.5) * (1.0 - wb) + y 899734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // 900734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // v = 0.5 * ((r -y) / (1.0 - wr)) + 0.5 901734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // 0.5 * ((r - y) / (1.0 - wr)) = v - 0.5 902734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // (r - y) / (1.0 - wr) = 2 * (v - 0.5) 903734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // r - y = 2 * (v - 0.5) * (1.0 - wr) 904734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // r = 2 * (v - 0.5) * (1.0 - wr) + y 905734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // 906734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // y = wr * r + wg * g + wb * b 907734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // wr * r + wg * g + wb * b = y 908734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // wg * g = y - wr * r - wb * b 909734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // g = (y - wr * r - wb * b) / wg 910734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (fromAttrib->yuv && toAttrib->rgb) { 911734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float y = color.c1(), u = color.c2(), v = color.c3(); 912734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float r = 2.0 * (v - 0.5) * (1.0 - wr) + y; 913734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float b = 2.0 * (u - 0.5) * (1.0 - wb) + y; 914734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller float g = (y - wr * r - wb * b) / wg; 915734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 916734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Produce black if color is outside the RGB gamut 917734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if ((r < 0.0) || (r > 1.0) 918734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (g < 0.0) || (g > 1.0) 919734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller || (b < 0.0) || (b > 1.0)) { 920734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller r = g = b = 0.0; 921734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 922734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 923734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller color = ColorFract(r, g, b); 924734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 925734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 926734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // Within to format, convert from fraction of valid range 927734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller // to fraction of full range 928734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller c1Val = (toAttrib->c1Low 929734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + (float) (toAttrib->c1High - toAttrib->c1Low) * color.c1()); 930734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller c2Val = (toAttrib->c1Low 931734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + (float) (toAttrib->c2High - toAttrib->c2Low) * color.c2()); 932734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller c3Val = (toAttrib->c1Low 933734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller + (float) (toAttrib->c3High - toAttrib->c3Low) * color.c3()); 934734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller color = ColorFract((float) (c1Val - toAttrib->c1Min) 935734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller / (float) (toAttrib->c1Max - toAttrib->c1Min), 936734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (float) (c2Val - toAttrib->c2Min) 937734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller / (float) (toAttrib->c2Max - toAttrib->c2Min), 938734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller (float) (c3Val - toAttrib->c3Min) 939734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller / (float) (toAttrib->c3Max - toAttrib->c3Min)); 940734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 941734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 942734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// TODO: Use PrintGLString, CechckGlError, and PrintEGLConfiguration 943734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller// from libglTest 944734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic void printGLString(const char *name, GLenum s) 945734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 946734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller const char *v = (const char *) glGetString(s); 947734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 948734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (v == NULL) { 949734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("GL %s unknown", name); 950734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } else { 951734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI("GL %s = %s", name, v); 952734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 953734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 954734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 955734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic void checkEglError(const char* op, EGLBoolean returnVal) 956734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 957734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (returnVal != EGL_TRUE) { 958734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("%s() returned %d", op, returnVal); 959734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 960734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 961734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (EGLint error = eglGetError(); error != EGL_SUCCESS; error 962734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller = eglGetError()) { 963734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("after %s() eglError %s (0x%x)", 964734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller op, EGLUtils::strerror(error), error); 965734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 966734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 967734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 968734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic void checkGlError(const char* op) 969734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 970734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (GLint error = glGetError(); error; error 971734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller = glGetError()) { 972734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintE("after %s() glError (0x%x)", op, error); 973734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 974734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 975734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 976734d8d898c6b0b315e431b231cc6759514da361bLouis Huemillerstatic void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) 977734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller{ 978734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 979734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#define X(VAL) {VAL, #VAL} 980734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller struct {EGLint attribute; const char* name;} names[] = { 981734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_BUFFER_SIZE), 982734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_ALPHA_SIZE), 983734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_BLUE_SIZE), 984734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_GREEN_SIZE), 985734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_RED_SIZE), 986734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_DEPTH_SIZE), 987734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_STENCIL_SIZE), 988734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_CONFIG_CAVEAT), 989734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_CONFIG_ID), 990734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_LEVEL), 991734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_MAX_PBUFFER_HEIGHT), 992734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_MAX_PBUFFER_PIXELS), 993734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_MAX_PBUFFER_WIDTH), 994734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_NATIVE_RENDERABLE), 995734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_NATIVE_VISUAL_ID), 996734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_NATIVE_VISUAL_TYPE), 997734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_SAMPLES), 998734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_SAMPLE_BUFFERS), 999734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_SURFACE_TYPE), 1000734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_TRANSPARENT_TYPE), 1001734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_TRANSPARENT_RED_VALUE), 1002734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_TRANSPARENT_GREEN_VALUE), 1003734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_TRANSPARENT_BLUE_VALUE), 1004734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_BIND_TO_TEXTURE_RGB), 1005734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_BIND_TO_TEXTURE_RGBA), 1006734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_MIN_SWAP_INTERVAL), 1007734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_MAX_SWAP_INTERVAL), 1008734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_LUMINANCE_SIZE), 1009734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_ALPHA_MASK_SIZE), 1010734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_COLOR_BUFFER_TYPE), 1011734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_RENDERABLE_TYPE), 1012734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller X(EGL_CONFORMANT), 1013734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller }; 1014734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller#undef X 1015734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller 1016734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) { 1017734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLint value = -1; 1018734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLint returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, 1019734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller &value); 1020734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller EGLint error = eglGetError(); 1021734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller if (returnVal && error == EGL_SUCCESS) { 1022734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(" %s: %d (%#x)", names[j].name, value, value); 1023734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 1024734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller } 1025734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller testPrintI(""); 1026734d8d898c6b0b315e431b231cc6759514da361bLouis Huemiller} 1027