DisplayDevice.h revision 888c822c4cb6976aab9256c58bae9e17e3e55c5c
1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright (C) 2007 The Android Open Source Project 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Licensed under the Apache License, Version 2.0 (the "License"); 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * you may not use this file except in compliance with the License. 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * You may obtain a copy of the License at 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * http://www.apache.org/licenses/LICENSE-2.0 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Unless required by applicable law or agreed to in writing, software 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * distributed under the License is distributed on an "AS IS" BASIS, 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * See the License for the specific language governing permissions and 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * limitations under the License. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef ANDROID_DISPLAY_DEVICE_H 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define ANDROID_DISPLAY_DEVICE_H 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <stdlib.h> 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <ui/PixelFormat.h> 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <ui/Region.h> 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <EGL/egl.h> 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <EGL/eglext.h> 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <utils/Mutex.h> 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <utils/Timers.h> 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "Transform.h" 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace android { 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass DisplayInfo; 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FramebufferSurface; 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass LayerBase; 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass SurfaceFlinger; 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass SurfaceTextureClient; 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass DisplayDevice 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch{ 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic: 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // region in layer-stack space 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch mutable Region dirtyRegion; 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // region in screen space 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch mutable Region swapRegion; 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // region in screen space 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Region undefinedRegion; 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum { 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DISPLAY_ID_MAIN = 0, 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DISPLAY_ID_HDMI = 1 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum { 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PARTIAL_UPDATES = 0x00020000, // video driver feature 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SWAP_RECTANGLE = 0x00080000, 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DisplayDevice(); 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DisplayDevice( 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const sp<SurfaceFlinger>& flinger, 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int dpy, 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const sp<SurfaceTextureClient>& surface, 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EGLConfig config); 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ~DisplayDevice(); 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // must be called when this object is no longer needed. this will 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // render the associated EGLSurface invalid. 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void terminate(); 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // whether this is a valid object. An invalid DisplayDevice is returned 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // when an non existing id is requested 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool isValid() const; 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Flip the front and back buffers if the back buffer is "dirty". Might 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // be instantaneous, might involve copying the frame buffer around. 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void flip(const Region& dirty) const; 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch float getDpiX() const; 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch float getDpiY() const; 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch float getDensity() const; 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int getWidth() const; 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int getHeight() const; 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen PixelFormat getFormat() const; 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen uint32_t getFlags() const; 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EGLSurface getEGLSurface() const; 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers); 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Vector< sp<LayerBase> > getVisibleLayersSortedByZ() const; 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool getSecureLayerVisible() const; 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch status_t setOrientation(int orientation); 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int getOrientation() const { return mOrientation; } 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const Transform& getTransform() const { return mGlobalTransform; } 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick uint32_t getLayerStack() const { return mLayerStack; } 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch status_t compositionComplete() const; 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Rect getBounds() const { 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return Rect(mDisplayWidth, mDisplayHeight); 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch inline Rect bounds() const { return getBounds(); } 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static void makeCurrent(const DisplayDevice& hw, EGLContext ctx); 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch /* ------------------------------------------------------------------------ 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * blank / unplank management 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void releaseScreen() const; 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void acquireScreen() const; 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool isScreenAcquired() const; 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool canDraw() const; 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch /* ------------------------------------------------------------------------ 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Debugging 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32_t getPageFlipCount() const; 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void dump(String8& res) const; 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch inline bool operator < (const DisplayDevice& rhs) const { 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return mId < rhs.mId; 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprivate: 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void init(EGLConfig config); 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch /* 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Constants, set during initialization 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sp<SurfaceFlinger> mFlinger; 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int32_t mId; 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // ANativeWindow this display is rendering into 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sp<SurfaceTextureClient> mNativeWindow; 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // set if mNativeWindow is a FramebufferSurface 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sp<FramebufferSurface> mFramebufferSurface; 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EGLDisplay mDisplay; 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EGLSurface mSurface; 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EGLContext mContext; 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch float mDpiX; 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch float mDpiY; 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch float mDensity; 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int mDisplayWidth; 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int mDisplayHeight; 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PixelFormat mFormat; 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32_t mFlags; 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch mutable uint32_t mPageFlipCount; 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch /* 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Can only accessed from the main thread, these members 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * don't need synchronization. 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // list of visible layers on that display 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Vector< sp<LayerBase> > mVisibleLayersSortedByZ; 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Whether we have a visible secure layer on this display 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool mSecureLayerVisible; 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Whether the screen is blanked; 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch mutable int mScreenAcquired; 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch /* 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Transaction state 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static status_t orientationToTransfrom(int orientation, int w, int h, 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Transform* tr); 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Transform mGlobalTransform; 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int mOrientation; 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32_t mLayerStack; 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; // namespace android 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // ANDROID_DISPLAY_DEVICE_H 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch