OSDN Git Service

drm_hwcomposer: Add composition type to DrmComposition
authorSean Paul <seanpaul@chromium.org>
Thu, 25 Jun 2015 01:43:01 +0000 (18:43 -0700)
committerSean Paul <seanpaul@chromium.org>
Mon, 13 Jul 2015 15:57:56 +0000 (11:57 -0400)
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>
drmdisplaycomposition.cpp
drmdisplaycomposition.h
drmdisplaycompositor.cpp

index 75046fb..f049f2d 100644 (file)
@@ -39,7 +39,11 @@ DrmCompositionLayer::~DrmCompositionLayer() {
 }
 
 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 @@ int DrmDisplayComposition::Init(DrmResources *drm, Importer *importer) {
   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 @@ int DrmDisplayComposition::AddLayer(hwc_layer_1_t *layer, hwc_drm_bo_t *bo,
 
   layer->acquireFenceFd = -1;  // We own this now
   layers_.push_back(c_layer);
+  type_ = DRM_COMPOSITION_TYPE_FRAME;
   return 0;
 }
 
index cf03360..bc8cf2e 100644 (file)
 
 namespace android {
 
+enum DrmCompositionType {
+  DRM_COMPOSITION_TYPE_EMPTY,
+  DRM_COMPOSITION_TYPE_FRAME,
+};
+
 typedef struct DrmCompositionLayer {
   DrmCompositionLayer();
   ~DrmCompositionLayer();
@@ -46,6 +51,8 @@ class DrmDisplayComposition {
 
   int Init(DrmResources *drm, Importer *importer);
 
+  DrmCompositionType type() const;
+
   int AddLayer(hwc_layer_1_t *layer, hwc_drm_bo_t *bo, DrmCrtc *crtc,
                DrmPlane *plane);
 
@@ -56,9 +63,13 @@ class DrmDisplayComposition {
  private:
   DrmDisplayComposition(const DrmDisplayComposition &) = delete;
 
+  bool validate_composition_type(DrmCompositionType desired);
+
   DrmResources *drm_;
   Importer *importer_;
 
+  DrmCompositionType type_;
+
   int timeline_fd_;
   int timeline_;
 
index 2b4b4df..2a11ee7 100644 (file)
@@ -93,8 +93,15 @@ int DrmDisplayCompositor::Init(DrmResources *drm, int display) {
 
 int DrmDisplayCompositor::QueueComposition(
     std::unique_ptr<DrmDisplayComposition> composition) {
-  if (composition->GetCompositionLayers()->empty())
+  switch (composition->type()) {
+  case DRM_COMPOSITION_TYPE_FRAME:
+    break;
+  case DRM_COMPOSITION_TYPE_EMPTY:
     return 0;
+  default:
+    ALOGE("Unknown composition type %d/%d", composition->type(), display_);
+    return -ENOENT;
+  }
 
   int ret = pthread_mutex_lock(&lock_);
   if (ret) {
@@ -206,12 +213,19 @@ int DrmDisplayCompositor::Composite() {
     return ret;
   }
 
-  ret = ApplyFrame(composition.get());
-  if (ret) {
-    ALOGE("Composite failed for display %d", display_);
-    return ret;
+  switch (composition->type()) {
+  case DRM_COMPOSITION_TYPE_FRAME:
+    ret = ApplyFrame(composition.get());
+    if (ret) {
+      ALOGE("Composite failed for display %d", display_);
+      return ret;
+    }
+    ++dump_frames_composited_;
+    break;
+  default:
+    ALOGE("Unknown composition type %d", composition->type());
+    return -EINVAL;
   }
-  ++dump_frames_composited_;
 
   if (active_composition_)
     active_composition_->FinishComposition();