[videodb] remove unused seasons table from episode_view
[xbmc.git] / xbmc / windowing / gbm / drm / DRMLegacy.cpp
blob4e9c3a6b9f3d3feb24e1675641e410938bd8633e
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "DRMLegacy.h"
11 #include "guilib/gui3d.h"
12 #include "settings/Settings.h"
13 #include "utils/log.h"
15 #include <errno.h>
16 #include <stdint.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
21 #include <drm_mode.h>
22 #include <fcntl.h>
23 #include <poll.h>
24 #include <unistd.h>
26 using namespace KODI::WINDOWING::GBM;
28 static int flip_happening = 0;
30 bool CDRMLegacy::SetVideoMode(const RESOLUTION_INFO& res, struct gbm_bo *bo)
32 struct drm_fb *drm_fb = DrmFbGetFromBo(bo);
34 auto ret = drmModeSetCrtc(m_fd, m_crtc->GetCrtcId(), drm_fb->fb_id, 0, 0,
35 m_connector->GetConnectorId(), 1, m_mode);
37 if(ret < 0)
39 CLog::Log(LOGERROR, "CDRMLegacy::{} - failed to set crtc mode: {}x{}{} @ {} Hz", __FUNCTION__,
40 m_mode->hdisplay, m_mode->vdisplay,
41 m_mode->flags & DRM_MODE_FLAG_INTERLACE ? "i" : "", m_mode->vrefresh);
43 return false;
46 CLog::Log(LOGDEBUG, "CDRMLegacy::{} - set crtc mode: {}x{}{} @ {} Hz", __FUNCTION__,
47 m_mode->hdisplay, m_mode->vdisplay, m_mode->flags & DRM_MODE_FLAG_INTERLACE ? "i" : "",
48 m_mode->vrefresh);
50 return true;
53 void CDRMLegacy::PageFlipHandler(int fd, unsigned int frame, unsigned int sec,
54 unsigned int usec, void *data)
56 (void) fd, (void) frame, (void) sec, (void) usec;
58 int *flip_happening = static_cast<int *>(data);
59 *flip_happening = 0;
62 bool CDRMLegacy::WaitingForFlip()
64 if (!flip_happening)
65 return false;
67 struct pollfd drm_fds =
69 m_fd,
70 POLLIN,
74 drmEventContext drm_evctx{};
75 drm_evctx.version = DRM_EVENT_CONTEXT_VERSION;
76 drm_evctx.page_flip_handler = PageFlipHandler;
78 while(flip_happening)
80 auto ret = poll(&drm_fds, 1, -1);
82 if(ret < 0)
83 return true;
85 if(drm_fds.revents & (POLLHUP | POLLERR))
86 return true;
88 if(drm_fds.revents & POLLIN)
89 drmHandleEvent(m_fd, &drm_evctx);
92 return false;
95 bool CDRMLegacy::QueueFlip(struct gbm_bo *bo)
97 struct drm_fb *drm_fb = DrmFbGetFromBo(bo);
99 auto ret = drmModePageFlip(m_fd, m_crtc->GetCrtcId(), drm_fb->fb_id, DRM_MODE_PAGE_FLIP_EVENT,
100 &flip_happening);
102 if(ret)
104 CLog::Log(LOGDEBUG, "CDRMLegacy::{} - failed to queue DRM page flip", __FUNCTION__);
105 return false;
108 return true;
111 void CDRMLegacy::FlipPage(struct gbm_bo* bo, bool rendered, bool videoLayer, bool async)
113 if (rendered || videoLayer)
115 flip_happening = QueueFlip(bo);
116 WaitingForFlip();
120 bool CDRMLegacy::InitDrm()
122 if (!CDRMUtils::OpenDrm(true))
123 return false;
125 if (!CDRMUtils::InitDrm())
126 return false;
128 CLog::Log(LOGDEBUG, "CDRMLegacy::{} - initialized legacy DRM", __FUNCTION__);
129 return true;
132 bool CDRMLegacy::SetActive(bool active)
134 if (!m_connector->SetProperty("DPMS", active ? DRM_MODE_DPMS_ON : DRM_MODE_DPMS_OFF))
136 CLog::Log(LOGDEBUG, "CDRMLegacy::{} - failed to set DPMS property", __FUNCTION__);
137 return false;
140 return true;