weston: add a patch to fix issues on the ccimx6

The ccimx6 uses the g2d weston renderer to avoid graphical glitches, but the
default renderer code doesn't handle suspend/resume cycles properly, causing
other issues (notably in the framerate and the desktop not showing 66% of the
time when resuming from suspend). Add a patch to mitigate these issues.

https://jira.digi.com/browse/DEL-7236

Signed-off-by: Gabriel Valcazar <gabriel.valcazar@digi.com>
This commit is contained in:
Gabriel Valcazar 2020-09-17 15:15:16 +02:00
parent 1fe0af568f
commit eda2f4177e
2 changed files with 84 additions and 0 deletions

View File

@ -0,0 +1,81 @@
From: Gabriel Valcazar <gabriel.valcazar@digi.com>
Date: Thu, 17 Sep 2020 13:16:04 +0200
Subject: [PATCH] libweston: g2d-renderer: try re-adjusting fb if the
FBIOPAN_DISPLAY ioctl fails
By default, the g2d renderer works with 3 buffers, and uses the FBIOPAN_DISPLAY
ioctl to have the kernel switch between them everytime the output has to be
shown. Because of this, when the renderer is initialized, it will increase the
framebuffer's yres_virtual parameter so it is 3 times the size of yres
(vertical resolution).
However, when the system goes through a suspend/resume iteration, the
framebuffer's yres_virtual parameter will change back to its original value,
causing the FBIOPAN_DISPLAY ioctl to fail when using the 2nd and 3rd buffers,
which is 2 out of 3 times whenever something changes in the output. This has
three direct effects:
* Constant "FBIOPAN_DISPLAY failed" messages in the weston log
* Choppy framerate (due to the renderer only being able to show 1/3 of the
total output frames)
* A 2/3 chance that the desktop will not show after resuming from suspend until
there's movement on the screen
To avoid this, whenever a FBIOPAN_DISPLAY ioctl fails, check if the
yres_virtual attribute read from the kernel is different from the one saved in
the renderer and, if so, update it once again and retry the ioctl. This adds
some additional overhead in case of a FBIOPAN_DISPLAY failure, but these have
only been observed in the specific suspend/resume scenario, not in an average
use case.
The only drawback to this workaround is that there's a 1/3 chance that the
display will go blank for a very small period of time when resuming from
suspend. This is due to the framebuffer being reconfigured and, although
undesireable, is much less bothersome than the original issue.
https://jira.digi.com/browse/DEL-7236
Signed-off-by: Gabriel Valcazar <gabriel.valcazar@digi.com>
---
libweston/renderer-g2d/g2d-renderer.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/libweston/renderer-g2d/g2d-renderer.c b/libweston/renderer-g2d/g2d-renderer.c
index 456190a3..cfc2e8b6 100644
--- a/libweston/renderer-g2d/g2d-renderer.c
+++ b/libweston/renderer-g2d/g2d-renderer.c
@@ -528,12 +528,34 @@ static void
g2d_flip_surface(struct weston_output *output)
{
struct g2d_output_state *go = get_output_state(output);
+ struct fb_var_screeninfo aux_varinfo;
go->fb_info.varinfo.yoffset = go->activebuffer * go->fb_info.y_resolution;
if(ioctl(go->fb_info.fb_fd, FBIOPAN_DISPLAY, &(go->fb_info.varinfo)) < 0)
{
- weston_log("FBIOPAN_DISPLAY Failed\n");
+ /* Check if yres_virtual has changed (it happens on suspend/resume) */
+ if (ioctl(go->fb_info.fb_fd, FBIOGET_VSCREENINFO, &aux_varinfo) < 0) {
+ weston_log("FBIOGET_VSCREENINFO Failed\n");
+ goto out;
+ }
+
+ /* If yres_virtual has changed, adjust it and try flipping the surface again */
+ if (aux_varinfo.yres_virtual != go->fb_info.varinfo.yres_virtual) {
+ aux_varinfo.yres_virtual = aux_varinfo.yres * go->nNumBuffers;
+ if (ioctl(go->fb_info.fb_fd, FBIOPUT_VSCREENINFO, &aux_varinfo) < 0) {
+ weston_log("FBIOPUT_VSCREENINFO Failed\n");
+ goto out;
+ }
+
+ if(ioctl(go->fb_info.fb_fd, FBIOPAN_DISPLAY, &(go->fb_info.varinfo)) < 0) {
+ weston_log("FBIOPAN_DISPLAY Failed\n");
+ }
+ } else {
+ weston_log("FBIOPAN_DISPLAY Failed\n");
+ }
}
+
+out:
go->activebuffer = (go->activebuffer + 1) % go->nNumBuffers;
}

View File

@ -0,0 +1,3 @@
# Copyright (C) 2020 Digi International.
SRC_URI_append_ccimx6sbc = " file://0001-libweston-g2d-renderer-try-re-adjusting-fb-if-the-FB.patch"