DisplayDevice.cpp revision edbf3b6af777b721cd2a1ef461947e51e88241e1
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#define LOG_TAG "SurfaceFlinger" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/properties.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/EGLDisplaySurface.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/copybit.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/overlay.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char *egl_strerror(EGLint err) 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (err){ 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SUCCESS: return "EGL_SUCCESS"; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: return "UNKNOWN"; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors() 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum error = glGetError(); 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (error != GL_NO_ERROR) 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("GL error 0x%04x", int(error)); 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token) 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint error = eglGetError(); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLESonGL seems to be returning 0 when there is no errors? 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (error && error != EGL_SUCCESS) 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("%s error 0x%04x (%s)", 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project token, int(error), egl_strerror(error)); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values. 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::DisplayHardware( 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t dpy) 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : DisplayHardwareBase(flinger, dpy) 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project init(dpy); 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::~DisplayHardware() 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fini(); 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDpiX() const { return mDpiX; } 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDpiY() const { return mDpiY; } 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDensity() const { return mDensity; } 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getRefreshRate() const { return mRefreshRate; } 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint DisplayHardware::getWidth() const { return mWidth; } 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint DisplayHardware::getHeight() const { return mHeight; } 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectPixelFormat DisplayHardware::getFormat() const { return mFormat; } 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::init(uint32_t dpy) 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize EGL 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint attribs[] = { 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_RED_SIZE, 5, 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_GREEN_SIZE, 6, 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_BLUE_SIZE, 5, 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_DEPTH_SIZE, 0, 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGL_NONE 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint w, h, dummy; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint numConfigs, n; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface surface; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext context; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags = 0; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: all the extensions below should be queried through 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetProcAddress(). 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglInitialize(display, NULL, NULL); 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglGetConfigs(display, NULL, 0, &numConfigs); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglChooseConfig(display, attribs, &config, 1, &n); 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Gather EGL extensions 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char* const egl_extensions = eglQueryString( 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project display, EGL_EXTENSIONS); 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("EGL informations:"); 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("# of configs : %d", numConfigs); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("vendor : %s", eglQueryString(display, EGL_VENDOR)); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("version : %s", eglQueryString(display, EGL_VERSION)); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("extensions: %s", egl_extensions); 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported"); 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: get this from the devfb driver (probably should be HAL module) 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= SWAP_RECTANGLE_EXTENSION; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: get the real "update_on_demand" behavior (probably should be HAL module) 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= UPDATE_ON_DEMAND; 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglGetConfigAttrib(display, config, EGL_CONFIG_CAVEAT, &dummy) == EGL_TRUE) { 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dummy == EGL_SLOW_CONFIG) 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= SLOW_CONFIG; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Create our main surface 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDisplaySurface = new EGLDisplaySurface(); 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = eglCreateWindowSurface(display, config, mDisplaySurface.get(), NULL); 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //checkEGLErrors("eglCreateDisplaySurfaceANDROID"); 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &dummy) == EGL_TRUE) { 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dummy == EGL_BUFFER_PRESERVED) { 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= BUFFER_PRESERVED; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value = EGL_UNKNOWN; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglQuerySurface(display, surface, EGL_HORIZONTAL_RESOLUTION, &value); 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (value == EGL_UNKNOWN) { 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDpiX = 160.0f; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDpiX = 25.4f * float(value)/EGL_DISPLAY_SCALING; 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project value = EGL_UNKNOWN; 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglQuerySurface(display, surface, EGL_VERTICAL_RESOLUTION, &value); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (value == EGL_UNKNOWN) { 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDpiY = 160.0f; 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDpiY = 25.4f * float(value)/EGL_DISPLAY_SCALING; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mRefreshRate = 60.f; // TODO: get the real refresh rate 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project char property[PROPERTY_VALUE_MAX]; 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (property_get("ro.sf.lcd_density", property, NULL) <= 0) { 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGW("ro.sf.lcd_density not defined, using 160 dpi by default."); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project strcpy(property, "160"); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDensity = atoi(property) * (1.0f/160.0f); 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Create our OpenGL ES context 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project context = eglCreateContext(display, config, NULL, NULL); 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //checkEGLErrors("eglCreateContext"); 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglQuerySurface(display, surface, EGL_WIDTH, &mWidth); 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglQuerySurface(display, surface, EGL_HEIGHT, &mHeight); 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Gather OpenGL ES extensions 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent(display, surface, surface, context); 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char* const gl_extensions = (const char*)glGetString(GL_EXTENSIONS); 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("OpenGL informations:"); 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("vendor : %s", glGetString(GL_VENDOR)); 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("renderer : %s", glGetString(GL_RENDERER)); 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("version : %s", glGetString(GL_VERSION)); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGI("extensions: %s", gl_extensions); 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (strstr(gl_extensions, "GL_ARB_texture_non_power_of_two")) { 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= NPOT_EXTENSION; 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (strstr(gl_extensions, "GL_OES_draw_texture")) { 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= DRAW_TEXTURE_EXTENSION; 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (strstr(gl_extensions, "GL_ANDROID_direct_texture")) { 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags |= DIRECT_TEXTURE; 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Unbind the context from this thread 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDisplay = display; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mConfig = config; 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mSurface = surface; 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mContext = context; 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFormat = GGL_PIXEL_FORMAT_RGB_565; 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project hw_module_t const* module; 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mBlitEngine = NULL; 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &module) == 0) { 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project copybit_open(module, &mBlitEngine); 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOverlayEngine = NULL; 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project overlay_control_open(module, &mOverlayEngine); 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Clean up. Throw out our local state. 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * (It's entirely possible we'll never get here, since this is meant 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * for real hardware, which doesn't restart.) 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::fini() 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglTerminate(mDisplay); 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project copybit_close(mBlitEngine); 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project overlay_control_close(mOverlayEngine); 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::releaseScreen() const 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayHardwareBase::releaseScreen(); 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::acquireScreen() const 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayHardwareBase::acquireScreen(); 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::getDisplaySurface(copybit_image_t* img) const 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project img->w = mDisplaySurface->stride; 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project img->h = mDisplaySurface->height; 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project img->format = mDisplaySurface->format; 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project img->offset = mDisplaySurface->offset; 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project img->base = (void*)mDisplaySurface->base; 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project img->fd = mDisplaySurface->fd; 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::getDisplaySurface(GGLSurface* fb) const 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fb->version= sizeof(GGLSurface); 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fb->width = mDisplaySurface->width; 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fb->height = mDisplaySurface->height; 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fb->stride = mDisplaySurface->stride; 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fb->format = mDisplaySurface->format; 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fb->data = (GGLubyte*)mDisplaySurface->base + mDisplaySurface->offset; 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getPageFlipCount() const { 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mDisplaySurface->getPageFlipCount(); 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 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region newDirty(dirty); 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project newDirty.andSelf(Rect(mWidth, mHeight)); 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mFlags & BUFFER_PRESERVED) { 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Region copyback(mDirty.subtract(newDirty)); 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDirty = newDirty; 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDisplaySurface->copyFrontToBack(copyback); 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mFlags & SWAP_RECTANGLE_EXTENSION) { 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Rect& b(newDirty.bounds()); 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDisplaySurface->setSwapRectangle( 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project b.left, b.top, b.width(), b.height()); 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 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 { 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDisplaySurface->copyFrontToImage(front); 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::copyBackToImage(const copybit_image_t& front) const { 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDisplaySurface->copyBackToImage(front); 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 354