meta-raspberrypi/recipes-graphics/userland/files/0013-Implement-triple-buffering-for-wayland.patch
Martin Jansa 195c7d59bc *.patch: add Upstream-Status to all patches
There is new patch-status QA check in oe-core:
https://git.openembedded.org/openembedded-core/commit/?id=76a685bfcf927593eac67157762a53259089ea8a

This is temporary work around just to hide _many_ warnings from
optional patch-status (if you add it to WARN_QA).

This just added
Upstream-Status: Pending
everywhere without actually investigating what's the proper status.

This is just to hide current QA warnings and to catch new .patch files being
added without Upstream-Status, but the number of Pending patches is now terrible:
Patches in Pending state: 41 (57%)

With recent change to enable patch-status not only for all .patch
files in oe-core, but for all recipes from oe-core:
https://git.openembedded.org/openembedded-core/commit/?id=61a881fdbe8b5a21c6276b8a5d06cc30486b1eb3
this causes bluez5 do_patch failures as reported in:
https://lists.openembedded.org/g/openembedded-core/message/183177

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
2023-06-22 00:04:40 +01:00

90 lines
3.4 KiB
Diff

From ffdcdf7605f4f266b408cf161e7c76dab54d689b Mon Sep 17 00:00:00 2001
From: Jeff Wannamaker <jeff_wannamaker@cable.comcast.com>
Date: Thu, 19 Jan 2017 18:56:07 +0000
Subject: [PATCH] Implement triple buffering for wayland
Change from double to triple buffering for wayland.
This enables higher frame rates without tearing artifacts
by allowing both the glFinish and the buffer release
interlock to operate without pushing the frame period
to two vertical intervals
Signed-off-by: Jeff Wannamaker <jeff_wannamaker@cable.comcast.com>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
Upstream-Status: Pending
interface/khronos/egl/egl_client.c | 3 ++-
interface/khronos/egl/egl_client_surface.c | 8 ++++++++
interface/khronos/egl/egl_client_surface.h | 11 +++++++++++
3 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c
index 13a110c..0380274 100644
--- a/interface/khronos/egl/egl_client.c
+++ b/interface/khronos/egl/egl_client.c
@@ -2323,7 +2323,8 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf)
buffer_temp = surface->front_wl_buffer;
surface->front_wl_buffer = surface->back_wl_buffer;
- surface->back_wl_buffer = buffer_temp;
+ surface->back_wl_buffer = surface->middle_wl_buffer;
+ surface->middle_wl_buffer = buffer_temp;
configid = egl_config_to_id(surface->config);
color = egl_config_get_color_format(configid);
diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c
index 9a9582c..10b3b04 100644
--- a/interface/khronos/egl/egl_client_surface.c
+++ b/interface/khronos/egl/egl_client_surface.c
@@ -402,12 +402,14 @@ EGL_SURFACE_T *egl_surface_create(
if (type == WINDOW && wl_display) {
surface->wl_egl_window = (struct wl_egl_window*)win;
surface->front_wl_buffer = NULL;
+ surface->middle_wl_buffer = NULL;
surface->back_wl_buffer = allocate_wl_buffer(
surface->wl_egl_window, color);
resource = surface->back_wl_buffer->resource;
} else {
surface->wl_egl_window = NULL;
surface->front_wl_buffer = NULL;
+ surface->middle_wl_buffer = NULL;
surface->back_wl_buffer = NULL;
resource = DISPMANX_NO_HANDLE;
}
@@ -696,6 +698,12 @@ void egl_surface_free(EGL_SURFACE_T *surface)
surface->back_wl_buffer = 0;
}
+ if (surface->middle_wl_buffer) {
+ wl_buffer_destroy(surface->middle_wl_buffer->wl_buffer);
+ free(surface->middle_wl_buffer);
+ surface->middle_wl_buffer = 0;
+ }
+
if (surface->front_wl_buffer) {
wl_buffer_destroy(surface->front_wl_buffer->wl_buffer);
free(surface->front_wl_buffer);
diff --git a/interface/khronos/egl/egl_client_surface.h b/interface/khronos/egl/egl_client_surface.h
index e328b77..58a3184 100644
--- a/interface/khronos/egl/egl_client_surface.h
+++ b/interface/khronos/egl/egl_client_surface.h
@@ -312,6 +312,17 @@ typedef struct {
*/
struct wl_dispmanx_client_buffer *front_wl_buffer;
+ /*
+ middle_wl_buffer
+
+ Validity:
+ type == WINDOW
+
+ Invariant:
+ client-side information about the wl_buffer in the middle
+ */
+ struct wl_dispmanx_client_buffer *middle_wl_buffer;
+
/*
back_wl_buffer