• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_DISPLAY_DEVICE_H
18 #define ANDROID_DISPLAY_DEVICE_H
19 
20 #include "Transform.h"
21 
22 #include <stdlib.h>
23 
24 #ifndef USE_HWC2
25 #include <ui/PixelFormat.h>
26 #endif
27 #include <ui/Region.h>
28 
29 #include <EGL/egl.h>
30 #include <EGL/eglext.h>
31 
32 #ifdef USE_HWC2
33 #include <binder/IBinder.h>
34 #include <utils/RefBase.h>
35 #endif
36 #include <utils/Mutex.h>
37 #include <utils/String8.h>
38 #include <utils/Timers.h>
39 
40 #include <hardware/hwcomposer_defs.h>
41 
42 #ifdef USE_HWC2
43 #include <memory>
44 #endif
45 
46 struct ANativeWindow;
47 
48 namespace android {
49 
50 struct DisplayInfo;
51 class DisplaySurface;
52 class Fence;
53 class IGraphicBufferProducer;
54 class Layer;
55 class SurfaceFlinger;
56 class HWComposer;
57 
58 class DisplayDevice : public LightRefBase<DisplayDevice>
59 {
60 public:
61     // region in layer-stack space
62     mutable Region dirtyRegion;
63     // region in screen space
64     mutable Region swapRegion;
65     // region in screen space
66     Region undefinedRegion;
67     bool lastCompositionHadVisibleLayers;
68 
69     enum DisplayType {
70         DISPLAY_ID_INVALID = -1,
71         DISPLAY_PRIMARY     = HWC_DISPLAY_PRIMARY,
72         DISPLAY_EXTERNAL    = HWC_DISPLAY_EXTERNAL,
73         DISPLAY_VIRTUAL     = HWC_DISPLAY_VIRTUAL,
74         NUM_BUILTIN_DISPLAY_TYPES = HWC_NUM_PHYSICAL_DISPLAY_TYPES,
75     };
76 
77     enum {
78         PARTIAL_UPDATES = 0x00020000, // video driver feature
79         SWAP_RECTANGLE  = 0x00080000,
80     };
81 
82     enum {
83         NO_LAYER_STACK = 0xFFFFFFFF,
84     };
85 
86     DisplayDevice(
87             const sp<SurfaceFlinger>& flinger,
88             DisplayType type,
89             int32_t hwcId,
90 #ifndef USE_HWC2
91             int format,
92 #endif
93             bool isSecure,
94             const wp<IBinder>& displayToken,
95             const sp<DisplaySurface>& displaySurface,
96             const sp<IGraphicBufferProducer>& producer,
97             EGLConfig config);
98 
99     ~DisplayDevice();
100 
101     // whether this is a valid object. An invalid DisplayDevice is returned
102     // when an non existing id is requested
103     bool isValid() const;
104 
105     // isSecure indicates whether this display can be trusted to display
106     // secure surfaces.
isSecure()107     bool isSecure() const { return mIsSecure; }
108 
109     // Flip the front and back buffers if the back buffer is "dirty".  Might
110     // be instantaneous, might involve copying the frame buffer around.
111     void flip(const Region& dirty) const;
112 
113     int         getWidth() const;
114     int         getHeight() const;
115 #ifndef USE_HWC2
116     PixelFormat getFormat() const;
117 #endif
118     uint32_t    getFlags() const;
119 
120     EGLSurface  getEGLSurface() const;
121 
122     void                    setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers);
123     const Vector< sp<Layer> >& getVisibleLayersSortedByZ() const;
124     Region                  getDirtyRegion(bool repaintEverything) const;
125 
126     void                    setLayerStack(uint32_t stack);
127     void                    setDisplaySize(const int newWidth, const int newHeight);
128     void                    setProjection(int orientation, const Rect& viewport, const Rect& frame);
129 
getOrientation()130     int                     getOrientation() const { return mOrientation; }
131     uint32_t                getOrientationTransform() const;
132     static uint32_t         getPrimaryDisplayOrientationTransform();
getTransform()133     const Transform&        getTransform() const { return mGlobalTransform; }
getViewport()134     const Rect              getViewport() const { return mViewport; }
getFrame()135     const Rect              getFrame() const { return mFrame; }
getScissor()136     const Rect&             getScissor() const { return mScissor; }
needsFiltering()137     bool                    needsFiltering() const { return mNeedsFiltering; }
138 
getLayerStack()139     uint32_t                getLayerStack() const { return mLayerStack; }
getDisplayType()140     int32_t                 getDisplayType() const { return mType; }
getHwcDisplayId()141     int32_t                 getHwcDisplayId() const { return mHwcDisplayId; }
getDisplayToken()142     const wp<IBinder>&      getDisplayToken() const { return mDisplayToken; }
143 
144     // We pass in mustRecompose so we can keep VirtualDisplaySurface's state
145     // machine happy without actually queueing a buffer if nothing has changed
146     status_t beginFrame(bool mustRecompose) const;
147 #ifdef USE_HWC2
148     status_t prepareFrame(HWComposer& hwc);
149 #else
150     status_t prepareFrame(const HWComposer& hwc) const;
151 #endif
152 
153     void swapBuffers(HWComposer& hwc) const;
154 #ifndef USE_HWC2
155     status_t compositionComplete() const;
156 #endif
157 
158     // called after h/w composer has completed its set() call
159 #ifdef USE_HWC2
160     void onSwapBuffersCompleted() const;
161 #else
162     void onSwapBuffersCompleted(HWComposer& hwc) const;
163 #endif
164 
getBounds()165     Rect getBounds() const {
166         return Rect(mDisplayWidth, mDisplayHeight);
167     }
bounds()168     inline Rect bounds() const { return getBounds(); }
169 
170     void setDisplayName(const String8& displayName);
getDisplayName()171     const String8& getDisplayName() const { return mDisplayName; }
172 
173     EGLBoolean makeCurrent(EGLDisplay dpy, EGLContext ctx) const;
174     void setViewportAndProjection() const;
175 
176     const sp<Fence>& getClientTargetAcquireFence() const;
177 
178     /* ------------------------------------------------------------------------
179      * Display power mode management.
180      */
181     int getPowerMode() const;
182     void setPowerMode(int mode);
183     bool isDisplayOn() const;
184 
185 #ifdef USE_HWC2
186     android_color_mode_t getActiveColorMode() const;
187     void setActiveColorMode(android_color_mode_t mode);
188 #endif
189 
190     /* ------------------------------------------------------------------------
191      * Display active config management.
192      */
193     int getActiveConfig() const;
194     void setActiveConfig(int mode);
195 
196     // release HWC resources (if any) for removable displays
197     void disconnect(HWComposer& hwc);
198 
199     /* ------------------------------------------------------------------------
200      * Debugging
201      */
202     uint32_t getPageFlipCount() const;
203     void dump(String8& result) const;
204 
205 private:
206     /*
207      *  Constants, set during initialization
208      */
209     sp<SurfaceFlinger> mFlinger;
210     DisplayType mType;
211     int32_t mHwcDisplayId;
212     wp<IBinder> mDisplayToken;
213 
214     // ANativeWindow this display is rendering into
215     sp<ANativeWindow> mNativeWindow;
216     sp<DisplaySurface> mDisplaySurface;
217 
218     EGLConfig       mConfig;
219     EGLDisplay      mDisplay;
220     EGLSurface      mSurface;
221     int             mDisplayWidth;
222     int             mDisplayHeight;
223 #ifndef USE_HWC2
224     PixelFormat     mFormat;
225 #endif
226     uint32_t        mFlags;
227     mutable uint32_t mPageFlipCount;
228     String8         mDisplayName;
229     bool            mIsSecure;
230 
231     /*
232      * Can only accessed from the main thread, these members
233      * don't need synchronization.
234      */
235 
236     // list of visible layers on that display
237     Vector< sp<Layer> > mVisibleLayersSortedByZ;
238 
239     /*
240      * Transaction state
241      */
242     static status_t orientationToTransfrom(int orientation,
243             int w, int h, Transform* tr);
244 
245     uint32_t mLayerStack;
246     int mOrientation;
247     static uint32_t sPrimaryDisplayOrientation;
248     // user-provided visible area of the layer stack
249     Rect mViewport;
250     // user-provided rectangle where mViewport gets mapped to
251     Rect mFrame;
252     // pre-computed scissor to apply to the display
253     Rect mScissor;
254     Transform mGlobalTransform;
255     bool mNeedsFiltering;
256     // Current power mode
257     int mPowerMode;
258     // Current active config
259     int mActiveConfig;
260 #ifdef USE_HWC2
261     // current active color mode
262     android_color_mode_t mActiveColorMode;
263 #endif
264 };
265 
266 }; // namespace android
267 
268 #endif // ANDROID_DISPLAY_DEVICE_H
269