drm_hwcomposer: Add composition type to DrmComposition

This allows us to have different types of compositions. This will
enable injection of non-frame related compositions such as dpms
and mode.

Change-Id: Ia62421c114c0c6bebccef3ce6ae936366b6aafe2
Signed-off-by: Sean Paul <seanpaul@chromium.org>
diff --git a/drmdisplaycomposition.cpp b/drmdisplaycomposition.cpp
index 75046fb..f049f2d 100644
--- a/drmdisplaycomposition.cpp
+++ b/drmdisplaycomposition.cpp
@@ -39,7 +39,11 @@
 }
 
 DrmDisplayComposition::DrmDisplayComposition()
-    : drm_(NULL), importer_(NULL), timeline_fd_(-1), timeline_(0) {
+    : drm_(NULL),
+      importer_(NULL),
+      type_(DRM_COMPOSITION_TYPE_EMPTY),
+      timeline_fd_(-1),
+      timeline_(0) {
 }
 
 DrmDisplayComposition::~DrmDisplayComposition() {
@@ -69,11 +73,22 @@
   return 0;
 }
 
+DrmCompositionType DrmDisplayComposition::type() const {
+  return type_;
+}
+
+bool DrmDisplayComposition::validate_composition_type(DrmCompositionType des) {
+  return type_ == DRM_COMPOSITION_TYPE_EMPTY || type_ == des;
+}
+
 int DrmDisplayComposition::AddLayer(hwc_layer_1_t *layer, hwc_drm_bo_t *bo,
                                     DrmCrtc *crtc, DrmPlane *plane) {
   if (layer->transform != 0)
     return -EINVAL;
 
+  if (!validate_composition_type(DRM_COMPOSITION_TYPE_FRAME))
+    return -EINVAL;
+
   ++timeline_;
   layer->releaseFenceFd =
       sw_sync_fence_create(timeline_fd_, "drm_fence", timeline_);
@@ -90,6 +105,7 @@
 
   layer->acquireFenceFd = -1;  // We own this now
   layers_.push_back(c_layer);
+  type_ = DRM_COMPOSITION_TYPE_FRAME;
   return 0;
 }