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