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