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