From: SooChan Lim Date: Thu, 20 Aug 2020 23:34:03 +0000 (+0900) Subject: DSDisplayDeviceHWC: make event_fd and add it to fd handler. X-Git-Tag: accepted/tizen/unified/20200827.105812~77 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce8e39625c874ece64d001fc3956f478efd0e00b;p=platform%2Fcore%2Fuifw%2Flibds.git DSDisplayDeviceHWC: make event_fd and add it to fd handler. Make a event_fd in order to notify the acquirable buffer from buffer queue. The process needs to wake up when the buffer queue prepare the acquirable buffer. In order that, DSDisplayDeviceHWCWindowTDMTargetImpl create the event fd and track it to wake up the process. Change-Id: I8e650ed45583abda87e9f8ebd86a6ac2e0784628 --- diff --git a/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.cpp b/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.cpp index 7008623..11ddef6 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.cpp +++ b/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.cpp @@ -23,15 +23,24 @@ #include "DSDisplayDeviceHWCWindowTDMTargetImpl.h" #include "DSDebugLog.h" +# include namespace display_server { + DSDisplayDeviceHWCWindowTDMTargetImpl::DSDisplayDeviceHWCWindowTDMTargetImpl(IDSDisplayDeviceHWC *deviceHWC, std::shared_ptr bufferQueue) : __deviceHWC(deviceHWC), - __bufferQueue(bufferQueue) -{} + __bufferQueue(bufferQueue), + __ecoreFdHandler(nullptr) +{ + __eventFd = eventfd(0, EFD_NONBLOCK); + __ecoreFdHandler = ecore_main_fd_handler_add(__eventFd, ECORE_FD_READ, __onFdHandler, this, NULL, NULL); +} + DSDisplayDeviceHWCWindowTDMTargetImpl::~DSDisplayDeviceHWCWindowTDMTargetImpl() { + ecore_main_fd_handler_del(__ecoreFdHandler); + close(__eventFd); } void DSDisplayDeviceHWCWindowTDMTargetImpl::updateFrame(bool &update) @@ -72,4 +81,21 @@ void DSDisplayDeviceHWCWindowTDMTargetImpl::onPresentFrameDone() __presentedBuffer = std::move(__presentBuffer); } +Eina_Bool DSDisplayDeviceHWCWindowTDMTargetImpl::__onFdHandler(void *data, Ecore_Fd_Handler *hdlr) +{ + int len; + int fd; + char buffer[64]; + + fd = ecore_main_fd_handler_fd_get(hdlr); + if (fd < 0) + return ECORE_CALLBACK_RENEW; + + len = read(fd, buffer, sizeof(buffer)); + if (len == -1) + DSLOG_WRN("DSDisplayDeviceHWCWindowTDMTargetImpl", "failed to read buffer from event fd:%m"); + + return ECORE_CALLBACK_RENEW; +} + } diff --git a/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.h b/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.h index e5c08d0..46bdfe2 100644 --- a/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.h +++ b/src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.h @@ -30,6 +30,7 @@ #include "DSWindow.h" #include "IDSBuffer.h" #include +#include namespace display_server { @@ -44,11 +45,15 @@ public: void onPresentFrameDone() override; private: + static Eina_Bool __onFdHandler(void *data, Ecore_Fd_Handler *hdlr); + IDSDisplayDeviceHWC *__deviceHWC; std::shared_ptr __bufferQueue; std::shared_ptr __buffer; std::shared_ptr __presentBuffer; std::shared_ptr __presentedBuffer; + int __eventFd; + Ecore_Fd_Handler *__ecoreFdHandler; }; }