DisplayDevice.h revision 3eb38cb33e41ce40dd1094bdec850f0fca9f8a53
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" 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianclass FramebufferNativeWindow; 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 393eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopianclass DisplayHardware : 403eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian public DisplayHardwareBase, 413eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian public HWComposer::EventHandler 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 443eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 453eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian class VSyncHandler : virtual public RefBase { 463eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian friend class DisplayHardware; 473eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian virtual void onVSyncReceived(int dpy, nsecs_t timestamp) = 0; 483eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian protected: 493eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian virtual ~VSyncHandler() {} 503eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian }; 513eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 531f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian COPY_BITS_EXTENSION = 0x00000008, 541f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian BUFFER_PRESERVED = 0x00010000, 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 90d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t getPageFlipCount() const; 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay getEGLDisplay() const { return mDisplay; } 93a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 941d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling void dump(String8& res) const; 951d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling 96a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian // Hardware Composer 97a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian HWComposer& getHwComposer() const; 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian status_t compositionComplete() const; 10074faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian 1019c6e297271ec9af9d974242d89cfa08cb6ceaa0aMathias Agopian Rect getBounds() const { 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return Rect(mWidth, mHeight); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1049c6e297271ec9af9d974242d89cfa08cb6ceaa0aMathias Agopian inline Rect bounds() const { return getBounds(); } 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 1073eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian virtual void onVSyncReceived(int dpy, nsecs_t timestamp); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void init(uint32_t displayIndex) __attribute__((noinline)); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void fini() __attribute__((noinline)); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian sp<SurfaceFlinger> mFlinger; 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay mDisplay; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface mSurface; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext mContext; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig mConfig; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float mDpiX; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float mDpiY; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float mRefreshRate; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float mDensity; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mWidth; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mHeight; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat mFormat; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t mFlags; 124076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mutable uint32_t mPageFlipCount; 1253d64e738b91b2a4a9d81fae1991e6f6eae9ac8c8Mathias Agopian GLint mMaxViewportDims[2]; 126ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian GLint mMaxTextureSize; 127d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 128d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian nsecs_t mRefreshPeriod; 12982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mutable nsecs_t mLastHwVSync; 130d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 1313eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian // constant once set 132a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian HWComposer* mHwc; 133a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 1343eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian mutable Mutex mLock; 1353eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 1363eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian // protected by mLock 1373eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian wp<VSyncHandler> mVSyncHandler; 1383eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 139076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<FramebufferNativeWindow> mNativeWindow; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_DISPLAY_HARDWARE_H 145