1
0
This repository has been archived on 2024-11-10. You can view files and clone it, but cannot push or open issues or pull requests.
Lakka-rk322x/packages/mediacenter/kodi/patches/kodi-999.02-backport-pr19601-gbm-add-display-clock.patch
2022-03-03 17:25:16 +01:00

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;