DSDisplayDeviceHWC: make event_fd and add it to fd handler. 06/242006/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 20 Aug 2020 23:34:03 +0000 (08:34 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Fri, 21 Aug 2020 10:06:05 +0000 (19:06 +0900)
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

src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.cpp
src/DSDisplayDevice/DSDisplayDeviceHWCWindowTDMTargetImpl.h

index 7008623..11ddef6 100644 (file)
 
 #include "DSDisplayDeviceHWCWindowTDMTargetImpl.h"
 #include "DSDebugLog.h"
+# include <sys/eventfd.h>
 
 namespace display_server
 {
+
 DSDisplayDeviceHWCWindowTDMTargetImpl::DSDisplayDeviceHWCWindowTDMTargetImpl(IDSDisplayDeviceHWC *deviceHWC, std::shared_ptr<IDSBufferQueue> 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;
+}
+
 }
index e5c08d0..46bdfe2 100644 (file)
@@ -30,6 +30,7 @@
 #include "DSWindow.h"
 #include "IDSBuffer.h"
 #include <tdm.h>
+#include <Ecore.h>
 
 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<IDSBufferQueue> __bufferQueue;
        std::shared_ptr<IDSBuffer> __buffer;
        std::shared_ptr<IDSBuffer> __presentBuffer;
        std::shared_ptr<IDSBuffer> __presentedBuffer;
+       int __eventFd;
+       Ecore_Fd_Handler *__ecoreFdHandler;
 };
 
 }