• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (C) 2020 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 #pragma once
18 
19 #include "base/Lock.h"
20 #include "base/Stream.h"
21 #include "host-common/record_screen_agent.h"
22 #include "host-common/window_agent.h"
23 
24 #include <map>
25 
26 namespace android {
27 
28 struct MultiDisplayInfo {
29     int32_t pos_x;
30     int32_t pos_y;
31     uint32_t width;
32     uint32_t height;
33     uint32_t dpi;
34     uint32_t flag;
35     uint32_t cb;
36     bool     enabled;
MultiDisplayInfoMultiDisplayInfo37     MultiDisplayInfo() :
38       pos_x(0), pos_y(0), width(0), height(0), dpi(0), flag(0), cb(0), enabled(true) {}
39     MultiDisplayInfo(int32_t x, int32_t y, uint32_t w, uint32_t h,
40                      uint32_t d, uint32_t f, bool e, uint32_t c = 0) :
pos_xMultiDisplayInfo41       pos_x(x), pos_y(y), width(w), height(h), dpi(d), flag(f), cb(c), enabled(e) {}
42 
43 };
44 
45 class MultiDisplay {
46 public:
47     MultiDisplay(const QAndroidEmulatorWindowAgent* const windowAgent,
48                  const QAndroidRecordScreenAgent* const recordAgent,
49                  bool isGuestMode);
50     static MultiDisplay* getInstance();
isMultiDisplayEnabled()51     bool isMultiDisplayEnabled() { base::AutoLock lock(mLock); return mMultiDisplay.size() > 1; }
52     int setMultiDisplay(uint32_t id,
53                          int32_t x,
54                          int32_t y,
55                          uint32_t w,
56                          uint32_t h,
57                          uint32_t dpi,
58                          uint32_t flag,
59                          bool add);
getMultiDisplay(uint32_t id,int32_t * x,int32_t * y,uint32_t * width,uint32_t * height,uint32_t * dpi,uint32_t * flag,bool * enabled)60     bool getMultiDisplay(uint32_t id,
61                          int32_t* x,
62                          int32_t* y,
63                          uint32_t* width,
64                          uint32_t* height,
65                          uint32_t* dpi,
66                          uint32_t* flag,
67                          bool* enabled) {
68         return getMultiDisplay(id, x, y, width, height, dpi, flag, nullptr, enabled);
69     }
70     bool getNextMultiDisplay(int32_t start_id,
71                              uint32_t* id,
72                              int32_t* x,
73                              int32_t* y,
74                              uint32_t* w,
75                              uint32_t* h,
76                              uint32_t* dpi,
77                              uint32_t* flag,
78                              uint32_t* cb);
79     bool multiDisplayParamValidate(uint32_t id, uint32_t w, uint32_t h,
80                                    uint32_t dpi, uint32_t flag);
81     bool translateCoordination(uint32_t* x, uint32_t* y, uint32_t* displayId);
82     void setGpuMode(bool isGuestMode, uint32_t w, uint32_t h);
83     int createDisplay(uint32_t* displayId);
84     int setDisplayPose(uint32_t displayId,
85                        int32_t x,
86                        int32_t y,
87                        uint32_t w,
88                        uint32_t h,
89                        uint32_t dpi);
90     int destroyDisplay(uint32_t displayId);
91     int getDisplayPose(uint32_t displayId,
92                        int32_t* x,
93                        int32_t* y,
94                        uint32_t* w,
95                        uint32_t* h);
96     int getDisplayColorBuffer(uint32_t displayId, uint32_t* colorBuffer);
97     int getColorBufferDisplay(uint32_t colorBuffer, uint32_t* displayId);
98     int setDisplayColorBuffer(uint32_t displayId, uint32_t colorBuffer);
99     void getCombinedDisplaySize(uint32_t* w, uint32_t* h);
100     void loadConfig();
101     void onSave(base::Stream* stream);
102     void onLoad(base::Stream* stream);
103 
104     // 0 for default Android display
105     // 1-5 for Emulator UI
106     // 6-10 for developer from rcControl
107     static const uint32_t s_displayIdInternalBegin = 6;
108     static const uint32_t s_maxNumMultiDisplay = 11;
109     static const uint32_t s_invalidIdMultiDisplay = 0xFFFFFFAB;
110 
111 private:
112     const QAndroidEmulatorWindowAgent* mWindowAgent;
113     const QAndroidRecordScreenAgent* mRecordAgent;
114     bool mGuestMode;
115     std::map<uint32_t, MultiDisplayInfo> mMultiDisplay;
116     android::base::Lock mLock;
117 
118     void recomputeLayoutLocked();
119     void getCombinedDisplaySizeLocked(uint32_t* w, uint32_t* h);
120     bool getMultiDisplay(uint32_t id,
121                          int32_t* x,
122                          int32_t* y,
123                          uint32_t* width,
124                          uint32_t* height,
125                          uint32_t* dpi,
126                          uint32_t* flag,
127                          uint32_t* cb,
128                          bool* enabled);
129     int getNumberActiveMultiDisplaysLocked();
130 
131     std::map<uint32_t, MultiDisplayInfo> parseConfig();
132 };
133 } // namespace android
134 
135 void android_init_multi_display(const QAndroidEmulatorWindowAgent* const windowAgent,
136                                 const QAndroidRecordScreenAgent* const recordAgent,
137                                 bool isGUestMode = false);
138