DisplayDevice.h revision 8630320433bd15aca239522e54e711ef6372ab07
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
308630320433bd15aca239522e54e711ef6372ab07Mathias Agopian#include <utils/Mutex.h>
318630320433bd15aca239522e54e711ef6372ab07Mathias Agopian#include <utils/Timers.h>
328630320433bd15aca239522e54e711ef6372ab07Mathias Agopian
331b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "Transform.h"
341f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardwareBase.h"
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
393e87601170141229d661df93e2f59e1ced73474bMathias Agopianclass FramebufferSurface;
408630320433bd15aca239522e54e711ef6372ab07Mathias Agopianclass LayerBase;
418630320433bd15aca239522e54e711ef6372ab07Mathias Agopianclass SurfaceFlinger;
42a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopianclass SurfaceTextureClient;
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
448630320433bd15aca239522e54e711ef6372ab07Mathias Agopianclass DisplayHardware : public DisplayHardwareBase
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
473eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
491f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian        PARTIAL_UPDATES             = 0x00020000,   // video driver feature
501f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian        SWAP_RECTANGLE              = 0x00080000,
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    DisplayHardware(
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const sp<SurfaceFlinger>& flinger,
55a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            int dpy,
56a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            const sp<SurfaceTextureClient>& surface,
57a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian            EGLConfig config);
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
593eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian    virtual ~DisplayHardware();
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Flip the front and back buffers if the back buffer is "dirty".  Might
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // be instantaneous, might involve copying the frame buffer around.
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void flip(const Region& dirty) const;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
658630320433bd15aca239522e54e711ef6372ab07Mathias Agopian    void onVSyncReceived(nsecs_t timestamp);
668630320433bd15aca239522e54e711ef6372ab07Mathias Agopian
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float       getDpiX() const;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float       getDpiY() const;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float       getRefreshRate() const;
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float       getDensity() const;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int         getWidth() const;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int         getHeight() const;
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PixelFormat getFormat() const;
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t    getFlags() const;
7582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    nsecs_t     getRefreshPeriod() const;
7682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    nsecs_t     getRefreshTimestamp() const;
773eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian
78a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    EGLSurface  getEGLSurface() const;
793b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
803b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    void                    setVisibleLayersSortedByZ(const Vector< sp<LayerBase> >& layers);
813b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    Vector< sp<LayerBase> > getVisibleLayersSortedByZ() const;
823b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    bool                    getSecureLayerVisible() const;
833b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
841b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    status_t                setOrientation(int orientation);
851b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    int                     getOrientation() const { return mOrientation; }
861b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    const Transform&        getTransform() const { return mGlobalTransform; }
873eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t getPageFlipCount() const;
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay getEGLDisplay() const { return mDisplay; }
90a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
911d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling    void dump(String8& res) const;
921d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling
9374faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian    status_t compositionComplete() const;
9474faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian
959c6e297271ec9af9d974242d89cfa08cb6ceaa0aMathias Agopian    Rect getBounds() const {
961b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        return Rect(mDisplayWidth, mDisplayHeight);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
989c6e297271ec9af9d974242d89cfa08cb6ceaa0aMathias Agopian    inline Rect bounds() const { return getBounds(); }
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
101a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    void init(EGLConfig config);
102a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
103a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
104a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     *  Constants, set during initialization
105a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     */
106c7d14e247117392fbd44aa454622778a25c076aeMathias Agopian    sp<SurfaceFlinger> mFlinger;
107a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    int mDisplayId;
108a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // ANativeWindow this display is rendering into
109a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    sp<SurfaceTextureClient> mNativeWindow;
110a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    // set if mNativeWindow is a FramebufferSurface
111a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    sp<FramebufferSurface> mFramebufferSurface;
112a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
113a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay      mDisplay;
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface      mSurface;
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext      mContext;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float           mDpiX;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float           mDpiY;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float           mRefreshRate;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    float           mDensity;
1211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    int             mDisplayWidth;
1221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    int             mDisplayHeight;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PixelFormat     mFormat;
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t        mFlags;
125076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    mutable uint32_t mPageFlipCount;
126d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
127d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    nsecs_t         mRefreshPeriod;
12803e407270c7ad76632f982c886d0776bed9e9b4cMathias Agopian
129a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
130a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * Can only accessed from the main thread, these members
131a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     * don't need synchronization.
132a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     */
1333b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    // list of visible layers on that display
1343b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    Vector< sp<LayerBase> > mVisibleLayersSortedByZ;
1353b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    // Whether we have a visible secure layer on this display
1363b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian    bool mSecureLayerVisible;
1373b1d2b6b2bbfb5df46b1059ec52360974e6f1428Mathias Agopian
138a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
1391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    // this used to be in GraphicPlane
1401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    static status_t orientationToTransfrom(int orientation, int w, int h,
1411b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian            Transform* tr);
14298a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    Transform mGlobalTransform;
14398a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    int mOrientation;
1443eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian
145a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian    /*
146a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     *  protected by mLock
147a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian     */
14898a121aa916eb7acbf11df0e3e31a6fede6fc9ddMathias Agopian    mutable Mutex mLock;
1498630320433bd15aca239522e54e711ef6372ab07Mathias Agopian    mutable nsecs_t mLastHwVSync;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_DISPLAY_HARDWARE_H
155