drm_hwcomposer: Tidy-up DrmConnector class

Implement DrmConnector instantiation through CreateInstance() static method,
which helps to reduce complexity of DrmDevice::Init() function.

Move Connector-to-CRTC binding information to the DrmDevice class.

Move drm/DrmConnector.h to Normal clang-tidy checks list by fixing
clang-tidy findings.

Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
diff --git a/drm/DrmDevice.cpp b/drm/DrmDevice.cpp
index f5e3521..a6d2289 100644
--- a/drm/DrmDevice.cpp
+++ b/drm/DrmDevice.cpp
@@ -111,47 +111,28 @@
     }
   }
 
-  for (int i = 0; !ret && i < res->count_connectors; ++i) {
-    auto c = MakeDrmModeConnectorUnique(fd(), res->connectors[i]);
-    if (!c) {
-      ALOGE("Failed to get connector %d", res->connectors[i]);
-      ret = -ENODEV;
-      break;
+  for (int i = 0; i < res->count_connectors; ++i) {
+    // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
+    auto conn = DrmConnector::CreateInstance(*this, res->connectors[i], i);
+
+    if (!conn) {
+      continue;
     }
 
-    std::vector<DrmEncoder *> possible_encoders;
-    DrmEncoder *current_encoder = nullptr;
-    for (int j = 0; j < c->count_encoders; ++j) {
-      for (auto &encoder : encoders_) {
-        if (encoder->GetId() == c->encoders[j])
-          possible_encoders.push_back(encoder.get());
-        if (encoder->GetId() == c->encoder_id)
-          current_encoder = encoder.get();
-      }
-    }
-
-    std::unique_ptr<DrmConnector> conn(
-        new DrmConnector(this, c.get(), current_encoder, possible_encoders));
-
-    ret = conn->Init();
-    if (ret) {
-      ALOGE("Init connector %d failed", res->connectors[i]);
-      break;
-    }
-
-    if (conn->writeback())
+    if (conn->IsWriteback()) {
       writeback_connectors_.emplace_back(std::move(conn));
-    else
+    } else {
       connectors_.emplace_back(std::move(conn));
+    }
   }
 
   auto add_displays = [this, &num_displays](bool internal, bool connected) {
     for (auto &conn : connectors_) {
-      bool is_connected = conn->state() == DRM_MODE_CONNECTED;
-      if ((internal ? conn->internal() : conn->external()) &&
+      bool is_connected = conn->IsConnected();
+      if ((internal ? conn->IsInternal() : conn->IsExternal()) &&
           (connected ? is_connected : !is_connected)) {
-        conn->set_display(num_displays);
-        displays_[num_displays] = num_displays;
+        bound_connectors_[num_displays] = conn.get();
+        connectors_to_display_id_[conn.get()] = num_displays;
         ++num_displays;
       }
     }
@@ -187,23 +168,19 @@
   for (auto &conn : connectors_) {
     ret = CreateDisplayPipe(conn.get());
     if (ret) {
-      ALOGE("Failed CreateDisplayPipe %d with %d", conn->id(), ret);
+      ALOGE("Failed CreateDisplayPipe %d with %d", conn->GetId(), ret);
       return std::make_tuple(ret, 0);
     }
   }
-  return std::make_tuple(ret, displays_.size());
+  return std::make_tuple(ret, bound_connectors_.size());
 }
 
 bool DrmDevice::HandlesDisplay(int display) const {
-  return displays_.find(display) != displays_.end();
+  return bound_connectors_.count(display) != 0;
 }
 
 DrmConnector *DrmDevice::GetConnectorForDisplay(int display) const {
-  for (const auto &conn : connectors_) {
-    if (conn->display() == display)
-      return conn.get();
-  }
-  return nullptr;
+  return bound_connectors_.at(display);
 }
 
 DrmCrtc *DrmDevice::GetCrtcForDisplay(int display) const {
@@ -246,11 +223,13 @@
 }
 
 int DrmDevice::CreateDisplayPipe(DrmConnector *connector) {
-  int display = connector->display();
+  int display = connectors_to_display_id_.at(connector);
   /* Try to use current setup first */
-  if (connector->encoder()) {
-    int ret = TryEncoderForDisplay(display, connector->encoder());
+  auto *enc0 = FindEncoderById(connector->GetCurrentEncoderId());
+  if (enc0 != nullptr && encoders_to_display_id_.count(enc0) == 0) {
+    int ret = TryEncoderForDisplay(display, enc0);
     if (!ret) {
+      encoders_to_display_id_[enc0] = display;
       return 0;
     }
 
@@ -260,10 +239,15 @@
     }
   }
 
-  for (DrmEncoder *enc : connector->possible_encoders()) {
-    int ret = TryEncoderForDisplay(display, enc);
+  for (auto &enc : encoders_) {
+    if (!connector->SupportsEncoder(*enc) ||
+        encoders_to_display_id_.count(enc.get()) != 0) {
+      continue;
+    }
+
+    int ret = TryEncoderForDisplay(display, enc.get());
     if (!ret) {
-      connector->set_encoder(enc);
+      encoders_to_display_id_[enc.get()] = display;
       return 0;
     }
 
@@ -272,8 +256,7 @@
       return ret;
     }
   }
-  ALOGE("Could not find a suitable encoder/crtc for display %d",
-        connector->display());
+  ALOGE("Could not find a suitable encoder/crtc for display %d", display);
   return -ENODEV;
 }
 
@@ -327,13 +310,6 @@
   return found ? 0 : -ENOENT;
 }
 
-int DrmDevice::GetConnectorProperty(const DrmConnector &connector,
-                                    const char *prop_name,
-                                    DrmProperty *property) const {
-  return GetProperty(connector.id(), DRM_MODE_OBJECT_CONNECTOR, prop_name,
-                     property);
-}
-
 std::string DrmDevice::GetName() const {
   auto *ver = drmGetVersion(fd());
   if (!ver) {