OSDN Git Service

Merge "Switch from libcrypto_static to libcrypto target" am: 612c12b293 am: 4c246fe5df
[android-x86/frameworks-native.git] / services / surfaceflinger / DisplayDevice.h
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     // clang-format off
87     DisplayDevice(
88             const sp<SurfaceFlinger>& flinger,
89             DisplayType type,
90             int32_t hwcId,
91 #ifndef USE_HWC2
92             int format,
93 #endif
94             bool isSecure,
95             const wp<IBinder>& displayToken,
96             const sp<DisplaySurface>& displaySurface,
97             const sp<IGraphicBufferProducer>& producer,
98             EGLConfig config,
99             bool supportWideColor);
100     // clang-format on
101
102     ~DisplayDevice();
103
104     // whether this is a valid object. An invalid DisplayDevice is returned
105     // when an non existing id is requested
106     bool isValid() const;
107
108     // isSecure indicates whether this display can be trusted to display
109     // secure surfaces.
110     bool isSecure() const { return mIsSecure; }
111
112     // Flip the front and back buffers if the back buffer is "dirty".  Might
113     // be instantaneous, might involve copying the frame buffer around.
114     void flip(const Region& dirty) const;
115
116     int         getWidth() const;
117     int         getHeight() const;
118 #ifndef USE_HWC2
119     PixelFormat getFormat() const;
120 #endif
121     uint32_t    getFlags() const;
122
123     EGLSurface  getEGLSurface() const;
124
125     void                    setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers);
126     const Vector< sp<Layer> >& getVisibleLayersSortedByZ() const;
127     Region                  getDirtyRegion(bool repaintEverything) const;
128
129     void                    setLayerStack(uint32_t stack);
130     void                    setDisplaySize(const int newWidth, const int newHeight);
131     void                    setProjection(int orientation, const Rect& viewport, const Rect& frame);
132
133     int                     getOrientation() const { return mOrientation; }
134     uint32_t                getOrientationTransform() const;
135     static uint32_t         getPrimaryDisplayOrientationTransform();
136     const Transform&        getTransform() const { return mGlobalTransform; }
137     const Rect              getViewport() const { return mViewport; }
138     const Rect              getFrame() const { return mFrame; }
139     const Rect&             getScissor() const { return mScissor; }
140     bool                    needsFiltering() const { return mNeedsFiltering; }
141
142     uint32_t                getLayerStack() const { return mLayerStack; }
143     int32_t                 getDisplayType() const { return mType; }
144     int32_t                 getHwcDisplayId() const { return mHwcDisplayId; }
145     const wp<IBinder>&      getDisplayToken() const { return mDisplayToken; }
146
147     // We pass in mustRecompose so we can keep VirtualDisplaySurface's state
148     // machine happy without actually queueing a buffer if nothing has changed
149     status_t beginFrame(bool mustRecompose) const;
150 #ifdef USE_HWC2
151     status_t prepareFrame(HWComposer& hwc);
152     bool getWideColorSupport() const { return mDisplayHasWideColor; }
153 #else
154     status_t prepareFrame(const HWComposer& hwc) const;
155 #endif
156
157     void swapBuffers(HWComposer& hwc) const;
158 #ifndef USE_HWC2
159     status_t compositionComplete() const;
160 #endif
161
162     // called after h/w composer has completed its set() call
163 #ifdef USE_HWC2
164     void onSwapBuffersCompleted() const;
165 #else
166     void onSwapBuffersCompleted(HWComposer& hwc) const;
167 #endif
168
169     Rect getBounds() const {
170         return Rect(mDisplayWidth, mDisplayHeight);
171     }
172     inline Rect bounds() const { return getBounds(); }
173
174     void setDisplayName(const String8& displayName);
175     const String8& getDisplayName() const { return mDisplayName; }
176
177     EGLBoolean makeCurrent(EGLDisplay dpy, EGLContext ctx) const;
178     void setViewportAndProjection() const;
179
180     const sp<Fence>& getClientTargetAcquireFence() const;
181
182     /* ------------------------------------------------------------------------
183      * Display power mode management.
184      */
185     int getPowerMode() const;
186     void setPowerMode(int mode);
187     bool isDisplayOn() const;
188
189 #ifdef USE_HWC2
190     android_color_mode_t getActiveColorMode() const;
191     void setActiveColorMode(android_color_mode_t mode);
192 #endif
193
194     /* ------------------------------------------------------------------------
195      * Display active config management.
196      */
197     int getActiveConfig() const;
198     void setActiveConfig(int mode);
199
200     // release HWC resources (if any) for removable displays
201     void disconnect(HWComposer& hwc);
202
203     /* ------------------------------------------------------------------------
204      * Debugging
205      */
206     uint32_t getPageFlipCount() const;
207     void dump(String8& result) const;
208
209 private:
210     /*
211      *  Constants, set during initialization
212      */
213     sp<SurfaceFlinger> mFlinger;
214     DisplayType mType;
215     int32_t mHwcDisplayId;
216     wp<IBinder> mDisplayToken;
217
218     // ANativeWindow this display is rendering into
219     sp<ANativeWindow> mNativeWindow;
220     sp<DisplaySurface> mDisplaySurface;
221
222     EGLConfig       mConfig;
223     EGLDisplay      mDisplay;
224     EGLSurface      mSurface;
225     int             mDisplayWidth;
226     int             mDisplayHeight;
227 #ifndef USE_HWC2
228     PixelFormat     mFormat;
229 #endif
230     uint32_t        mFlags;
231     mutable uint32_t mPageFlipCount;
232     String8         mDisplayName;
233     bool            mIsSecure;
234
235     /*
236      * Can only accessed from the main thread, these members
237      * don't need synchronization.
238      */
239
240     // list of visible layers on that display
241     Vector< sp<Layer> > mVisibleLayersSortedByZ;
242
243     /*
244      * Transaction state
245      */
246     static status_t orientationToTransfrom(int orientation,
247             int w, int h, Transform* tr);
248
249     // The identifier of the active layer stack for this display. Several displays
250     // can use the same layer stack: A z-ordered group of layers (sometimes called
251     // "surfaces"). Any given layer can only be on a single layer stack.
252     uint32_t mLayerStack;
253
254     int mOrientation;
255     static uint32_t sPrimaryDisplayOrientation;
256     // user-provided visible area of the layer stack
257     Rect mViewport;
258     // user-provided rectangle where mViewport gets mapped to
259     Rect mFrame;
260     // pre-computed scissor to apply to the display
261     Rect mScissor;
262     Transform mGlobalTransform;
263     bool mNeedsFiltering;
264     // Current power mode
265     int mPowerMode;
266     // Current active config
267     int mActiveConfig;
268 #ifdef USE_HWC2
269     // current active color mode
270     android_color_mode_t mActiveColorMode;
271
272     // Need to know if display is wide-color capable or not.
273     // Initialized by SurfaceFlinger when the DisplayDevice is created.
274     // Fed to RenderEngine during composition.
275     bool mDisplayHasWideColor;
276 #endif
277 };
278
279 struct DisplayDeviceState {
280     DisplayDeviceState() = default;
281     DisplayDeviceState(DisplayDevice::DisplayType type, bool isSecure);
282
283     bool isValid() const { return type >= 0; }
284     bool isMainDisplay() const { return type == DisplayDevice::DISPLAY_PRIMARY; }
285     bool isVirtualDisplay() const { return type >= DisplayDevice::DISPLAY_VIRTUAL; }
286
287     static std::atomic<int32_t> nextDisplayId;
288     int32_t displayId = nextDisplayId++;
289     DisplayDevice::DisplayType type = DisplayDevice::DISPLAY_ID_INVALID;
290     sp<IGraphicBufferProducer> surface;
291     uint32_t layerStack = DisplayDevice::NO_LAYER_STACK;
292     Rect viewport;
293     Rect frame;
294     uint8_t orientation = 0;
295     uint32_t width = 0;
296     uint32_t height = 0;
297     String8 displayName;
298     bool isSecure = false;
299 };
300
301 }; // namespace android
302
303 #endif // ANDROID_DISPLAY_DEVICE_H