libhwc2.1: libdrmresource: Add Histogram DRM event

It adds vendor specific Histogram DRM event implementations
in event listener and Histogram DRM event handler class.

Bug: 197519352
Signed-off-by: YongWook Shin <yongwook.shin@samsung.com>
Change-Id: I62fd76c5821beb387f6063ff54648fc8e1275357
diff --git a/libhwc2.1/libdrmresource/drm/drmeventlistener.cpp b/libhwc2.1/libdrmresource/drm/drmeventlistener.cpp
index be93bdf..5f69c7b 100644
--- a/libhwc2.1/libdrmresource/drm/drmeventlistener.cpp
+++ b/libhwc2.1/libdrmresource/drm/drmeventlistener.cpp
@@ -111,6 +111,15 @@
     hotplug_handler_ = NULL;
 }
 
+void DrmEventListener::RegisterHistogramHandler(DrmHistogramEventHandler *handler) {
+    assert(!histogram_handler_);
+    histogram_handler_.reset(handler);
+}
+
+void DrmEventListener::UnRegisterHistogramHandler(DrmHistogramEventHandler *handler) {
+    if (handler == histogram_handler_.get()) histogram_handler_ = NULL;
+}
+
 void DrmEventListener::RegisterTUIHandler(DrmTUIEventHandler *handler) {
   if (tui_handler_) {
     ALOGE("TUI handler was already registered");
@@ -199,6 +208,7 @@
     int len, i;
     struct drm_event *e;
     struct drm_event_vblank *vblank;
+    struct exynos_drm_histogram_event *histo;
     void *user_data;
 
     len = read(drm_->fd(), &buffer, sizeof(buffer));
@@ -209,10 +219,15 @@
     while (i < len) {
         e = (struct drm_event *)(buffer + i);
         switch (e->type) {
+            case EXYNOS_DRM_HISTOGRAM_EVENT:
+                if (histogram_handler_) {
+                    histo = (struct exynos_drm_histogram_event *)e;
+                    histogram_handler_->HandleHistogramEvent((void *)&(histo->bins));
+                }
+                break;
             case DRM_EVENT_FLIP_COMPLETE:
                 vblank = (struct drm_event_vblank *)e;
                 user_data = (void *)(unsigned long)(vblank->user_data);
-
                 FlipHandler(drm_->fd(), vblank->sequence, vblank->tv_sec, vblank->tv_usec,
                             user_data);
                 break;
diff --git a/libhwc2.1/libdrmresource/include/drmdevice.h b/libhwc2.1/libdrmresource/include/drmdevice.h
index d3cf066..61a76c8 100644
--- a/libhwc2.1/libdrmresource/include/drmdevice.h
+++ b/libhwc2.1/libdrmresource/include/drmdevice.h
@@ -81,6 +81,9 @@
   void RegisterHotplugHandler(DrmEventHandler *handler) {
     event_listener_.RegisterHotplugHandler(handler);
   }
+  void RegisterHistogramHandler(DrmHistogramEventHandler *handler) {
+      event_listener_.RegisterHistogramHandler(handler);
+  }
 
  private:
   int UpdateObjectProperty(int id, int type, DrmProperty *property);
diff --git a/libhwc2.1/libdrmresource/include/drmeventlistener.h b/libhwc2.1/libdrmresource/include/drmeventlistener.h
index 8b04a73..7211519 100644
--- a/libhwc2.1/libdrmresource/include/drmeventlistener.h
+++ b/libhwc2.1/libdrmresource/include/drmeventlistener.h
@@ -36,6 +36,14 @@
   virtual void HandleEvent(uint64_t timestamp_us) = 0;
 };
 
+class DrmHistogramEventHandler {
+public:
+    DrmHistogramEventHandler() {}
+    virtual ~DrmHistogramEventHandler() {}
+
+    virtual void HandleHistogramEvent(void *) = 0;
+};
+
 class DrmTUIEventHandler {
  public:
   DrmTUIEventHandler() {
@@ -57,6 +65,8 @@
 
   void RegisterHotplugHandler(DrmEventHandler *handler);
   void UnRegisterHotplugHandler(DrmEventHandler *handler);
+  void RegisterHistogramHandler(DrmHistogramEventHandler *handler);
+  void UnRegisterHistogramHandler(DrmHistogramEventHandler *handler);
   void RegisterTUIHandler(DrmTUIEventHandler *handler);
   void UnRegisterTUIHandler(DrmTUIEventHandler *handler);
 
@@ -79,6 +89,7 @@
 
   DrmDevice *drm_;
   std::unique_ptr<DrmEventHandler> hotplug_handler_;
+  std::unique_ptr<DrmHistogramEventHandler> histogram_handler_;
   std::unique_ptr<DrmTUIEventHandler> tui_handler_;
 };
 }  // namespace android