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.
11 #include "guilib/gui3d.h"
12 #include "settings/Settings.h"
13 #include "utils/log.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
);
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
);
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" : "",
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
);
62 bool CDRMLegacy::WaitingForFlip()
67 struct pollfd drm_fds
=
74 drmEventContext drm_evctx
{};
75 drm_evctx
.version
= DRM_EVENT_CONTEXT_VERSION
;
76 drm_evctx
.page_flip_handler
= PageFlipHandler
;
80 auto ret
= poll(&drm_fds
, 1, -1);
85 if(drm_fds
.revents
& (POLLHUP
| POLLERR
))
88 if(drm_fds
.revents
& POLLIN
)
89 drmHandleEvent(m_fd
, &drm_evctx
);
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
,
104 CLog::Log(LOGDEBUG
, "CDRMLegacy::{} - failed to queue DRM page flip", __FUNCTION__
);
111 void CDRMLegacy::FlipPage(struct gbm_bo
* bo
, bool rendered
, bool videoLayer
, bool async
)
113 if (rendered
|| videoLayer
)
115 flip_happening
= QueueFlip(bo
);
120 bool CDRMLegacy::InitDrm()
122 if (!CDRMUtils::OpenDrm(true))
125 if (!CDRMUtils::InitDrm())
128 CLog::Log(LOGDEBUG
, "CDRMLegacy::{} - initialized legacy DRM", __FUNCTION__
);
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__
);