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