1
0
Fork 0

1:46.4+r18+g081b918ba-2: Add !4015

Signed-off-by: Mingi Sung <sungmg@saltyming.net>
This commit is contained in:
Mingi Sung 2024-09-13 23:32:40 +09:00
parent 1afe5b0b92
commit 5f9a7581c6
Signed by: sungmg
GPG key ID: 41BAFD6FFD8036C5
3 changed files with 368 additions and 7 deletions

View file

@ -1,7 +1,7 @@
pkgbase = mutter-performance pkgbase = mutter-performance
pkgdesc = A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync pkgdesc = A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync
pkgver = 46.4+r18+g081b918ba pkgver = 46.4+r18+g081b918ba
pkgrel = 1 pkgrel = 2
epoch = 1 epoch = 1
url = https://gitlab.gnome.org/GNOME/mutter url = https://gitlab.gnome.org/GNOME/mutter
arch = x86_64 arch = x86_64
@ -78,16 +78,19 @@ pkgbase = mutter-performance
source = mr3567.patch source = mr3567.patch
source = mr3751.patch source = mr3751.patch
source = mr3934.patch source = mr3934.patch
source = mr4015.patch
sha256sums = 81978164d9f2715438fbc623c77ea7529332cac5c4c519e4781daa5bf1a315eb sha256sums = 81978164d9f2715438fbc623c77ea7529332cac5c4c519e4781daa5bf1a315eb
sha256sums = 60638078a3f3c46da61f868c04b2a3424488510702648452c3e8214a3790e37b sha256sums = 60638078a3f3c46da61f868c04b2a3424488510702648452c3e8214a3790e37b
sha256sums = 2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517 sha256sums = 2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517
sha256sums = 4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe sha256sums = 4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe
sha256sums = c0ae2855247cddde806a320d031021fd0f7c867c61ac95af99ea3765f290bbf5 sha256sums = c0ae2855247cddde806a320d031021fd0f7c867c61ac95af99ea3765f290bbf5
sha256sums = 261d08c54142cd462b651e236565e2289074f53743f30afa9c62a1e20bff37e7
b2sums = aaed24cb5bac5f62096d44bfdf0e6acfff3944137a06f5cbd7fd1f18d03ebb816d02ab170c9128eafb023a339de3e7ea79480654687ec449d29f9e45d66218e3 b2sums = aaed24cb5bac5f62096d44bfdf0e6acfff3944137a06f5cbd7fd1f18d03ebb816d02ab170c9128eafb023a339de3e7ea79480654687ec449d29f9e45d66218e3
b2sums = 802cf82c0d4fa4514dc376bac57a65453df0ce789e6efac334d2f76a24349ad0a2b6e9ce02345839e8de719d7696dfcae911b1e66922103b2ec315e9fbaa8f01 b2sums = 802cf82c0d4fa4514dc376bac57a65453df0ce789e6efac334d2f76a24349ad0a2b6e9ce02345839e8de719d7696dfcae911b1e66922103b2ec315e9fbaa8f01
b2sums = 65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c b2sums = 65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c
b2sums = f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3 b2sums = f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3
b2sums = 18e8d521336422f4c441979fe77ff22c60406e94cd2159c08bbfd127bf6b010dece55c7226b99a953c560b05194fe72e5c2140765577069d970c93479b573bcb b2sums = 18e8d521336422f4c441979fe77ff22c60406e94cd2159c08bbfd127bf6b010dece55c7226b99a953c560b05194fe72e5c2140765577069d970c93479b573bcb
b2sums = a7ce3e4288ad4b14a6b7cb4d9e3f77fc27445f46e5439bc4fe85b696c63298487909a48d4bc4238333c9f9724ba1b5779c29ef8df6a61ac9eb78dd2e83de6502
pkgname = mutter-performance pkgname = mutter-performance
groups = gnome groups = gnome

View file

