DisplayDevice.cpp revision 5e78e0965169790111f01354e78b0f8d34c94840
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h> 280926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian#include <ui/FramebufferNativeWindow.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <pixelflinger/pixelflinger.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/copybit.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/overlay.h> 40076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char *egl_strerror(EGLint err) 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (err){ 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SUCCESS: return "EGL_SUCCESS"; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: return "UNKNOWN"; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors() 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum error = glGetError(); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (error != GL_NO_ERROR) 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("GL error 0x%04x", int(error)); 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token) 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint error = eglGetError(); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLESonGL seems to be returning 0 when there is no errors? 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (error && error != EGL_SUCCESS) 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("%s error 0x%04x (%s)", 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project token, int(error), egl_strerror(error)); 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::DisplayHardware( 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t dpy) 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : DisplayHardwareBase(flinger, dpy) 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project init(dpy); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::~DisplayHardware() 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fini(); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDpiX() const { return mDpiX; } 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDpiY() const { return mDpiY; } 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDensity() const { return mDensity; } 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getRefreshRate() const { return mRefreshRate; } 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint DisplayHardware::getWidth() const { return mWidth; } 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint DisplayHardware::getHeight() const { return mHeight; } 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectPixelFormat DisplayHardware::getFormat() const { return mFormat; } 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::init(uint32_t dpy) 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 114076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian hw_module_t const* module; 115076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mNativeWindow = new FramebufferNativeWindow(); 117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mOverlayEngine = NULL; 119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { 120076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian overlay_control_open(module, &mOverlayEngine); 121076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 122076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 123076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t const * fbDev = mNativeWindow->getDevice(); 124076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 125076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian PixelFormatInfo fbFormatInfo; 126076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian getPixelFormatInfo(PixelFormat(fbDev->format), &fbFormatInfo); 127076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize EGL 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint attribs[] = { 130076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGL_BUFFER_SIZE, fbFormatInfo.bitsPerPixel, 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_DEPTH_SIZE, 0, 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_NONE 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint w, h, dummy; 135076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLint numConfigs=0, n=0; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext context; 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags = 0; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: all the extensions below should be queried through 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetProcAddress(). 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglInitialize(display, NULL, NULL); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglGetConfigs(display, NULL, 0, &numConfigs); 146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // Get all the "potential match" configs... 148076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLConfig* const configs = new EGLConfig[numConfigs]; 149076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian eglChooseConfig(display, attribs, configs, numConfigs, &n); 150076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian LOGE_IF(n<=0, "no EGLConfig available!"); 151076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLConfig config = configs[0]; 152076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (n > 1) { 153076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // if there is more than one candidate, go through the list 154076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // and pick one that matches our framebuffer format 155076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int fbSzA = fbFormatInfo.getSize(PixelFormatInfo::INDEX_ALPHA); 156076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int fbSzR = fbFormatInfo.getSize(PixelFormatInfo::INDEX_RED); 157076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int fbSzG = fbFormatInfo.getSize(PixelFormatInfo::INDEX_GREEN); 158076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int fbSzB = fbFormatInfo.getSize(PixelFormatInfo::INDEX_BLUE); 159076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian for (int i=0 ; i<n ; i++) { 160076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLint r,g,b,a; 161076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian eglGetConfigAttrib(display, configs[i], EGL_RED_SIZE, &r); 162076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian eglGetConfigAttrib(display, configs[i], EGL_GREEN_SIZE, &g); 163076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian eglGetConfigAttrib(display, configs[i], EGL_BLUE_SIZE, &b); 164076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian eglGetConfigAttrib(display, configs[i], EGL_ALPHA_SIZE, &a); 165076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (fbSzA == a && fbSzR == r && fbSzG == g && fbSzB == b) { 166076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config = configs[i]; 167e92c713cb685f78d2041b7ffc89ccb155c992b2dMathias Agopian break; 168076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 169076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 170076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 171076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian delete [] configs; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Gather EGL extensions 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char* const egl_extensions = eglQueryString( 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project display, EGL_EXTENSIONS); 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("EGL informations:"); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("# of configs : %d", numConfigs); 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("vendor : %s", eglQueryString(display, EGL_VENDOR)); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("version : %s", eglQueryString(display, EGL_VERSION)); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("extensions: %s", egl_extensions); 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported"); 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1881e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian if (mNativeWindow->isUpdateOnDemand()) { 1891e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian mFlags |= UPDATE_ON_DEMAND; 1901e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian } 1911e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglGetConfigAttrib(display, config, EGL_CONFIG_CAVEAT, &dummy) == EGL_TRUE) { 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dummy == EGL_SLOW_CONFIG) 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= SLOW_CONFIG; 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Create our main surface 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); 2025e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian checkEGLErrors("eglCreateWindowSurface"); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &dummy) == EGL_TRUE) { 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dummy == EGL_BUFFER_PRESERVED) { 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= BUFFER_PRESERVED; 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 209df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2105e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 211e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian if (strstr(egl_extensions, "EGL_ANDROID_swap_rectangle")) { 212df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian mFlags |= SWAP_RECTANGLE; 213df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 2145e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 215df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mDpiX = mNativeWindow->xdpi; 217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mDpiX = mNativeWindow->ydpi; 2181e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian mRefreshRate = fbDev->fps; 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project char property[PROPERTY_VALUE_MAX]; 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (property_get("ro.sf.lcd_density", property, NULL) <= 0) { 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGW("ro.sf.lcd_density not defined, using 160 dpi by default."); 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project strcpy(property, "160"); 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDensity = atoi(property) * (1.0f/160.0f); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Create our OpenGL ES context 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project context = eglCreateContext(display, config, NULL, NULL); 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //checkEGLErrors("eglCreateContext"); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglQuerySurface(display, surface, EGL_WIDTH, &mWidth); 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglQuerySurface(display, surface, EGL_HEIGHT, &mHeight); 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Gather OpenGL ES extensions 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent(display, surface, surface, context); 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char* const gl_extensions = (const char*)glGetString(GL_EXTENSIONS); 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("OpenGL informations:"); 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("vendor : %s", glGetString(GL_VENDOR)); 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("renderer : %s", glGetString(GL_RENDERER)); 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("version : %s", glGetString(GL_VERSION)); 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("extensions: %s", gl_extensions); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (strstr(gl_extensions, "GL_ARB_texture_non_power_of_two")) { 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= NPOT_EXTENSION; 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (strstr(gl_extensions, "GL_OES_draw_texture")) { 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= DRAW_TEXTURE_EXTENSION; 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 257076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (strstr( gl_extensions, "GL_OES_EGL_image") && 258e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian (strstr(egl_extensions, "EGL_KHR_image_base") || 259076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian strstr(egl_extensions, "EGL_KHR_image")) && 260076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian strstr(egl_extensions, "EGL_ANDROID_image_native_buffer")) { 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= DIRECT_TEXTURE; 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Unbind the context from this thread 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDisplay = display; 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mConfig = config; 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mSurface = surface; 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mContext = context; 271076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mFormat = fbDev->format; 272076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount = 0; 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Clean up. Throw out our local state. 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * (It's entirely possible we'll never get here, since this is meant 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * for real hardware, which doesn't restart.) 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::fini() 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglTerminate(mDisplay); 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project overlay_control_close(mOverlayEngine); 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::releaseScreen() const 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayHardwareBase::releaseScreen(); 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::acquireScreen() const 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayHardwareBase::acquireScreen(); 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getPageFlipCount() const { 300076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return mPageFlipCount; 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * "Flip" the front and back buffers. 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::flip(const Region& dirty) const 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkGLErrors(); 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = mDisplay; 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface = mSurface; 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3145e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle 315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (mFlags & SWAP_RECTANGLE) { 316b2dd686d06a608ee40285b93bc0217cf26c2b035Mathias Agopian Region newDirty(dirty); 317b2dd686d06a608ee40285b93bc0217cf26c2b035Mathias Agopian newDirty.andSelf(Rect(mWidth, mHeight)); 318b2dd686d06a608ee40285b93bc0217cf26c2b035Mathias Agopian const Rect& b(newDirty.bounds()); 319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian eglSetSwapRectangleANDROID(dpy, surface, 320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian b.left, b.top, b.width(), b.height()); 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 3225e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif 3235e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian 3241e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian if (mFlags & UPDATE_ON_DEMAND) { 3251e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian mNativeWindow->setUpdateRectangle(dirty.bounds()); 3261e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian } 3271e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 328076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mPageFlipCount++; 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglSwapBuffers(dpy, surface); 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project checkEGLErrors("eglSwapBuffers"); 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for debugging 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //glClearColor(1,0,0,0); 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //glClear(GL_COLOR_BUFFER_BIT); 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getFlags() const 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlags; 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::makeCurrent() const 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent(mDisplay, mSurface, mSurface, mContext); 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::copyFrontToImage(const copybit_image_t& front) const { 348076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // FIXME: we need to get rid of this 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::copyBackToImage(const copybit_image_t& front) const { 352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // FIXME: we need to get rid of this 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 354