drm_hwcomposer: Use hw planes + drm atomic interface

Replace the basic, single overlay, modeset/flip implementation with
a new Compositor instantiation for drm. The new compositor uses the
drm atomic interface to composite layers to multiple hardware planes.

This change also introduces an importer argument in
Compositor::CreateComposition. By specifying the importer, Compositor
instances are responsible for cleaning up buffer objects submitted
via Composition::AddLayer.

Change-Id: Ic292829cd93475d754294b00428de132301092b2
Signed-off-by: Sean Paul <seanpaul@chromium.org>
diff --git a/drmcompositorworker.cpp b/drmcompositorworker.cpp
new file mode 100644
index 0000000..9406194
--- /dev/null
+++ b/drmcompositorworker.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "hwc-drm-compositor-worker"
+
+#include "drmcompositor.h"
+#include "drmcompositorworker.h"
+#include "worker.h"
+
+#include <stdlib.h>
+
+#include <cutils/log.h>
+#include <hardware/hardware.h>
+
+namespace android {
+
+DrmCompositorWorker::DrmCompositorWorker(DrmCompositor *compositor)
+    : Worker("drm-compositor", HAL_PRIORITY_URGENT_DISPLAY),
+      compositor_(compositor) {
+}
+
+DrmCompositorWorker::~DrmCompositorWorker() {
+}
+
+int DrmCompositorWorker::Init() {
+  return InitWorker();
+}
+
+void DrmCompositorWorker::Routine() {
+  int ret;
+  if (!compositor_->HaveQueuedComposites()) {
+    ret = Lock();
+    if (ret) {
+      ALOGE("Failed to lock worker, %d", ret);
+      return;
+    }
+
+    int wait_ret = WaitForSignalOrExitLocked();
+
+    ret = Unlock();
+    if (ret) {
+      ALOGE("Failed to unlock worker, %d", ret);
+      return;
+    }
+
+    if (wait_ret == -EINTR) {
+      return;
+    } else if (wait_ret) {
+      ALOGE("Failed to wait for signal, %d", wait_ret);
+      return;
+    }
+  }
+
+  ret = compositor_->Composite();
+  if (ret)
+    ALOGE("Failed to composite! %d", ret);
+}
+}