235 lines
6.4 KiB
Diff
235 lines
6.4 KiB
Diff
From 9125b447a5ef56a2882ecf8f31bae5a2987ea037 Mon Sep 17 00:00:00 2001
|
|
From: popcornmix <popcornmix@gmail.com>
|
|
Date: Tue, 6 Apr 2021 16:58:06 +0100
|
|
Subject: [PATCH 1/2] Revert "windowing/gbm: hide and disable setting Use
|
|
Display As Clock"
|
|
|
|
This reverts commit cacf60139cd5aa334b43defc04d15356cb1aa4da.
|
|
---
|
|
xbmc/windowing/gbm/WinSystemGbm.cpp | 7 -------
|
|
1 file changed, 7 deletions(-)
|
|
|
|
--- a/xbmc/windowing/gbm/WinSystemGbm.cpp
|
|
+++ b/xbmc/windowing/gbm/WinSystemGbm.cpp
|
|
@@ -11,6 +11,7 @@
|
|
#include "GBMDPMSSupport.h"
|
|
#include "OptionalsReg.h"
|
|
#include "ServiceBroker.h"
|
|
+#include "VideoSyncGbm.h"
|
|
#include "drm/DRMAtomic.h"
|
|
#include "drm/DRMLegacy.h"
|
|
#include "drm/OffScreenModeSetting.h"
|
|
@@ -93,13 +94,6 @@ bool CWinSystemGbm::InitWindowSystem()
|
|
if (setting)
|
|
setting->SetVisible(true);
|
|
|
|
- setting = settings->GetSetting(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK);
|
|
- if (setting)
|
|
- {
|
|
- setting->SetVisible(false);
|
|
- settings->SetBool(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK, false);
|
|
- }
|
|
-
|
|
CLog::Log(LOGDEBUG, "CWinSystemGbm::%s - initialized DRM", __FUNCTION__);
|
|
return CWinSystemBase::InitWindowSystem();
|
|
}
|
|
@@ -271,3 +265,8 @@ void CWinSystemGbm::OnLostDevice()
|
|
for (auto resource : m_resources)
|
|
resource->OnLostDisplay();
|
|
}
|
|
+
|
|
+std::unique_ptr<CVideoSync> CWinSystemGbm::GetVideoSync(void* clock)
|
|
+{
|
|
+ return std::make_unique<CVideoSyncGbm>(clock);
|
|
+}
|
|
--- a/xbmc/windowing/gbm/CMakeLists.txt
|
|
+++ b/xbmc/windowing/gbm/CMakeLists.txt
|
|
@@ -2,12 +2,14 @@ add_subdirectory(drm)
|
|
|
|
set(SOURCES OptionalsReg.cpp
|
|
WinSystemGbm.cpp
|
|
+ VideoSyncGbm.cpp
|
|
GBMUtils.cpp
|
|
WinSystemGbmEGLContext.cpp
|
|
GBMDPMSSupport.cpp)
|
|
|
|
set(HEADERS OptionalsReg.h
|
|
WinSystemGbm.h
|
|
+ VideoSyncGbm.h
|
|
GBMUtils.h
|
|
WinSystemGbmEGLContext.h
|
|
GBMDPMSSupport.h)
|
|
--- /dev/null
|
|
+++ b/xbmc/windowing/gbm/VideoSyncGbm.cpp
|
|
@@ -0,0 +1,123 @@
|
|
+/*
|
|
+ * Copyright (C) 2005-2021 Team Kodi
|
|
+ * This file is part of Kodi - https://kodi.tv
|
|
+ *
|
|
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
|
+ * See LICENSES/README.md for more information.
|
|
+ */
|
|
+
|
|
+#include "VideoSyncGbm.h"
|
|
+
|
|
+#include "ServiceBroker.h"
|
|
+#include "threads/Thread.h"
|
|
+#include "utils/TimeUtils.h"
|
|
+#include "utils/log.h"
|
|
+#include "windowing/GraphicContext.h"
|
|
+#include "windowing/WinSystem.h"
|
|
+#include "xbmc/windowing/gbm/WinSystemGbm.h"
|
|
+#include "xf86drm.h"
|
|
+#include "xf86drmMode.h"
|
|
+
|
|
+#include <assert.h>
|
|
+#include <stdint.h>
|
|
+#include <stdlib.h>
|
|
+
|
|
+bool CVideoSyncGbm::Setup(PUPDATECLOCK func)
|
|
+{
|
|
+ UpdateClock = func;
|
|
+ m_abort = false;
|
|
+ CServiceBroker::GetWinSystem()->Register(this);
|
|
+ CLog::Log(LOGDEBUG, "CVideoSyncGbm::{} setting up", __FUNCTION__);
|
|
+
|
|
+ auto winSystem =
|
|
+ dynamic_cast<KODI::WINDOWING::GBM::CWinSystemGbm*>(CServiceBroker::GetWinSystem());
|
|
+ if (!winSystem)
|
|
+ {
|
|
+ CLog::Log(LOGWARNING, "CVideoSyncGbm::{}: failed to get winSystem", __FUNCTION__);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ auto drm = winSystem->GetDrm();
|
|
+ if (!drm)
|
|
+ {
|
|
+ CLog::Log(LOGWARNING, "CVideoSyncGbm::{}: failed to get drm", __FUNCTION__);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ auto crtc = drm->GetCrtc();
|
|
+ if (!crtc)
|
|
+ {
|
|
+ CLog::Log(LOGWARNING, "CVideoSyncGbm::{}: failed to get crtc", __FUNCTION__);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ uint64_t ns = 0;
|
|
+ m_crtcId = crtc->GetCrtcId();
|
|
+ m_fd = drm->GetFileDescriptor();
|
|
+ int s = drmCrtcGetSequence(m_fd, m_crtcId, &m_sequence, &ns);
|
|
+ m_offset = CurrentHostCounter() - ns;
|
|
+ if (s != 0)
|
|
+ {
|
|
+ CLog::Log(LOGWARNING, "CVideoSyncGbm::{}: drmCrtcGetSequence failed ({})", __FUNCTION__, s);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ CLog::Log(LOGINFO, "CVideoSyncGbm::{}: opened (fd:{} crtc:{} seq:{} ns:{}:{})", __FUNCTION__,
|
|
+ m_fd, m_crtcId, m_sequence, ns, m_offset + ns);
|
|
+ return true;
|
|
+}
|
|
+
|
|
+void CVideoSyncGbm::Run(CEvent& stopEvent)
|
|
+{
|
|
+ /* This shouldn't be very busy and timing is important so increase priority */
|
|
+ CThread::GetCurrentThread()->SetPriority(CThread::GetCurrentThread()->GetPriority() + 1);
|
|
+
|
|
+ if (m_fd < 0)
|
|
+ {
|
|
+ CLog::Log(LOGWARNING, "CVideoSyncGbm::{}: failed to open device ({})", __FUNCTION__, m_fd);
|
|
+ return;
|
|
+ }
|
|
+ CLog::Log(LOGDEBUG, "CVideoSyncGbm::{}: started {}", __FUNCTION__, m_fd);
|
|
+
|
|
+ while (!stopEvent.Signaled() && !m_abort)
|
|
+ {
|
|
+ uint64_t sequence = 0, ns = 0;
|
|
+ usleep(1000);
|
|
+ int s = drmCrtcGetSequence(m_fd, m_crtcId, &sequence, &ns);
|
|
+ if (s != 0)
|
|
+ {
|
|
+ CLog::Log(LOGWARNING, "CVideoSyncGbm::{}: drmCrtcGetSequence failed ({})", __FUNCTION__, s);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (sequence == m_sequence)
|
|
+ continue;
|
|
+
|
|
+ UpdateClock(sequence - m_sequence, m_offset + ns, m_refClock);
|
|
+ m_sequence = sequence;
|
|
+ }
|
|
+}
|
|
+
|
|
+void CVideoSyncGbm::Cleanup()
|
|
+{
|
|
+ CLog::Log(LOGDEBUG, "CVideoSyncGbm::{}: cleaning up", __FUNCTION__);
|
|
+ CServiceBroker::GetWinSystem()->Unregister(this);
|
|
+}
|
|
+
|
|
+float CVideoSyncGbm::GetFps()
|
|
+{
|
|
+ m_fps = CServiceBroker::GetWinSystem()->GetGfxContext().GetFPS();
|
|
+ CLog::Log(LOGDEBUG, "CVideoSyncGbm::{}: fps:{}", __FUNCTION__, m_fps);
|
|
+ return m_fps;
|
|
+}
|
|
+
|
|
+void CVideoSyncGbm::OnResetDisplay()
|
|
+{
|
|
+ m_abort = true;
|
|
+}
|
|
+
|
|
+void CVideoSyncGbm::RefreshChanged()
|
|
+{
|
|
+ if (m_fps != CServiceBroker::GetWinSystem()->GetGfxContext().GetFPS())
|
|
+ m_abort = true;
|
|
+}
|
|
--- /dev/null
|
|
+++ b/xbmc/windowing/gbm/VideoSyncGbm.h
|
|
@@ -0,0 +1,33 @@
|
|
+/*
|
|
+ * Copyright (C) 2005-2021 Team Kodi
|
|
+ * This file is part of Kodi - https://kodi.tv
|
|
+ *
|
|
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
|
+ * See LICENSES/README.md for more information.
|
|
+ */
|
|
+
|
|
+#pragma once
|
|
+
|
|
+#include "guilib/DispResource.h"
|
|
+#include "windowing/VideoSync.h"
|
|
+
|
|
+class CVideoSyncGbm : public CVideoSync, IDispResource
|
|
+{
|
|
+public:
|
|
+ explicit CVideoSyncGbm(void* clock) : CVideoSync(clock){};
|
|
+ CVideoSyncGbm() = delete;
|
|
+ ~CVideoSyncGbm() override = default;
|
|
+ bool Setup(PUPDATECLOCK func) override;
|
|
+ void Run(CEvent& stopEvent) override;
|
|
+ void Cleanup() override;
|
|
+ float GetFps() override;
|
|
+ void OnResetDisplay() override;
|
|
+ void RefreshChanged() override;
|
|
+
|
|
+private:
|
|
+ int m_fd = -1;
|
|
+ uint32_t m_crtcId = 0;
|
|
+ uint64_t m_sequence = 0;
|
|
+ uint64_t m_offset = 0;
|
|
+ volatile bool m_abort;
|
|
+};
|
|
--- a/xbmc/windowing/gbm/WinSystemGbm.h
|
|
+++ b/xbmc/windowing/gbm/WinSystemGbm.h
|
|
@@ -68,6 +68,8 @@ public:
|
|
protected:
|
|
void OnLostDevice();
|
|
|
|
+ std::unique_ptr<CVideoSync> GetVideoSync(void* clock) override;
|
|
+
|
|
std::shared_ptr<CDRMUtils> m_DRM;
|
|
std::unique_ptr<CGBMUtils> m_GBM;
|
|
std::shared_ptr<CVideoLayerBridge> m_videoLayerBridge;
|