Merge "Revert "virtio-gpu-asg transport""
diff --git a/system/hwc2/EmuHWC2.cpp b/system/hwc2/EmuHWC2.cpp
index bac4eac..e77e27d 100644
--- a/system/hwc2/EmuHWC2.cpp
+++ b/system/hwc2/EmuHWC2.cpp
@@ -391,7 +391,7 @@
     return Error::None;
 }
 
-const native_handle_t* EmuHWC2::allocateDisplayColorBuffer() {
+const native_handle_t* EmuHWC2::allocateDisplayColorBuffer(int width, int height) {
     const uint32_t layerCount = 1;
     const uint64_t graphicBufferId = 0; // not used
 
@@ -399,7 +399,7 @@
     uint32_t stride;
 
     if (GraphicBufferAllocator::get().allocate(
-        mDisplayWidth, mDisplayHeight,
+        width, height,
         PIXEL_FORMAT_RGBA_8888,
         layerCount,
         (GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_RENDER),
@@ -437,7 +437,7 @@
 
 std::atomic<hwc2_display_t> EmuHWC2::Display::sNextId(0);
 
-EmuHWC2::Display::Display(EmuHWC2& device, DisplayType type)
+EmuHWC2::Display::Display(EmuHWC2& device, DisplayType type, int width, int height)
   : mDevice(device),
     mId(sNextId++),
     mHostDisplayId(0),
@@ -458,7 +458,7 @@
     mSetColorTransform(false),
     mStateMutex() {
         mVsyncThread.run("", ANDROID_PRIORITY_URGENT_DISPLAY);
-        mTargetCb = device.allocateDisplayColorBuffer();
+        mTargetCb = device.allocateDisplayColorBuffer(width, height);
 }
 
 EmuHWC2::Display::~Display() {
@@ -1325,7 +1325,7 @@
 }
 
 HWC2::Error EmuHWC2::Display::populateSecondaryConfigs(uint32_t width, uint32_t height,
-        uint32_t dpi) {
+        uint32_t dpi, uint32_t idx) {
     ALOGVV("%s DisplayId %u, width %u, height %u, dpi %u",
             __FUNCTION__, (uint32_t)mId, width, height, dpi);
     std::unique_lock<std::mutex> lock(mStateMutex);
@@ -1338,24 +1338,29 @@
     newConfig->setAttribute(Attribute::DpiX, dpi*1000);
     newConfig->setAttribute(Attribute::DpiY, dpi*1000);
 
-    newConfig->setId(static_cast<hwc2_config_t>(mConfigs.size()));
+    int configId = mConfigs.size();
+    newConfig->setId(static_cast<hwc2_config_t>(configId));
     ALOGV("Found new secondary config %d: %s", (uint32_t)newConfig->getId(),
             newConfig->toString().c_str());
     mConfigs.emplace_back(std::move(newConfig));
 
-    // we need to reset these values after populatePrimaryConfigs()
-    mActiveConfig = mConfigs[0];
+    mActiveConfig = mConfigs[configId];
     mActiveColorMode = HAL_COLOR_MODE_NATIVE;
     mColorModes.emplace((android_color_mode_t)HAL_COLOR_MODE_NATIVE);
 
-    uint32_t displayId = 0;
+    uint32_t displayId = hostDisplayIdStart + idx;
     DEFINE_AND_VALIDATE_HOST_CONNECTION
 
     hostCon->lock();
+    rcEnc->rcDestroyDisplay(rcEnc, displayId);
     rcEnc->rcCreateDisplay(rcEnc, &displayId);
     rcEnc->rcSetDisplayPose(rcEnc, displayId, -1, -1, width, height);
     hostCon->unlock();
 
+    if (displayId != hostDisplayIdStart + idx) {
+        ALOGE("Something wrong with host displayId allocation, want %d "
+              "allocated %d", hostDisplayIdStart + idx, displayId);
+    }
     mHostDisplayId = displayId;
     ALOGVV("%s: mHostDisplayId=%d", __FUNCTION__, mHostDisplayId);
 
@@ -1623,7 +1628,8 @@
 
 int EmuHWC2::populatePrimary() {
     int ret = 0;
-    auto display = std::make_shared<Display>(*this, HWC2::DisplayType::Physical);
+    auto display = std::make_shared<Display>(*this, HWC2::DisplayType::Physical,
+            mDisplayWidth, mDisplayHeight);
     ret = display->populatePrimaryConfigs(mDisplayWidth, mDisplayHeight,
                                           mDisplayDpiX, mDisplayDpiY);
     if (ret != 0) {
@@ -1678,6 +1684,7 @@
         ALOGE("%s: invalid value for system property: %s", __FUNCTION__, EXTERANL_DISPLAY_PROP);
         return -1;
     }
+    uint32_t idx = 0;
     while (!values.empty()) {
         // uint64_t physicalId = values[0];
         uint32_t width = values[1];
@@ -1687,8 +1694,8 @@
         values.erase(values.begin(), values.begin() + 5);
 
         Error ret = Error::None;
-        auto display = std::make_shared<Display>(*this, HWC2::DisplayType::Physical);
-        ret = display->populateSecondaryConfigs(width, height, dpi);
+        auto display = std::make_shared<Display>(*this, HWC2::DisplayType::Physical, width, height);
+        ret = display->populateSecondaryConfigs(width, height, dpi, idx++);
         if (ret != Error::None) {
             return -2;
         }
diff --git a/system/hwc2/EmuHWC2.h b/system/hwc2/EmuHWC2.h
index 1ff3394..4ab09e1 100644
--- a/system/hwc2/EmuHWC2.h
+++ b/system/hwc2/EmuHWC2.h
@@ -205,7 +205,7 @@
 
     class Display {
     public:
-        Display(EmuHWC2& device, HWC2::DisplayType type);
+        Display(EmuHWC2& device, HWC2::DisplayType type, int width, int height);
         ~Display();
         hwc2_display_t getId() const {return mId;}
 
@@ -260,7 +260,7 @@
         // Read configs from PRIMARY Display
         int populatePrimaryConfigs(int width, int height, int dpiX, int dpiY);
         HWC2::Error populateSecondaryConfigs(uint32_t width, uint32_t height,
-                 uint32_t dpi);
+                 uint32_t dpi, uint32_t idx);
 
     private:
         void post(HostConnection *hostCon, ExtendedRCEncoderContext *rcEnc,
@@ -346,6 +346,7 @@
         EmuHWC2& mDevice;
         // Display ID generator.
         static std::atomic<hwc2_display_t> sNextId;
+        static const uint32_t hostDisplayIdStart = 6;
         const hwc2_display_t mId;
         // emulator side displayId
         uint32_t mHostDisplayId;
@@ -466,7 +467,7 @@
             hwc2_layer_t layerId);
 
     HWC2::Error initDisplayParameters();
-    const native_handle_t* allocateDisplayColorBuffer();
+    const native_handle_t* allocateDisplayColorBuffer(int width, int height);
     void freeDisplayColorBuffer(const native_handle_t* h);
 
     std::unordered_set<HWC2::Capability> mCapabilities;