@ -11,8 +11,8 @@
### PACKAGE OPTIONS ### PACKAGE OPTIONS
## MERGE REQUESTS SELECTION ## MERGE REQUESTS SELECTION
# Merge Requests List: ('579' '1441' '3567' '3751' '3934') # Merge Requests List: ('579' '1441' '3567' '3751' '3934' '4015')
_merge_requests_to_use=('1441' '3751') _merge_requests_to_use=('1441' '3751' '4015')
### IMPORTANT: Do no edit below this line unless you know what you're doing! ### IMPORTANT: Do no edit below this line unless you know what you're doing!
@ -21,7 +21,7 @@ _pkgname=mutter
pkgname=mutter-performance pkgname=mutter-performance
epoch=1 epoch=1
pkgver=46.4+r18+g081b918ba pkgver=46.4+r18+g081b918ba
pkgrel=1 pkgrel=2
pkgdesc="A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync" pkgdesc="A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync"
url="https://gitlab.gnome.org/GNOME/mutter" url="https://gitlab.gnome.org/GNOME/mutter"
arch=(x86_64 aarch64) arch=(x86_64 aarch64)
@ -105,17 +105,20 @@ source=("git+$url.git#commit=$_commit"
'mr1441.patch' 'mr1441.patch'
'mr3567.patch' 'mr3567.patch'
'mr3751.patch' 'mr3751.patch'
'mr3934.patch') 'mr3934.patch'
'mr4015.patch')
sha256sums=('81978164d9f2715438fbc623c77ea7529332cac5c4c519e4781daa5bf1a315eb' sha256sums=('81978164d9f2715438fbc623c77ea7529332cac5c4c519e4781daa5bf1a315eb'
'60638078a3f3c46da61f868c04b2a3424488510702648452c3e8214a3790e37b' '60638078a3f3c46da61f868c04b2a3424488510702648452c3e8214a3790e37b'
'2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517' '2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517'
'4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe' '4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe'
'c0ae2855247cddde806a320d031021fd0f7c867c61ac95af99ea3765f290bbf5') 'c0ae2855247cddde806a320d031021fd0f7c867c61ac95af99ea3765f290bbf5'
'261d08c54142cd462b651e236565e2289074f53743f30afa9c62a1e20bff37e7')
b2sums=('aaed24cb5bac5f62096d44bfdf0e6acfff3944137a06f5cbd7fd1f18d03ebb816d02ab170c9128eafb023a339de3e7ea79480654687ec449d29f9e45d66218e3' b2sums=('aaed24cb5bac5f62096d44bfdf0e6acfff3944137a06f5cbd7fd1f18d03ebb816d02ab170c9128eafb023a339de3e7ea79480654687ec449d29f9e45d66218e3'
'802cf82c0d4fa4514dc376bac57a65453df0ce789e6efac334d2f76a24349ad0a2b6e9ce02345839e8de719d7696dfcae911b1e66922103b2ec315e9fbaa8f01' '802cf82c0d4fa4514dc376bac57a65453df0ce789e6efac334d2f76a24349ad0a2b6e9ce02345839e8de719d7696dfcae911b1e66922103b2ec315e9fbaa8f01'
'65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c' '65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c'
'f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3' 'f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3'
'18e8d521336422f4c441979fe77ff22c60406e94cd2159c08bbfd127bf6b010dece55c7226b99a953c560b05194fe72e5c2140765577069d970c93479b573bcb') '18e8d521336422f4c441979fe77ff22c60406e94cd2159c08bbfd127bf6b010dece55c7226b99a953c560b05194fe72e5c2140765577069d970c93479b573bcb'
'a7ce3e4288ad4b14a6b7cb4d9e3f77fc27445f46e5439bc4fe85b696c63298487909a48d4bc4238333c9f9724ba1b5779c29ef8df6a61ac9eb78dd2e83de6502')
for mr in "${_merge_requests_to_use[@]}"; do for mr in "${_merge_requests_to_use[@]}"; do
if [ '3567' = "$mr" ]; then if [ '3567' = "$mr" ]; then
@ -231,6 +234,16 @@ prepare() {
# Do not enable this if !1441 is enabled since it already includes !3934. # Do not enable this if !1441 is enabled since it already includes !3934.
pick_mr '3934' 'mr3934.patch' 'patch' pick_mr '3934' 'mr3934.patch' 'patch'
# Title: onscreen/native: Use EGLSyncs instead of cogl_framebuffer_finish
# Author: Gert <Gert-dev@users.noreply.github.com>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4015
# Type: 1
# Status: 2
# Comment: This can unblock the CPU in situations where the primary GPU wasn't done
# processing the queue by the time cogl_framebuffer_finish was called.
# It is not intended to be merged in its current state and more of a proof-of-concept.
pick_mr '4015' 'mr4015.patch' 'patch'
# Title: Draft: Dynamic triple/double buffering (v4) # Title: Draft: Dynamic triple/double buffering (v4)
# Author: Daniel van Vugt <daniel.van.vugt@canonical.com> # Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441 # URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441

345
mr4015.patch Normal file
View file

@ -0,0 +1,345 @@
From cf97df46f751470b6df99376840842afc211636d Mon Sep 17 00:00:00 2001
From: Gert <Gert-dev@users.noreply.github.com>
Date: Thu, 12 Sep 2024 20:13:33 +0200
Subject: [PATCH] onscreen/native: Use EGLSyncs instead of
cogl_framebuffer_finish
cogl_framebuffer_finish can result in a CPU-side stall because it waits for
the primary GPU to flush and execute all commands that were queued before
that. By using a GPU-side EGLSync we can let the primary GPU inform us when
it is done with the queued commands instead. We then create another EGLSync
on the secondary GPU using the same fd so the primary GPU effectively
signals the secondary GPU when it is done rendering, causing the latter
to wait for the former before copying part of the frames it needs for
monitors attached to it directly.
This solves the corruption that cogl_framebuffer_finish also solved, but
without needing a CPU-side stall.
---
src/backends/meta-egl.c | 94 +++++++++++++++++++
src/backends/meta-egl.h | 23 +++++
src/backends/native/meta-onscreen-native.c | 100 ++++++++++++++++++---
3 files changed, 206 insertions(+), 11 deletions(-)
diff --git a/src/backends/meta-egl.c b/src/backends/meta-egl.c
index cc023f705c4..9e9fada375a 100644
--- a/src/backends/meta-egl.c
+++ b/src/backends/meta-egl.c
@@ -44,6 +44,11 @@ struct _MetaEgl
PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR;
+ PFNEGLCREATESYNCPROC eglCreateSync;
+ PFNEGLDESTROYSYNCPROC eglDestroySync;
+ PFNEGLWAITSYNCPROC eglWaitSync;
+ PFNEGLDUPNATIVEFENCEFDANDROIDPROC eglDupNativeFenceFDANDROID;
+
PFNEGLBINDWAYLANDDISPLAYWL eglBindWaylandDisplayWL;
PFNEGLQUERYWAYLANDBUFFERWL eglQueryWaylandBufferWL;
@@ -1162,6 +1167,90 @@ meta_egl_query_display_attrib (MetaEgl *egl,
return TRUE;
}
+gboolean
+meta_egl_create_sync (MetaEgl *egl,
+ EGLDisplay display,
+ EGLenum type,
+ const EGLAttrib *attrib_list,
+ EGLSync *egl_sync,
+ GError **error)
+{
+ if (!is_egl_proc_valid (egl->eglCreateSync, error))
+ return FALSE;
+
+ EGLSync sync;
+
+ sync = egl->eglCreateSync(display, type, attrib_list);
+
+ if (sync == EGL_NO_SYNC)
+ {
+ set_egl_error (error);
+ return FALSE;
+ }
+
+ *egl_sync = sync;
+
+ return TRUE;
+}
+
+gboolean
+meta_egl_destroy_sync (MetaEgl *egl,
+ EGLDisplay display,
+ EGLSync sync,
+ GError **error)
+{
+ if (!is_egl_proc_valid (egl->eglDestroySync, error))
+ return FALSE;
+
+ if (!egl->eglDestroySync (display, sync))
+ {
+ set_egl_error (error);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean
+meta_egl_wait_sync (MetaEgl *egl,
+ EGLDisplay display,
+ EGLSync sync,
+ EGLint flags,
+ GError **error)
+{
+ if (!is_egl_proc_valid (egl->eglWaitSync, error))
+ return FALSE;
+
+ if (!egl->eglWaitSync (display, sync, flags))
+ {
+ set_egl_error (error);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+EGLint
+meta_egl_duplicate_native_fence_fd (MetaEgl *egl,
+ EGLDisplay display,
+ EGLSync sync,
+ GError **error)
+{
+ if (!is_egl_proc_valid (egl->eglDupNativeFenceFDANDROID, error))
+ return EGL_NO_NATIVE_FENCE_FD_ANDROID;
+
+ EGLint fd = EGL_NO_NATIVE_FENCE_FD_ANDROID;
+
+ fd = egl->eglDupNativeFenceFDANDROID (display, sync);
+
+ if (fd == EGL_NO_NATIVE_FENCE_FD_ANDROID)
+ {
+ set_egl_error (error);
+ }
+
+ return fd;
+}
+
#define GET_EGL_PROC_ADDR(proc) \
egl->proc = (void *) eglGetProcAddress (#proc);
@@ -1175,6 +1264,11 @@ meta_egl_constructed (GObject *object)
GET_EGL_PROC_ADDR (eglCreateImageKHR);
GET_EGL_PROC_ADDR (eglDestroyImageKHR);
+ GET_EGL_PROC_ADDR (eglCreateSync);
+ GET_EGL_PROC_ADDR (eglDestroySync);
+ GET_EGL_PROC_ADDR (eglWaitSync);
+ GET_EGL_PROC_ADDR (eglDupNativeFenceFDANDROID);
+
GET_EGL_PROC_ADDR (eglBindWaylandDisplayWL);
GET_EGL_PROC_ADDR (eglQueryWaylandBufferWL);
diff --git a/src/backends/meta-egl.h b/src/backends/meta-egl.h
index 8b955c90c38..55775c7a421 100644
--- a/src/backends/meta-egl.h
+++ b/src/backends/meta-egl.h
@@ -276,3 +276,26 @@ gboolean meta_egl_query_display_attrib (MetaEgl *egl,
EGLint attribute,
EGLAttrib *value,
GError **error);
+
+gboolean meta_egl_create_sync (MetaEgl *egl,
+ EGLDisplay display,
+ EGLenum type,
+ const EGLAttrib *attrib_list,
+ EGLSync *egl_sync,
+ GError **error);
+
+gboolean meta_egl_destroy_sync (MetaEgl *egl,
+ EGLDisplay display,
+ EGLSync sync,
+ GError **error);
+
+gboolean meta_egl_wait_sync (MetaEgl *egl,
+ EGLDisplay display,
+ EGLSync sync,
+ EGLint flags,
+ GError **error);
+
+EGLint meta_egl_duplicate_native_fence_fd (MetaEgl *egl,
+ EGLDisplay display,
+ EGLSync sync,
+ GError **error);
\ No newline at end of file
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index 1a31f04a164..4f80b394f65 100644
--- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c
@@ -29,6 +29,7 @@
#include "backends/native/meta-onscreen-native.h"
+#include <glib/gstdio.h>
#include <drm_fourcc.h>
#include "backends/meta-egl-ext.h"
@@ -828,20 +829,53 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
MetaGles3 *gles3 = meta_renderer_native_get_gles3 (renderer_native);
+ CoglContext *cogl_context = cogl_framebuffer_get_context (COGL_FRAMEBUFFER (onscreen));
+ CoglRendererEGL *cogl_renderer_egl = cogl_context->display->renderer->winsys;
MetaRenderDevice *render_device;
EGLDisplay egl_display;
- GError *error = NULL;
+ g_autoptr (GError) error = NULL;
gboolean use_modifiers;
MetaDeviceFile *device_file;
MetaDrmBufferFlags flags;
MetaDrmBufferGbm *buffer_gbm;
struct gbm_bo *bo;
+ EGLSync primary_gpu_egl_sync = EGL_NO_SYNC;
+ EGLSync secondary_gpu_egl_sync = EGL_NO_SYNC;
+ g_autofd int primary_gpu_sync_fence = EGL_NO_NATIVE_FENCE_FD_ANDROID;
COGL_TRACE_BEGIN_SCOPED (CopySharedFramebufferSecondaryGpu,
"copy_shared_framebuffer_gpu()");
-
+
if (renderer_gpu_data->secondary.needs_explicit_sync)
- cogl_framebuffer_finish (COGL_FRAMEBUFFER (onscreen));
+ {
+ if (!meta_egl_create_sync (egl,
+ cogl_renderer_egl->edpy,
+ EGL_SYNC_NATIVE_FENCE_ANDROID,
+ NULL,
+ &primary_gpu_egl_sync,
+ &error))
+ {
+ g_warning ("Failed to create EGLSync on primary GPU: %s", error->message);
+ return NULL;
+ }
+
+ // According to the EGL_KHR_fence_sync specification we must ensure
+ // the fence command is flushed in this context to be able to await it
+ // in another (secondary GPU context) or we risk waiting indefinitely.
+ cogl_framebuffer_flush (COGL_FRAMEBUFFER (onscreen));
+
+ primary_gpu_sync_fence =
+ meta_egl_duplicate_native_fence_fd (egl,
+ cogl_renderer_egl->edpy,
+ primary_gpu_egl_sync,
+ &error);
+
+ if (primary_gpu_sync_fence == EGL_NO_NATIVE_FENCE_FD_ANDROID)
+ {
+ g_warning ("Failed to duplicate EGLSync FD on primary GPU: %s", error->message);
+ goto out;
+ }
+ }
render_device = renderer_gpu_data->render_device;
egl_display = meta_render_device_get_egl_display (render_device);
@@ -854,13 +888,45 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
&error))
{
g_warning ("Failed to make current: %s", error->message);
- g_error_free (error);
- return NULL;
+ goto out;
}
*egl_context_changed = TRUE;
+ if (primary_gpu_sync_fence != EGL_NO_NATIVE_FENCE_FD_ANDROID)
+ {
+ EGLAttrib attribs[3];
+
+ attribs[0] = EGL_SYNC_NATIVE_FENCE_FD_ANDROID;
+ attribs[1] = primary_gpu_sync_fence;
+ attribs[2] = EGL_NONE;
+
+ if (!meta_egl_create_sync (egl,
+ egl_display,
+ EGL_SYNC_NATIVE_FENCE_ANDROID,
+ attribs,
+ &secondary_gpu_egl_sync,
+ &error))
+ {
+ g_warning ("Failed to create EGLSync on secondary GPU: %s", error->message);
+ goto out;
+ }
+
+ // eglCreateSync takes ownership of an existing fd that is passed, so
+ // don't try to clean it up twice.
+ primary_gpu_sync_fence = EGL_NO_NATIVE_FENCE_FD_ANDROID;
+ if (!meta_egl_wait_sync (egl,
+ egl_display,
+ secondary_gpu_egl_sync,
+ 0,
+ &error))
+ {
+ g_warning ("Failed to wait for EGLSync on secondary GPU: %s", error->message);
+ goto out;
+ }
+ }
+
buffer_gbm = META_DRM_BUFFER_GBM (primary_gpu_fb);
bo = meta_drm_buffer_gbm_get_bo (buffer_gbm);
if (!meta_renderer_native_gles3_blit_shared_bo (egl,
@@ -872,8 +938,7 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
&error))
{
g_warning ("Failed to blit shared framebuffer: %s", error->message);
- g_error_free (error);
- return NULL;
+ goto out;
}
if (!meta_egl_swap_buffers (egl,
@@ -882,8 +947,7 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
&error))
{
g_warning ("Failed to swap buffers: %s", error->message);
- g_error_free (error);
- return NULL;
+ goto out;
}
use_modifiers = meta_renderer_native_use_modifiers (renderer_native);
@@ -902,8 +966,7 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
{
g_warning ("meta_drm_buffer_gbm_new_lock_front failed: %s",
error->message);
- g_error_free (error);
- return NULL;
+ goto out;
}
g_object_set_qdata_full (G_OBJECT (buffer_gbm),
@@ -911,6 +974,21 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
g_object_ref (primary_gpu_fb),
g_object_unref);
+out:
+ if (primary_gpu_egl_sync != EGL_NO_SYNC &&
+ !meta_egl_destroy_sync (egl,
+ cogl_renderer_egl->edpy,
+ primary_gpu_egl_sync,
+ &error))
+ g_warning ("Failed to destroy primary GPU EGLSync: %s", error->message);
+
+ if (secondary_gpu_egl_sync != EGL_NO_SYNC &&
+ !meta_egl_destroy_sync (egl,
+ egl_display,
+ secondary_gpu_egl_sync,
+ &error))
+ g_warning ("Failed to destroy secondary GPU EGLSync: %s", error->message);
+
return META_DRM_BUFFER (buffer_gbm);
}
--
GitLab