mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 13:16:41 +00:00
projects/WeTek_Hub: render GUI at 1080p for 4K output
Issues with previous set of patches: - at some 4K output resolutions GUI was rendered at 1080p and covered only 1/4 of screen due to not changed iWidth and iHeight parameters - rendering GUI at 4K while playing high-bitrate 4K video caused stuttering Changes introduced in this patch: - rewrite platform_init to be aware of 4K resolutions passed by uboot in "hdmimode" parameter - always set virtual framebuffer resolution to 1920x2160 (like Kodi does) - remove Kodi patch to render GUI at 4K - add Kodi patch (https://github.com/xbmc/xbmc/pull/10332) to upscale GUI when screen resolution is 4K
This commit is contained in:
parent
ed07827ee0
commit
7f2ece289c
@ -17,7 +17,7 @@
|
|||||||
# along with OpenELEC. If not, see <http://www.gnu.org/licenses/>.
|
# along with OpenELEC. If not, see <http://www.gnu.org/licenses/>.
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
hdmimode=720p
|
hdmimode=1080p60hz
|
||||||
|
|
||||||
# Parse command line arguments
|
# Parse command line arguments
|
||||||
for arg in $(cat /proc/cmdline); do
|
for arg in $(cat /proc/cmdline); do
|
||||||
@ -37,8 +37,6 @@ for arg in $(cat /proc/cmdline); do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
# echo "$hdmimode" > /sys/class/display/mode
|
|
||||||
|
|
||||||
# Enable first framebuffer
|
# Enable first framebuffer
|
||||||
echo 0 > /sys/class/graphics/fb0/blank
|
echo 0 > /sys/class/graphics/fb0/blank
|
||||||
|
|
||||||
@ -47,18 +45,31 @@ echo 1 > /sys/class/graphics/fb1/blank
|
|||||||
|
|
||||||
# Disable framebuffer scaling
|
# Disable framebuffer scaling
|
||||||
echo 0 > /sys/class/graphics/fb0/free_scale
|
echo 0 > /sys/class/graphics/fb0/free_scale
|
||||||
|
echo 0 > /sys/class/graphics/fb1/free_scale
|
||||||
|
|
||||||
# set initial video state
|
# set initial video state
|
||||||
echo 1 > /sys/class/video/disable_video
|
echo 1 > /sys/class/video/disable_video
|
||||||
|
|
||||||
# Set framebuffer geometry to match the resolution
|
# Set framebuffer geometry to match the resolution
|
||||||
case "$hdmimode" in
|
case $hdmimode in
|
||||||
720*)
|
480*) X=720 Y=480 ;;
|
||||||
fbset -fb /dev/fb0 -g 1280 720 1920 2160 32
|
576*) X=720 Y=576 ;;
|
||||||
;;
|
720p*) X=1280 Y=720 ;;
|
||||||
1080*)
|
*) X=1920 Y=1080 ;;
|
||||||
fbset -fb /dev/fb0 -g 1920 1080 1920 2160 32
|
esac
|
||||||
;;
|
|
||||||
|
fbset -fb /dev/fb0 -g $X $Y 1920 2160 32
|
||||||
|
fbset -fb /dev/fb1 -g 32 32 32 32 32
|
||||||
|
|
||||||
|
# Enable scaling for 4K output
|
||||||
|
case $hdmimode in
|
||||||
|
4k*|smpte*|2160*)
|
||||||
|
echo 0 0 1919 1079 > /sys/class/graphics/fb0/free_scale_axis
|
||||||
|
echo 0 0 3839 2159 > /sys/class/graphics/fb0/window_axis
|
||||||
|
echo 1920 > /sys/class/graphics/fb0/scale_width
|
||||||
|
echo 1080 > /sys/class/graphics/fb0/scale_height
|
||||||
|
echo 0x10001 > /sys/class/graphics/fb0/free_scale
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Include deinterlacer into default VFM map
|
# Include deinterlacer into default VFM map
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
From a348ef744e260f76e1e4e1299f9181ae40352eb5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: kszaq <kszaquitto@gmail.com>
|
||||||
|
Date: Mon, 22 Aug 2016 06:55:00 +0200
|
||||||
|
Subject: [PATCH] EGLNativeTypeAmlogic: Enable GUI free_scale when framebuffer
|
||||||
|
size is less than output resolution
|
||||||
|
|
||||||
|
For 4K output Kodi renders GUI at 1080p and this results in GUI covering only 1/4 screen.
|
||||||
|
This patch enables hardware upscaling if output resolution is greater than rendered GUI
|
||||||
|
resolution.
|
||||||
|
---
|
||||||
|
xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp | 33 ++++++++++++++++++++++++++---
|
||||||
|
xbmc/windowing/egl/EGLNativeTypeAmlogic.h | 2 ++
|
||||||
|
2 files changed, 32 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
index 88cd385..3cbb604 100644
|
||||||
|
--- a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
+++ b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
@@ -133,6 +133,8 @@ bool CEGLNativeTypeAmlogic::GetNativeResolution(RESOLUTION_INFO *res) const
|
||||||
|
|
||||||
|
bool CEGLNativeTypeAmlogic::SetNativeResolution(const RESOLUTION_INFO &res)
|
||||||
|
{
|
||||||
|
+ bool result = false;
|
||||||
|
+
|
||||||
|
#if defined(_FBDEV_WINDOW_H_)
|
||||||
|
if (m_nativeWindow)
|
||||||
|
{
|
||||||
|
@@ -144,10 +146,12 @@ bool CEGLNativeTypeAmlogic::SetNativeResolution(const RESOLUTION_INFO &res)
|
||||||
|
// Don't set the same mode as current
|
||||||
|
std::string mode;
|
||||||
|
SysfsUtils::GetString("/sys/class/display/mode", mode);
|
||||||
|
- if (res.strId == mode)
|
||||||
|
- return false;
|
||||||
|
+ if (res.strId != mode)
|
||||||
|
+ result = SetDisplayResolution(res.strId.c_str());
|
||||||
|
+
|
||||||
|
+ DealWithScale(res);
|
||||||
|
|
||||||
|
- return SetDisplayResolution(res.strId.c_str());
|
||||||
|
+ return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CEGLNativeTypeAmlogic::ProbeResolutions(std::vector<RESOLUTION_INFO> &resolutions)
|
||||||
|
@@ -220,6 +224,29 @@ void CEGLNativeTypeAmlogic::SetupVideoScaling(const char *mode)
|
||||||
|
SysfsUtils::SetInt("/sys/class/graphics/fb0/blank", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CEGLNativeTypeAmlogic::DealWithScale(const RESOLUTION_INFO &res)
|
||||||
|
+{
|
||||||
|
+ if (res.iScreenWidth > res.iWidth && res.iScreenHeight > res.iHeight)
|
||||||
|
+ EnableFreeScale(res);
|
||||||
|
+ else
|
||||||
|
+ DisableFreeScale();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void CEGLNativeTypeAmlogic::EnableFreeScale(const RESOLUTION_INFO &res)
|
||||||
|
+{
|
||||||
|
+ char fsaxis_str[256] = {0};
|
||||||
|
+ sprintf(fsaxis_str, "0 0 %d %d", res.iWidth-1, res.iHeight-1);
|
||||||
|
+ char waxis_str[256] = {0};
|
||||||
|
+ sprintf(waxis_str, "0 0 %d %d", res.iScreenWidth-1, res.iScreenHeight-1);
|
||||||
|
+
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 0);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb0/free_scale_axis", fsaxis_str);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb0/window_axis", waxis_str);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_width", res.iWidth);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_height", res.iHeight);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 0x10001);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void CEGLNativeTypeAmlogic::DisableFreeScale()
|
||||||
|
{
|
||||||
|
// turn off frame buffer freescale
|
||||||
|
diff --git a/xbmc/windowing/egl/EGLNativeTypeAmlogic.h b/xbmc/windowing/egl/EGLNativeTypeAmlogic.h
|
||||||
|
index cfb33ca..96aa6f7 100644
|
||||||
|
--- a/xbmc/windowing/egl/EGLNativeTypeAmlogic.h
|
||||||
|
+++ b/xbmc/windowing/egl/EGLNativeTypeAmlogic.h
|
||||||
|
@@ -53,6 +53,8 @@ public:
|
||||||
|
protected:
|
||||||
|
bool SetDisplayResolution(const char *resolution);
|
||||||
|
void SetupVideoScaling(const char *mode);
|
||||||
|
+ void DealWithScale(const RESOLUTION_INFO &res);
|
||||||
|
+ void EnableFreeScale(const RESOLUTION_INFO &res);
|
||||||
|
void DisableFreeScale();
|
||||||
|
|
||||||
|
private:
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -1,124 +0,0 @@
|
|||||||
From 46aab0b0856eeaa855c430ddd36ac97203afa43b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alex Deryskyba <alex@codesnake.com>
|
|
||||||
Date: Wed, 1 Jul 2015 23:37:11 +0200
|
|
||||||
Subject: [PATCH 3/5] [aml] Add support for 4k resolutions
|
|
||||||
|
|
||||||
---
|
|
||||||
xbmc/utils/AMLUtils.cpp | 16 ++++++++--------
|
|
||||||
xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp | 23 +++++++++++++++++++----
|
|
||||||
xbmc/windowing/egl/EGLNativeTypeAmlogic.h | 2 ++
|
|
||||||
3 files changed, 29 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp
|
|
||||||
index 80fb453..65286de 100644
|
|
||||||
--- a/xbmc/utils/AMLUtils.cpp
|
|
||||||
+++ b/xbmc/utils/AMLUtils.cpp
|
|
||||||
@@ -463,8 +463,8 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
|
|
||||||
}
|
|
||||||
else if (StringUtils::EqualsNoCase(fromMode, "4k2ksmpte") || StringUtils::EqualsNoCase(fromMode, "smpte24hz"))
|
|
||||||
{
|
|
||||||
- res->iWidth = 1920;
|
|
||||||
- res->iHeight= 1080;
|
|
||||||
+ res->iWidth = 4096;
|
|
||||||
+ res->iHeight= 2160;
|
|
||||||
res->iScreenWidth = 4096;
|
|
||||||
res->iScreenHeight= 2160;
|
|
||||||
res->fRefreshRate = 24;
|
|
||||||
@@ -481,8 +481,8 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
|
|
||||||
}
|
|
||||||
else if (StringUtils::EqualsNoCase(fromMode, "4k2k24hz") || StringUtils::EqualsNoCase(fromMode, "2160p24hz"))
|
|
||||||
{
|
|
||||||
- res->iWidth = 1920;
|
|
||||||
- res->iHeight= 1080;
|
|
||||||
+ res->iWidth = 3840;
|
|
||||||
+ res->iHeight= 2160;
|
|
||||||
res->iScreenWidth = 3840;
|
|
||||||
res->iScreenHeight= 2160;
|
|
||||||
res->fRefreshRate = 24;
|
|
||||||
@@ -490,8 +490,8 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
|
|
||||||
}
|
|
||||||
else if (StringUtils::EqualsNoCase(fromMode, "4k2k25hz") || StringUtils::EqualsNoCase(fromMode, "2160p25hz"))
|
|
||||||
{
|
|
||||||
- res->iWidth = 1920;
|
|
||||||
- res->iHeight= 1080;
|
|
||||||
+ res->iWidth = 3840;
|
|
||||||
+ res->iHeight= 2160;
|
|
||||||
res->iScreenWidth = 3840;
|
|
||||||
res->iScreenHeight= 2160;
|
|
||||||
res->fRefreshRate = 25;
|
|
||||||
@@ -508,8 +508,8 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
|
|
||||||
}
|
|
||||||
else if (StringUtils::EqualsNoCase(fromMode, "4k2k30hz") || StringUtils::EqualsNoCase(fromMode, "2160p30hz"))
|
|
||||||
{
|
|
||||||
- res->iWidth = 1920;
|
|
||||||
- res->iHeight= 1080;
|
|
||||||
+ res->iWidth = 3840;
|
|
||||||
+ res->iHeight= 2160;
|
|
||||||
res->iScreenWidth = 3840;
|
|
||||||
res->iScreenHeight= 2160;
|
|
||||||
res->fRefreshRate = 30;
|
|
||||||
diff --git a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
|
||||||
index 88cd385..3bfb0c6 100644
|
|
||||||
--- a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
|
||||||
+++ b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
|
||||||
@@ -64,7 +64,22 @@ void CEGLNativeTypeAmlogic::Initialize()
|
|
||||||
{
|
|
||||||
aml_permissions();
|
|
||||||
DisableFreeScale();
|
|
||||||
+ GetMaxResolution(m_maxResolution);
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+void CEGLNativeTypeAmlogic::GetMaxResolution(RESOLUTION_INFO &maxResolution)
|
|
||||||
+{
|
|
||||||
+ std::vector<RESOLUTION_INFO> resolutions;
|
|
||||||
+ ProbeResolutions(resolutions);
|
|
||||||
+
|
|
||||||
+ maxResolution = {0};
|
|
||||||
+ for (size_t i = 0; i < resolutions.size(); i++)
|
|
||||||
+ {
|
|
||||||
+ if (resolutions[i].iScreenWidth > maxResolution.iScreenWidth || resolutions[i].iScreenHeight > maxResolution.iScreenHeight)
|
|
||||||
+ maxResolution = resolutions[i];
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void CEGLNativeTypeAmlogic::Destroy()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
@@ -83,8 +98,8 @@ bool CEGLNativeTypeAmlogic::CreateNativeWindow()
|
|
||||||
if (!nativeWindow)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
- nativeWindow->width = 1920;
|
|
||||||
- nativeWindow->height = 1080;
|
|
||||||
+ nativeWindow->width = m_maxResolution.iScreenWidth;
|
|
||||||
+ nativeWindow->height = m_maxResolution.iScreenHeight;
|
|
||||||
m_nativeWindow = nativeWindow;
|
|
||||||
|
|
||||||
SetFramebufferResolution(nativeWindow->width, nativeWindow->height);
|
|
||||||
@@ -244,8 +259,8 @@ void CEGLNativeTypeAmlogic::SetFramebufferResolution(int width, int height) cons
|
|
||||||
{
|
|
||||||
vinfo.xres = width;
|
|
||||||
vinfo.yres = height;
|
|
||||||
- vinfo.xres_virtual = 1920;
|
|
||||||
- vinfo.yres_virtual = 2160;
|
|
||||||
+ vinfo.xres_virtual = m_maxResolution.iScreenWidth;
|
|
||||||
+ vinfo.yres_virtual = m_maxResolution.iScreenHeight * 2;
|
|
||||||
vinfo.bits_per_pixel = 32;
|
|
||||||
vinfo.activate = FB_ACTIVATE_ALL;
|
|
||||||
ioctl(fd0, FBIOPUT_VSCREENINFO, &vinfo);
|
|
||||||
diff --git a/xbmc/windowing/egl/EGLNativeTypeAmlogic.h b/xbmc/windowing/egl/EGLNativeTypeAmlogic.h
|
|
||||||
index cfb33ca..cf60134 100644
|
|
||||||
--- a/xbmc/windowing/egl/EGLNativeTypeAmlogic.h
|
|
||||||
+++ b/xbmc/windowing/egl/EGLNativeTypeAmlogic.h
|
|
||||||
@@ -58,6 +58,8 @@ protected:
|
|
||||||
private:
|
|
||||||
void SetFramebufferResolution(const RESOLUTION_INFO &res) const;
|
|
||||||
void SetFramebufferResolution(int width, int height) const;
|
|
||||||
+ void GetMaxResolution(RESOLUTION_INFO &maxResolution);
|
|
||||||
|
|
||||||
std::string m_framebuffer_name;
|
|
||||||
+ RESOLUTION_INFO m_maxResolution;
|
|
||||||
};
|
|
||||||
--
|
|
||||||
1.7.10.4
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
|||||||
|
diff --git a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
index cad677a..ad7be0b 100644
|
||||||
|
--- a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
+++ b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
@@ -178,7 +178,7 @@ bool CEGLNativeTypeAmlogic::GetPreferredResolution(RESOLUTION_INFO *res) const
|
||||||
|
if (!GetNativeResolution(res))
|
||||||
|
{
|
||||||
|
// punt to 720p if we get nothing
|
||||||
|
- aml_mode_to_resolution("720p", res);
|
||||||
|
+ aml_mode_to_resolution("720p60hz", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
@ -1,22 +0,0 @@
|
|||||||
diff --git a/arch/arm64/boot/dts/amlogic/gxbb_p200_1G_wetek_hub.dts b/arch/arm64/boot/dts/amlogic/gxbb_p200_1G_wetek_hub.dts
|
|
||||||
index 26d381c..e8573af 100644
|
|
||||||
--- a/arch/arm64/boot/dts/amlogic/gxbb_p200_1G_wetek_hub.dts
|
|
||||||
+++ b/arch/arm64/boot/dts/amlogic/gxbb_p200_1G_wetek_hub.dts
|
|
||||||
@@ -57,7 +57,7 @@
|
|
||||||
};
|
|
||||||
fb_reserved:linux,meson-fb {
|
|
||||||
compatible = "amlogic, fb-memory";
|
|
||||||
- size = <0x0 0x1900000>;
|
|
||||||
+ size = <0x0 0x4480000>;
|
|
||||||
no-map;
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@
|
|
||||||
interrupts = <0 3 1
|
|
||||||
0 89 1>;
|
|
||||||
interrupt-names = "viu-vsync", "rdma";
|
|
||||||
- mem_size = <0x01800000 0x00100000>; /* fb0/fb1 memory size */
|
|
||||||
+ mem_size = <0x04380000 0x00100000>; /* fb0/fb1 memory size */
|
|
||||||
display_mode_default = "1080p60hz";
|
|
||||||
scale_mode = <1>; /** 0:VPU free scale 1:OSD free scale 2:OSD super scale */
|
|
||||||
display_size_default = <1920 1080 1920 3240 32>; //1920*1080*4*3 = 0x17BB000
|
|
Loading…
x
Reference in New Issue
Block a user