DisplayDevice.cpp revision cd60f99aba9e750700a967db30b74a29145739cf
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
27c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian#include <ui/DisplayInfo.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/PixelFormat.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/SurfaceTextureClient.h>
311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/FramebufferSurface.h"
391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h"
401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
410f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h"
421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h"
43c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian#include "SurfaceFlinger.h"
44921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "LayerBase.h"
451f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
46a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
48a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid checkGLErrors()
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
53cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    do {
54cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        // there could be more than one error flag
55cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        GLenum error = glGetError();
56cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        if (error == GL_NO_ERROR)
57cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian            break;
58e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("GL error 0x%04x", int(error));
59cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    } while(true);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian// ----------------------------------------------------------------------------
63a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Initialize the display to the specified values.
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
690f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::DisplayDevice(
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<SurfaceFlinger>& flinger,
71a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        int display,
721a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<ANativeWindow>& nativeWindow,
731a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        const sp<FramebufferSurface>& framebufferSurface,
74a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        EGLConfig config)
7592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    : mFlinger(flinger),
7692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mId(display),
771a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mNativeWindow(nativeWindow),
781a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis      mFramebufferSurface(framebufferSurface),
7992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplay(EGL_NO_DISPLAY),
8092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSurface(EGL_NO_SURFACE),
8192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mContext(EGL_NO_CONTEXT),
8292a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mDisplayWidth(), mDisplayHeight(), mFormat(),
8392a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mFlags(),
8492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mPageFlipCount(),
8592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mSecureLayerVisible(false),
8692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mScreenAcquired(false),
8792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mOrientation(),
8892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian      mLayerStack(0)
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
90a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    init(config);
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
930f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianDisplayDevice::~DisplayDevice() {
9492a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    if (mSurface != EGL_NO_SURFACE) {
9592a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        eglDestroySurface(mDisplay, mSurface);
9692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian        mSurface = EGL_NO_SURFACE;
9792a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    }
9892a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian}
9992a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian
10092a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopianbool DisplayDevice::isValid() const {
10192a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    return mFlinger != NULL;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1040f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getWidth() const {
105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayWidth;
1066163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian}
1076163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1080f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianint DisplayDevice::getHeight() const {
109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mDisplayHeight;
110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1120f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianPixelFormat DisplayDevice::getFormat() const {
113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFormat;
114a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
115a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1160f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianEGLSurface DisplayDevice::getEGLSurface() const {
117a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mSurface;
118a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian}
1196163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian
1200f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::init(EGLConfig config)
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
122a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    ANativeWindow* const window = mNativeWindow.get();
123a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
1246163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    int format;
1256163091a2c366f8311fc3ee627dc7deb9681236eMathias Agopian    window->query(window, NATIVE_WINDOW_FORMAT, &format);
126b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian
127a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
128a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Create our display's surface
129b5dd9c0fee3b3d6d35035dfb992951ebea3e0e4eMathias Agopian     */
130385977f6d6c4e76379df384d50695a10cb3757f2Mathias Agopian
1311f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    EGLSurface surface;
132a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLint w, h;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
134a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    surface = eglCreateWindowSurface(display, config, window, NULL);
1351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_WIDTH,  &mDisplayWidth);
1361b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    eglQuerySurface(display, surface, EGL_HEIGHT, &mDisplayHeight);
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1381f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mDisplay = display;
1391f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mSurface = surface;
140a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    mFormat  = format;
1411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    mPageFlipCount = 0;
1421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
1435f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian    // external displays are always considered enabled
1445f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian    mScreenAcquired = mId >= DisplayDevice::DISPLAY_ID_COUNT;
1455f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian
14698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    // initialize the display orientation transform.
1473165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    DisplayDevice::setOrientation(DisplayState::eOrientationDefault);
148a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
149a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
1500f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getPageFlipCount() const {
151076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return mPageFlipCount;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1540f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::compositionComplete() const {
155a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface == NULL) {
156a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        return NO_ERROR;
157a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
158a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    return mFramebufferSurface->compositionComplete();
15974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian}
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1610f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::flip(const Region& dirty) const
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    checkGLErrors();
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay dpy = mDisplay;
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface surface = mSurface;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1685e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#ifdef EGL_ANDROID_swap_rectangle
169df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (mFlags & SWAP_RECTANGLE) {
170b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Region newDirty(dirty.intersect(bounds()));
171b8a5560e1303cb10f5cd482af466fc04d2bdfcabMathias Agopian        const Rect b(newDirty.getBounds());
172df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        eglSetSwapRectangleANDROID(dpy, surface,
173df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                b.left, b.top, b.width(), b.height());
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1755e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian#endif
1765e78e0965169790111f01354e78b0f8d34c94840Mathias Agopian
177076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mPageFlipCount++;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1800f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianuint32_t DisplayDevice::getFlags() const
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlags;
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1850f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::dump(String8& res) const
1861d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling{
187a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    if (mFramebufferSurface != NULL) {
188a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian        mFramebufferSurface->dump(res);
189a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    }
1901d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling}
1911b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
1924297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid DisplayDevice::makeCurrent(const sp<const DisplayDevice>& hw, EGLContext ctx) {
19352bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
1944297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    if (sur != hw->mSurface) {
19552bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian        EGLDisplay dpy = eglGetCurrentDisplay();
1964297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian        eglMakeCurrent(dpy, hw->mSurface, hw->mSurface, ctx);
19752bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian    }
19852bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian}
19952bbb1ae239c8a4d05543a23fa8c08467d09c3b2Mathias Agopian
2001b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian// ----------------------------------------------------------------------------
2011b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2020f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianvoid DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers) {
2033b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    mVisibleLayersSortedByZ = layers;
204ef7b9c7eac036cc1230c64821039d18f8cbd2c1cMathias Agopian    mSecureLayerVisible = false;
2053b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    size_t count = layers.size();
2063b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    for (size_t i=0 ; i<count ; i++) {
2073b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        if (layers[i]->isSecure()) {
2083b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian            mSecureLayerVisible = true;
2093b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian        }
2103b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    }
2113b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2123b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2130f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias AgopianVector< sp<LayerBase> > DisplayDevice::getVisibleLayersSortedByZ() const {
2143b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mVisibleLayersSortedByZ;
2153b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2163b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
2170f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianbool DisplayDevice::getSecureLayerVisible() const {
2183b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    return mSecureLayerVisible;
2193b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian}
2203b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
221cd60f99aba9e750700a967db30b74a29145739cfMathias AgopianRegion DisplayDevice::getDirtyRegion(bool repaintEverything) const {
222cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    Region dirty;
223cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    const Transform& planeTransform(mGlobalTransform);
224cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    if (repaintEverything) {
225cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.set(getBounds());
226cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    } else {
227cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty = planeTransform.transform(this->dirtyRegion);
228cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian        dirty.andSelf(getBounds());
229cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    }
230cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian    return dirty;
231cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian}
232cd60f99aba9e750700a967db30b74a29145739cfMathias Agopian
2333b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian// ----------------------------------------------------------------------------
234d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
235d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::canDraw() const {
236d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
237d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
238d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
239d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::releaseScreen() const {
240d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = false;
241d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
242d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
243d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid DisplayDevice::acquireScreen() const {
244d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    mScreenAcquired = true;
245d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
246d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
247d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianbool DisplayDevice::isScreenAcquired() const {
248d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    return mScreenAcquired;
249d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian}
250d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian
251d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian// ----------------------------------------------------------------------------
2523b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
25328947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopianvoid DisplayDevice::setLayerStack(uint32_t stack) {
25428947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    mLayerStack = stack;
25528947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian    dirtyRegion.set(bounds());
25628947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian}
25728947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
25828947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian// ----------------------------------------------------------------------------
25928947d7fbf9f486539322e8e12dd057568e180c2Mathias Agopian
2600f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::orientationToTransfrom(
2611b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        int orientation, int w, int h, Transform* tr)
2621b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian{
2631b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    uint32_t flags = 0;
2641b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    switch (orientation) {
2653165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientationDefault:
2661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_0;
2671b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
2683165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation90:
2691b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_90;
2701b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
2713165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation180:
2721b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_180;
2731b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
2743165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    case DisplayState::eOrientation270:
2751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        flags = Transform::ROT_270;
2761b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        break;
2771b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    default:
2781b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return BAD_VALUE;
2791b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
2801b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    tr->set(flags, w, h);
2811b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
2821b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
2831b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2840f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianstatus_t DisplayDevice::setOrientation(int orientation) {
28598a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int w = mDisplayWidth;
28698a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int h = mDisplayHeight;
2871b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian
2880f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian    DisplayDevice::orientationToTransfrom(
28998a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian            orientation, w, h, &mGlobalTransform);
2903165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian    if (orientation & DisplayState::eOrientationSwapMask) {
29198a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        int tmp = w;
29298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        w = h;
29398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian        h = tmp;
2941b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    }
2951b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    mOrientation = orientation;
29692a979a92c34b7de609ce2b1662c73bb8a2728b9Mathias Agopian    dirtyRegion.set(bounds());
2971b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    return NO_ERROR;
2981b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian}
299