1:46.4+r18+g081b918ba-2: Add !4015
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
This commit is contained in:
parent
1afe5b0b92
commit
5f9a7581c6
3 changed files with 368 additions and 7 deletions
5
.SRCINFO
5
.SRCINFO
|
@ -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
|
||||||
|
|
25
PKGBUILD
25
PKGBUILD
|
@ -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
345
mr4015.patch
Normal 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
|
Loading…
Reference in a new issue