DisplayDevice.cpp revision 1f7bec634f19c123410a5155c8d282e177c01930
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>
296cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian#include <ui/EGLUtils.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <pixelflinger/pixelflinger.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardware.h"
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/copybit.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/overlay.h>
41076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h"
441f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors()
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
51cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    do {
52cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // there could be more than one error flag
53cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        GLenum error = glGetError();
54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        if (error == GL_NO_ERROR)
55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian            break;
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        LOGE("GL error 0x%04x", int(error));
57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    } while(true);
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkEGLErrors(const char* token)
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint error = eglGetError();
64cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    if (error && error != EGL_SUCCESS) {
65cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        LOGE("%s: EGL error 0x%04x (%s)",
660928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian                token, int(error), EGLUtils::strerror(error));
67cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    }
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::DisplayHardware(
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t dpy)
781f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    : DisplayHardwareBase(flinger, dpy),
791f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian      mFlags(0)
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    init(dpy);
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDisplayHardware::~DisplayHardware()
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    fini();
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDpiX() const          { return mDpiX; }
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDpiY() const          { return mDpiY; }
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getDensity() const       { return mDensity; }
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat DisplayHardware::getRefreshRate() const   { return mRefreshRate; }
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint DisplayHardware::getWidth() const           { return mWidth; }
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint DisplayHardware::getHeight() const          { return mHeight; }
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectPixelFormat DisplayHardware::getFormat() const  { return mFormat; }
96ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopianuint32_t DisplayHardware::getMaxTextureSize() const { return mMaxTextureSize; }
97ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopianuint32_t DisplayHardware::getMaxViewportDims() const { return mMaxViewportDims; }
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::init(uint32_t dpy)
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mNativeWindow = new FramebufferNativeWindow();
1020928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian    framebuffer_device_t const * fbDev = mNativeWindow->getDevice();
1031f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDpiX = mNativeWindow->xdpi;
1041f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDpiY = mNativeWindow->ydpi;
1051f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mRefreshRate = fbDev->fps;
106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mOverlayEngine = NULL;
1080928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian    hw_module_t const* module;
109076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {
110076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        overlay_control_open(module, &mOverlayEngine);
111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1131f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLint w, h, dummy;
1141f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLint numConfigs=0;
1151f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
1161f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLContext context;
1171f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // initialize EGL
119a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian    EGLint attribs[] = {
1200928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian            EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,
121a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian            EGL_NONE,           0,
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGL_NONE
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
124a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian
125a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian    // debug: disable h/w rendering
126a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian    char property[PROPERTY_VALUE_MAX];
127a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian    if (property_get("debug.sf.hw", property, NULL) > 0) {
128a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian        if (atoi(property) == 0) {
129a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian            LOGW("H/W composition disabled");
130a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian            attribs[2] = EGL_CONFIG_CAVEAT;
131a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian            attribs[3] = EGL_SLOW_CONFIG;
132a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian        }
133a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian    }
134a5b02e0b4dfc9947e373e17a383b397f6fcb751cMathias Agopian
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: all the extensions below should be queried through
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetProcAddress().
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eglInitialize(display, NULL, NULL);
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eglGetConfigs(display, NULL, 0, &numConfigs);
141076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1426cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    EGLConfig config;
1430928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian    status_t err = EGLUtils::selectConfigForNativeWindow(
1440928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian            display, attribs, mNativeWindow.get(), &config);
1456cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    LOGE_IF(err, "couldn't find an EGLConfig matching the screen format");
1466cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
1470928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian    EGLint r,g,b,a;
1480928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian    eglGetConfigAttrib(display, config, EGL_RED_SIZE,   &r);
1490928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian    eglGetConfigAttrib(display, config, EGL_GREEN_SIZE, &g);
1500928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian    eglGetConfigAttrib(display, config, EGL_BLUE_SIZE,  &b);
1510928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian    eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &a);
1520928e31cc7a9ec7367a68796fcaa9c52959216a5Mathias Agopian
1531e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    if (mNativeWindow->isUpdateOnDemand()) {
15495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        mFlags |= PARTIAL_UPDATES;
1551e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    }
1561e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglGetConfigAttrib(display, config, EGL_CONFIG_CAVEAT, &dummy) == EGL_TRUE) {
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (dummy == EGL_SLOW_CONFIG)
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mFlags |= SLOW_CONFIG;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * Create our main surface
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
166076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL);
1671f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mWidth);
1681f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mHeight);
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    if (mFlags & PARTIAL_UPDATES) {
17195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        // if we have partial updates, we definitely don't need to
17295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        // preserve the backbuffer, which may be costly.
1730928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian        eglSurfaceAttrib(display, surface,
1740928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian                EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED);
1750928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian    }
1760928bee979c8fa157e13e37e52ba9ad94e935237Mathias Agopian
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &dummy) == EGL_TRUE) {
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (dummy == EGL_BUFFER_PRESERVED) {
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mFlags |= BUFFER_PRESERVED;
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
183ae71accf63add81ec3d3cd0269536c24db112cabDavid 'Digit' Turner    /* Read density from build-specific ro.sf.lcd_density property
18424e5f5290195e1c02c18730d0639efda65d64914Mathias Agopian     * except if it is overridden by qemu.sf.lcd_density.
185ae71accf63add81ec3d3cd0269536c24db112cabDavid 'Digit' Turner     */
186ae71accf63add81ec3d3cd0269536c24db112cabDavid 'Digit' Turner    if (property_get("qemu.sf.lcd_density", property, NULL) <= 0) {
187ae71accf63add81ec3d3cd0269536c24db112cabDavid 'Digit' Turner        if (property_get("ro.sf.lcd_density", property, NULL) <= 0) {
188ae71accf63add81ec3d3cd0269536c24db112cabDavid 'Digit' Turner            LOGW("ro.sf.lcd_density not defined, using 160 dpi by default.");
189ae71accf63add81ec3d3cd0269536c24db112cabDavid 'Digit' Turner            strcpy(property, "160");
190694e10ba8778dbb3cda9abe106f73ec0f45c8800David 'Digit' Turner        }
19131469e1069a873993ff43dec803bf5f14fad0fb5David 'Digit' Turner    } else {
19231469e1069a873993ff43dec803bf5f14fad0fb5David 'Digit' Turner        /* for the emulator case, reset the dpi values too */
19331469e1069a873993ff43dec803bf5f14fad0fb5David 'Digit' Turner        mDpiX = mDpiY = atoi(property);
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDensity = atoi(property) * (1.0f/160.0f);
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * Create our OpenGL ES context
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    context = eglCreateContext(display, config, NULL, NULL);
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2041f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
2051f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mConfig  = config;
2061f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
2071f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mContext = context;
2081f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mFormat  = fbDev->format;
2091f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
2101f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * Gather OpenGL ES extensions
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eglMakeCurrent(display, surface, surface, context);
2161f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
2171f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    GLExtensions& extensions(GLExtensions::getInstance());
2181f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    extensions.initWithGLStrings(
2191f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            glGetString(GL_VENDOR),
2201f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            glGetString(GL_RENDERER),
2211f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            glGetString(GL_VERSION),
2221f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            glGetString(GL_EXTENSIONS),
2231f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            eglQueryString(display, EGL_VENDOR),
2241f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            eglQueryString(display, EGL_VERSION),
2251f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            eglQueryString(display, EGL_EXTENSIONS));
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
227ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
228ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian    glGetIntegerv(GL_MAX_VIEWPORT_DIMS, &mMaxViewportDims);
229ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian
230dcaf29af10a3f100f2b8f7a08e9d4b2c656dd1a4Mathias Agopian
2311f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
2321f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    if (extensions.hasExtension("EGL_ANDROID_swap_rectangle")) {
2331f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian        if (eglSetSwapRectangleANDROID(display, surface,
2341f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian                0, 0, mWidth, mHeight) == EGL_TRUE) {
2351f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            // This could fail if this extension is not supported by this
2361f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            // specific surface (of config)
2371f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian            mFlags |= SWAP_RECTANGLE;
2381f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian        }
239e049a957ce2a529564a1312dca60e86d0bcb0964Andreas Huber    }
2401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    // when we have the choice between PARTIAL_UPDATES and SWAP_RECTANGLE
2411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    // choose PARTIAL_UPDATES, which should be more efficient
2421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    if (mFlags & PARTIAL_UPDATES)
2431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian        mFlags &= ~SWAP_RECTANGLE;
24454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian#endif
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("EGL informations:");
2471f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("# of configs : %d", numConfigs);
2481f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("vendor    : %s", extensions.getEglVendor());
2491f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("version   : %s", extensions.getEglVersion());
2501f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("extensions: %s", extensions.getEglExtension());
2511f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported");
2521f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, config);
2531f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
2541f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("OpenGL informations:");
2551f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("vendor    : %s", extensions.getVendor());
2561f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("renderer  : %s", extensions.getRenderer());
2571f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("version   : %s", extensions.getVersion());
2581f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("extensions: %s", extensions.getExtension());
2591f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("GL_MAX_TEXTURE_SIZE = %d", mMaxTextureSize);
2601f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("GL_MAX_VIEWPORT_DIMS = %d", mMaxViewportDims);
2611f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    LOGI("flags = %08x", mFlags);
262ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Unbind the context from this thread
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Clean up.  Throw out our local state.
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * (It's entirely possible we'll never get here, since this is meant
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * for real hardware, which doesn't restart.)
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::fini()
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eglTerminate(mDisplay);
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    overlay_control_close(mOverlayEngine);
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::releaseScreen() const
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    DisplayHardwareBase::releaseScreen();
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::acquireScreen() const
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    DisplayHardwareBase::acquireScreen();
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getPageFlipCount() const {
292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopianstatus_t DisplayHardware::compositionComplete() const {
29674faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian    return mNativeWindow->compositionComplete();
29774faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::flip(const Region& dirty) const
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3065e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
308b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
309b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
3135e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
3145e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
31595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    if (mFlags & PARTIAL_UPDATES) {
31629d06ac9a45e564b4f935b91067fc92c2d4c193dMathias Agopian        mNativeWindow->setUpdateRectangle(dirty.getBounds());
3171e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    }
3181e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
319076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eglSwapBuffers(dpy, surface);
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkEGLErrors("eglSwapBuffers");
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for debugging
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //glClearColor(1,0,0,0);
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //glClear(GL_COLOR_BUFFER_BIT);
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t DisplayHardware::getFlags() const
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DisplayHardware::makeCurrent() const
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
337