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