#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)
__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;
+}
+
}
#include "DSWindow.h"
#include "IDSBuffer.h"
#include <tdm.h>
+#include <Ecore.h>
namespace display_server
{
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;
};
}