DisplayDevice.h revision 03e407270c7ad76632f982c886d0776bed9e9b4c
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#ifndef ANDROID_DISPLAY_HARDWARE_H 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_DISPLAY_HARDWARE_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/gl.h> 26076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/glext.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/eglext.h> 29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 301f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian#include "GLExtensions.h" 311f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardwareBase.h" 333eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian#include "HWComposer.h" 3403e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian#include "PowerHAL.h" 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianclass FramebufferNativeWindow; 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 403eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopianclass DisplayHardware : 413eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian public DisplayHardwareBase, 423eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian public HWComposer::EventHandler 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 453eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 463eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian class VSyncHandler : virtual public RefBase { 473eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian friend class DisplayHardware; 483eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian virtual void onVSyncReceived(int dpy, nsecs_t timestamp) = 0; 493eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian protected: 503eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian virtual ~VSyncHandler() {} 513eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian }; 523eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 541f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian COPY_BITS_EXTENSION = 0x00000008, 551f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian PARTIAL_UPDATES = 0x00020000, // video driver feature 561f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian SLOW_CONFIG = 0x00040000, // software 571f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian SWAP_RECTANGLE = 0x00080000, 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayHardware( 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<SurfaceFlinger>& flinger, 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t displayIndex); 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 643eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian virtual ~DisplayHardware(); 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void releaseScreen() const; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void acquireScreen() const; 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Flip the front and back buffers if the back buffer is "dirty". Might 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // be instantaneous, might involve copying the frame buffer around. 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void flip(const Region& dirty) const; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float getDpiX() const; 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float getDpiY() const; 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float getRefreshRate() const; 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float getDensity() const; 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int getWidth() const; 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int getHeight() const; 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat getFormat() const; 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t getFlags() const; 81ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian uint32_t getMaxTextureSize() const; 82ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian uint32_t getMaxViewportDims() const; 8382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian nsecs_t getRefreshPeriod() const; 8482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian nsecs_t getRefreshTimestamp() const; 853eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian void makeCurrent() const; 863eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 873eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 883eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian void setVSyncHandler(const sp<VSyncHandler>& handler); 893eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 9003e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian enum { 9103e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian EVENT_VSYNC = HWC_EVENT_VSYNC 9203e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian }; 9303e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian 9403e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian void eventControl(int event, int enabled); 9503e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian 96d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t getPageFlipCount() const; 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay getEGLDisplay() const { return mDisplay; } 99a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1001d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling void dump(String8& res) const; 1011d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling 102a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian // Hardware Composer 103a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian HWComposer& getHwComposer() const; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian status_t compositionComplete() const; 10674faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian 1079c6e297271ec9af9d974242d89cfa08cb6ceaa0aMathias Agopian Rect getBounds() const { 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return Rect(mWidth, mHeight); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1109c6e297271ec9af9d974242d89cfa08cb6ceaa0aMathias Agopian inline Rect bounds() const { return getBounds(); } 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 1133eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian virtual void onVSyncReceived(int dpy, nsecs_t timestamp); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void init(uint32_t displayIndex) __attribute__((noinline)); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void fini() __attribute__((noinline)); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian sp<SurfaceFlinger> mFlinger; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay mDisplay; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface mSurface; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext mContext; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig mConfig; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float mDpiX; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float mDpiY; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float mRefreshRate; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float mDensity; 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mWidth; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mHeight; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat mFormat; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t mFlags; 130076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mutable uint32_t mPageFlipCount; 1313d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian GLint mMaxViewportDims[2]; 132ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian GLint mMaxTextureSize; 133d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 134d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian nsecs_t mRefreshPeriod; 13582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mutable nsecs_t mLastHwVSync; 136d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 1373eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian // constant once set 138a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian HWComposer* mHwc; 13903e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian PowerHAL mPowerHAL; 14003e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian 141a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1423eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian mutable Mutex mLock; 1433eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 1443eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian // protected by mLock 1453eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian wp<VSyncHandler> mVSyncHandler; 1463eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<FramebufferNativeWindow> mNativeWindow; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_DISPLAY_HARDWARE_H 153