1
0
Fork 0

1:47.4-1: Sync to gnome-47

Signed-off-by: Mingi Sung <sungmg@saltyming.net>
This commit is contained in:
Mingi Sung 2025-01-15 20:00:33 +09:00
parent 8e22c21164
commit 0b6cd14baa
Signed by: sungmg
GPG key ID: D5CE3ADFE05B5771
3 changed files with 73 additions and 465 deletions

View file

@ -1,6 +1,6 @@
pkgbase = mutter-performance
pkgdesc = A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync
pkgver = 47.3
pkgver = 47.4
pkgrel = 1
epoch = 1
url = https://gitlab.gnome.org/GNOME/mutter
@ -73,17 +73,17 @@ pkgbase = mutter-performance
depends = systemd-libs
depends = wayland
depends = xorg-xwayland
source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=a5e1f011268ca128d1d3d1f3d4b15b760459ad4a
source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=96e62be1022a45b7012d5a97b667b28dad13f74b
source = git+https://gitlab.gnome.org/GNOME/gvdb.git#commit=b54bc5da25127ef416858a3ad92e57159ff565b3
source = mr1441.patch
source = mr3751.patch
sha256sums = a27bfdfc513bf1fa0b5feb7616b8898fc478d4149137e488c42121d176e4d0a4
sha256sums = f589bdd2b7c4f7eb80d723b0f1e05080ec9c0e17e384918d582a0218588152aa
sha256sums = ba56c003c1c16f1f8e411f6d5213878bcf059d4d39ece100fc414228a1bf22d5
sha256sums = a32ff6ea20af04e62e40232644518e64d4d20c1c68bbcdfb16e6062540f80e6b
sha256sums = 004a890489aa05df6bd4193b4b22415fa58d117ebeee671d57a1183c392a7dd8
sha256sums = 67943a22cb75df955fc475e5ae101984d87e4a1f51d56be5f50696cc3355a3c4
b2sums = 65ad1b7cbb3261bbb044d31666cafa075599fadf8afd6f772a65faed73fd0b4c1d3d95e44e63efce62255b89bdf69542f15d2ea06cf3908d1b824467f6458abb
b2sums = 24b61029ec913919a9a9d9a929048207e34defa433b1088aa7737efbc267dbd954197500828101e84dc5681ad95f8201f2605675d6aaf6e7e3454f1f24fa78f6
b2sums = f989bc2ceb52aad3c6a23c439df3bbc672bc11d561a247d19971d30cc85ed5d42295de40f8e55b13404ed32aa44f12307c9f5b470f2e288d1c9c8329255c43bf
b2sums = 031f3b4eedab7da3f92958dffd52725d083b90b93ab18b5c542534319b20f422abac5bdc8e1c444262f4a7b6041a8e5502e2c54f296b1529d51999f36b55da15
b2sums = 5a1c560bf4c671cdc17cee5e37f55337b19254598dca5fb95bc30809fef2504e40cb3350e5ad226bea5feb46b3fbc6683e9e6f212826a5ba549ba1237a34b40b
b2sums = e13742a68cd831827e88ddf1801caca39fa9c77dd8c08a851bc87914f2961119fc1a7643628fc63cad8dedf03533148539a242cca23313c250bd65867ea84d8d
pkgname = mutter-performance

View file

@ -20,7 +20,7 @@ _merge_requests_to_use=('1441' '3751')
_pkgname=mutter
pkgname=mutter-performance
epoch=1
pkgver=47.3
pkgver=47.4
pkgrel=1
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"
@ -97,18 +97,18 @@ makedepends=(
xorg-server
xorg-server-xvfb
)
_commit=a5e1f011268ca128d1d3d1f3d4b15b760459ad4a # tags/47.3^0
_commit=96e62be1022a45b7012d5a97b667b28dad13f74b # tags/47.4^0
source=("git+$url.git#commit=$_commit"
"git+https://gitlab.gnome.org/GNOME/gvdb.git#commit=b54bc5da25127ef416858a3ad92e57159ff565b3"
'mr1441.patch'
'mr3751.patch')
sha256sums=('a27bfdfc513bf1fa0b5feb7616b8898fc478d4149137e488c42121d176e4d0a4'
sha256sums=('f589bdd2b7c4f7eb80d723b0f1e05080ec9c0e17e384918d582a0218588152aa'
'ba56c003c1c16f1f8e411f6d5213878bcf059d4d39ece100fc414228a1bf22d5'
'a32ff6ea20af04e62e40232644518e64d4d20c1c68bbcdfb16e6062540f80e6b'
'004a890489aa05df6bd4193b4b22415fa58d117ebeee671d57a1183c392a7dd8'
'67943a22cb75df955fc475e5ae101984d87e4a1f51d56be5f50696cc3355a3c4')
b2sums=('65ad1b7cbb3261bbb044d31666cafa075599fadf8afd6f772a65faed73fd0b4c1d3d95e44e63efce62255b89bdf69542f15d2ea06cf3908d1b824467f6458abb'
b2sums=('24b61029ec913919a9a9d9a929048207e34defa433b1088aa7737efbc267dbd954197500828101e84dc5681ad95f8201f2605675d6aaf6e7e3454f1f24fa78f6'
'f989bc2ceb52aad3c6a23c439df3bbc672bc11d561a247d19971d30cc85ed5d42295de40f8e55b13404ed32aa44f12307c9f5b470f2e288d1c9c8329255c43bf'
'031f3b4eedab7da3f92958dffd52725d083b90b93ab18b5c542534319b20f422abac5bdc8e1c444262f4a7b6041a8e5502e2c54f296b1529d51999f36b55da15'
'5a1c560bf4c671cdc17cee5e37f55337b19254598dca5fb95bc30809fef2504e40cb3350e5ad226bea5feb46b3fbc6683e9e6f212826a5ba549ba1237a34b40b'
'e13742a68cd831827e88ddf1801caca39fa9c77dd8c08a851bc87914f2961119fc1a7643628fc63cad8dedf03533148539a242cca23313c250bd65867ea84d8d')
pkgver() {

View file

@ -1,6 +1,6 @@
From f402d2de6d9c5b368ff25a5de1ee2977a921767b Mon Sep 17 00:00:00 2001
From 0e35dd8b2d76a8243093d7bedd250470cbf67e38 Mon Sep 17 00:00:00 2001
From: Mingi Sung <sungmg@saltyming.net>
Date: Mon, 23 Dec 2024 18:49:39 +0900
Date: Wed, 15 Jan 2025 13:37:27 +0900
Subject: [PATCH] Merge branch 'sungmg-triple-buffering-v4-47' into gnome-47
Use triple buffering if and when the previous frame is running late.
@ -17,15 +17,14 @@ Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
Origin: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441
Source: https://git.saltyming.net/sungmg/mutter-performance-source
Commit: 1423cf198eff17b6419d8d85d0c2aa9799c93c7d
Commit: 38686b3a516e762b2555d1a06929eb439cd9d144
Included: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3961
Included: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4027
Included: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4057
Included: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4069
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
---
clutter/clutter/clutter-frame-clock.c | 556 +++++++++++++++++------
clutter/clutter/clutter-frame-clock.c | 556 ++++++++++++++++++++++-------
clutter/clutter/clutter-frame-clock.h | 11 +-
clutter/clutter/clutter-frame-private.h | 1 +
clutter/clutter/clutter-frame.c | 13 +
@ -35,20 +34,16 @@ Signed-off-by: Mingi Sung <sungmg@saltyming.net>
cogl/cogl/cogl-onscreen.c | 8 +
doc/clutter-frame-scheduling.md | 17 +-
src/backends/meta-stage-impl.c | 2 +
src/backends/native/meta-drm-buffer-gbm.c | 188 ++++++--
src/backends/native/meta-drm-buffer-gbm.h | 6 +
src/backends/native/meta-frame-native.c | 31 ++
src/backends/native/meta-frame-native.h | 9 +
src/backends/native/meta-kms-impl-device.c | 21 -
src/backends/native/meta-kms-impl-device.c | 21 --
src/backends/native/meta-kms.c | 9 +
src/backends/native/meta-kms.h | 2 +
src/backends/native/meta-onscreen-native.c | 378 +++++++++++----
src/backends/native/meta-onscreen-native.c | 367 ++++++++++++++-----
src/backends/native/meta-onscreen-native.h | 2 +
src/backends/native/meta-renderer-native-gles3.c | 54 +--
src/backends/native/meta-renderer-native-gles3.h | 2 +-
src/backends/native/meta-renderer-native.c | 35 +-
src/tests/native-kms-render.c | 106 ++++-
23 files changed, 1093 insertions(+), 373 deletions(-)
src/tests/native-kms-render.c | 106 +++++-
19 files changed, 937 insertions(+), 268 deletions(-)
diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c
index 0cc1f2eb4..d5c403201 100644
@ -1119,7 +1114,7 @@ index 34f0770bd..905e399a6 100644
+
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFrame, clutter_frame_unref)
diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c
index 7f30f8136..db2a09dc9 100644
index fd5caf670..c8acf6289 100644
--- a/clutter/clutter/clutter-stage-view.c
+++ b/clutter/clutter/clutter-stage-view.c
@@ -1076,8 +1076,9 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
@ -1146,10 +1141,10 @@ index e732d3fd0..c7c392592 100644
+COGL_EXPORT unsigned int
+cogl_onscreen_get_pending_frame_count (CoglOnscreen *onscreen);
diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c
index 57aa7f0cd..b2aa95031 100644
index 1d44d2974..79badbd8a 100644
--- a/cogl/cogl/cogl-onscreen.c
+++ b/cogl/cogl/cogl-onscreen.c
@@ -470,6 +470,14 @@ cogl_onscreen_pop_head_frame_info (CoglOnscreen *onscreen)
@@ -466,6 +466,14 @@ cogl_onscreen_pop_head_frame_info (CoglOnscreen *onscreen)
return g_queue_pop_head (&priv->pending_frame_infos);
}
@ -1203,266 +1198,6 @@ index 945e95ff2..383453044 100644
if (meta_stage_impl_scanout_view (stage_impl,
stage_view,
scanout,
diff --git a/src/backends/native/meta-drm-buffer-gbm.c b/src/backends/native/meta-drm-buffer-gbm.c
index 01963cd75..85c20d771 100644
--- a/src/backends/native/meta-drm-buffer-gbm.c
+++ b/src/backends/native/meta-drm-buffer-gbm.c
@@ -23,6 +23,7 @@
#include "backends/native/meta-drm-buffer-gbm.h"
+#include <EGL/egl.h>
#include <drm_fourcc.h>
#include <errno.h>
#include <gio/gio.h>
@@ -43,6 +44,14 @@ struct _MetaDrmBufferGbm
struct gbm_bo *bo;
};
+typedef struct _MetaDrmBufferGbmBoUserData
+{
+ EGLImageKHR egl_image;
+
+ MetaEgl *egl;
+ EGLDisplay egl_display;
+} MetaDrmBufferGbmBoUserData;
+
static void
cogl_scanout_buffer_iface_init (CoglScanoutBufferInterface *iface);
@@ -229,6 +238,125 @@ meta_drm_buffer_gbm_new_take (MetaDeviceFile *device_file,
return buffer_gbm;
}
+static EGLImageKHR
+meta_drm_buffer_gbm_create_native_blit_image (MetaEgl *egl,
+ EGLDisplay egl_display,
+ struct gbm_bo *shared_bo,
+ GError **error)
+{
+ int shared_bo_fd;
+ unsigned int width;
+ unsigned int height;
+ uint32_t i, n_planes;
+ uint32_t *strides;
+ uint32_t *offsets;
+ uint64_t *modifiers;
+ int *fds;
+ uint32_t format;
+ EGLImageKHR egl_image;
+ gboolean use_modifiers;
+
+ shared_bo_fd = gbm_bo_get_fd (shared_bo);
+ if (shared_bo_fd < 0)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Failed to export gbm_bo: %s", strerror (errno));
+ return FALSE;
+ }
+
+ width = gbm_bo_get_width (shared_bo);
+ height = gbm_bo_get_height (shared_bo);
+ format = gbm_bo_get_format (shared_bo);
+
+ n_planes = gbm_bo_get_plane_count (shared_bo);
+ fds = g_alloca (sizeof (int) * n_planes);
+ strides = g_alloca (sizeof (uint32_t) * n_planes);
+ offsets = g_alloca (sizeof (uint32_t) * n_planes);
+ modifiers = g_alloca (sizeof (uint64_t) * n_planes);
+
+ for (i = 0; i < n_planes; i++)
+ {
+ strides[i] = gbm_bo_get_stride_for_plane (shared_bo, i);
+ offsets[i] = gbm_bo_get_offset (shared_bo, i);
+ modifiers[i] = gbm_bo_get_modifier (shared_bo);
+ fds[i] = shared_bo_fd;
+ }
+
+ /* Workaround for https://gitlab.gnome.org/GNOME/mutter/issues/18 */
+ if (modifiers[0] == DRM_FORMAT_MOD_LINEAR ||
+ modifiers[0] == DRM_FORMAT_MOD_INVALID)
+ use_modifiers = FALSE;
+ else
+ use_modifiers = TRUE;
+
+ egl_image = meta_egl_create_dmabuf_image (egl,
+ egl_display,
+ width,
+ height,
+ format,
+ n_planes,
+ fds,
+ strides,
+ offsets,
+ use_modifiers ? modifiers : NULL,
+ error);
+ close (shared_bo_fd);
+
+ return egl_image;
+}
+
+static void
+meta_drm_buffer_gbm_free_native_blit_image (struct gbm_bo *bo,
+ void *data)
+{
+ MetaDrmBufferGbmBoUserData *user_data = data;
+ g_autoptr (GError) error = NULL;
+
+ if (!meta_egl_destroy_image (user_data->egl,
+ user_data->egl_display,
+ user_data->egl_image,
+ &error))
+ g_prefix_error (&error, "Could not destroy EGLImage: ");
+
+ g_free (data);
+}
+
+
+EGLImageKHR
+meta_drm_buffer_gbm_get_native_blit_image (MetaEgl *egl,
+ EGLDisplay egl_display,
+ struct gbm_bo *bo,
+ GError **error)
+{
+ MetaDrmBufferGbmBoUserData *bo_user_data = NULL;
+
+ bo_user_data = gbm_bo_get_user_data (bo);
+
+ if (!bo_user_data)
+ {
+ EGLImageKHR egl_image = EGL_NO_IMAGE;
+
+ egl_image = meta_drm_buffer_gbm_create_native_blit_image (egl,
+ egl_display,
+ bo,
+ error);
+
+ if (!egl_image)
+ {
+ return EGL_NO_IMAGE;
+ }
+
+ bo_user_data = g_new0 (MetaDrmBufferGbmBoUserData, 1);
+ bo_user_data->egl = egl;
+ bo_user_data->egl_display = egl_display;
+ bo_user_data->egl_image = egl_image;
+
+ gbm_bo_set_user_data (bo, bo_user_data, meta_drm_buffer_gbm_free_native_blit_image);
+ }
+
+ return bo_user_data->egl_image;
+}
+
static gboolean
meta_drm_buffer_gbm_blit_to_framebuffer (CoglScanout *scanout,
CoglFramebuffer *framebuffer,
@@ -256,67 +384,28 @@ meta_drm_buffer_gbm_blit_to_framebuffer (CoglScanout *scanout,
CoglEglImageFlags flags;
CoglOffscreen *cogl_fbo = NULL;
CoglTexture *cogl_tex;
- uint32_t n_planes;
- uint64_t *modifiers;
- uint32_t *strides;
- uint32_t *offsets;
uint32_t width;
uint32_t height;
- uint32_t drm_format;
- int *fds;
+ uint32_t format;
gboolean result;
- int dmabuf_fd = -1;
- uint32_t i;
const MetaFormatInfo *format_info;
- dmabuf_fd = gbm_bo_get_fd (buffer_gbm->bo);
- if (dmabuf_fd == -1)
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS,
- "Failed to export buffer's DMA fd: %s",
- g_strerror (errno));
- return FALSE;
- }
-
- drm_format = gbm_bo_get_format (buffer_gbm->bo);
-
- format_info = meta_format_info_from_drm_format (drm_format);
- g_assert (format_info);
- cogl_format = format_info->cogl_format;
-
- width = gbm_bo_get_width (buffer_gbm->bo);
- height = gbm_bo_get_height (buffer_gbm->bo);
- n_planes = gbm_bo_get_plane_count (buffer_gbm->bo);
- fds = g_alloca (sizeof (int) * n_planes);
- strides = g_alloca (sizeof (uint32_t) * n_planes);
- offsets = g_alloca (sizeof (uint32_t) * n_planes);
- modifiers = g_alloca (sizeof (uint64_t) * n_planes);
-
- for (i = 0; i < n_planes; i++)
- {
- fds[i] = dmabuf_fd;
- strides[i] = gbm_bo_get_stride_for_plane (buffer_gbm->bo, i);
- offsets[i] = gbm_bo_get_offset (buffer_gbm->bo, i);
- modifiers[i] = gbm_bo_get_modifier (buffer_gbm->bo);
- }
+ egl_image = meta_drm_buffer_gbm_create_native_blit_image (egl, egl_display, buffer_gbm->bo, error);
- egl_image = meta_egl_create_dmabuf_image (egl,
- egl_display,
- width,
- height,
- drm_format,
- n_planes,
- fds,
- strides,
- offsets,
- modifiers,
- error);
if (egl_image == EGL_NO_IMAGE_KHR)
{
result = FALSE;
goto out;
}
+ width = gbm_bo_get_width (buffer_gbm->bo);
+ height = gbm_bo_get_height (buffer_gbm->bo);
+ format = gbm_bo_get_format (buffer_gbm->bo);
+
+ format_info = meta_format_info_from_drm_format (format);
+ g_assert (format_info);
+ cogl_format = format_info->cogl_format;
+
flags = COGL_EGL_IMAGE_FLAG_NO_GET_DATA;
cogl_tex = cogl_texture_2d_new_from_egl_image (cogl_context,
width,
@@ -352,7 +441,6 @@ meta_drm_buffer_gbm_blit_to_framebuffer (CoglScanout *scanout,
out:
g_clear_object (&cogl_fbo);
- close (dmabuf_fd);
return result;
}
diff --git a/src/backends/native/meta-drm-buffer-gbm.h b/src/backends/native/meta-drm-buffer-gbm.h
index ab5a7fd86..12296cba4 100644
--- a/src/backends/native/meta-drm-buffer-gbm.h
+++ b/src/backends/native/meta-drm-buffer-gbm.h
@@ -21,6 +21,7 @@
#include <gbm.h>
+#include "backends/meta-egl.h"
#include "backends/native/meta-backend-native-types.h"
#include "backends/native/meta-drm-buffer-private.h"
@@ -42,3 +43,8 @@ MetaDrmBufferGbm * meta_drm_buffer_gbm_new_take (MetaDeviceFile *device_fil
GError **error);
struct gbm_bo * meta_drm_buffer_gbm_get_bo (MetaDrmBufferGbm *buffer_gbm);
+
+EGLImageKHR meta_drm_buffer_gbm_get_native_blit_image (MetaEgl *egl,
+ EGLDisplay egl_display,
+ struct gbm_bo *shared_bo,
+ GError **error);
diff --git a/src/backends/native/meta-frame-native.c b/src/backends/native/meta-frame-native.c
index 70461be32..8dc9dba9b 100644
--- a/src/backends/native/meta-frame-native.c
@ -1534,10 +1269,10 @@ index 3df4eff78..84bd43b8c 100644
+meta_frame_native_get_damage (MetaFrameNative *frame_native,
+ int **rectangles);
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 6e72f2d8d..6c4e3b4b2 100644
index 4fda35d9d..4aaa85d4e 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -2090,27 +2090,6 @@ process_mode_set_update (MetaKmsImplDevice *impl_device,
@@ -2091,27 +2091,6 @@ process_mode_set_update (MetaKmsImplDevice *impl_device,
MetaThreadImpl *thread_impl = META_THREAD_IMPL (kms_impl);
MetaThread *thread = meta_thread_impl_get_thread (thread_impl);
MetaKmsFeedback *feedback;
@ -1613,10 +1348,10 @@ index f5ec4c1c3..77fd62662 100644
MetaKmsFlags flags,
GError **error);
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index db4bbe0f1..a166e31f5 100644
index f6eb46764..90487aea9 100644
--- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c
@@ -77,7 +77,7 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
@@ -78,7 +78,7 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
struct {
MetaDrmBufferDumb *current_dumb_fb;
@ -1625,7 +1360,7 @@ index db4bbe0f1..a166e31f5 100644
} cpu;
gboolean noted_primary_gpu_copy_ok;
@@ -102,8 +102,11 @@ struct _MetaOnscreenNative
@@ -103,8 +103,11 @@ struct _MetaOnscreenNative
MetaCrtc *crtc;
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
@ -1637,7 +1372,7 @@ index db4bbe0f1..a166e31f5 100644
ClutterFrame *next_frame;
struct {
@@ -118,6 +121,9 @@ struct _MetaOnscreenNative
@@ -119,6 +122,9 @@ struct _MetaOnscreenNative
} egl;
#endif
@ -1647,7 +1382,7 @@ index db4bbe0f1..a166e31f5 100644
gboolean frame_sync_requested;
gboolean frame_sync_enabled;
@@ -139,6 +145,13 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
@@ -140,6 +146,13 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
static GQuark blit_source_quark = 0;
@ -1661,7 +1396,7 @@ index db4bbe0f1..a166e31f5 100644
static gboolean
init_secondary_gpu_state (MetaRendererNative *renderer_native,
CoglOnscreen *onscreen,
@@ -149,20 +162,20 @@ meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen)
@@ -150,20 +163,20 @@ meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen)
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
@ -1686,7 +1421,7 @@ index db4bbe0f1..a166e31f5 100644
}
static void
@@ -200,7 +213,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen)
@@ -201,7 +214,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen)
info = cogl_onscreen_pop_head_frame_info (onscreen);
@ -1695,7 +1430,7 @@ index db4bbe0f1..a166e31f5 100644
_cogl_onscreen_notify_frame_sync (onscreen, info);
_cogl_onscreen_notify_complete (onscreen, info);
@@ -242,6 +255,7 @@ notify_view_crtc_presented (MetaRendererView *view,
@@ -243,6 +256,7 @@ notify_view_crtc_presented (MetaRendererView *view,
meta_onscreen_native_notify_frame_complete (onscreen);
meta_onscreen_native_swap_drm_fb (onscreen);
@ -1703,7 +1438,7 @@ index db4bbe0f1..a166e31f5 100644
}
static void
@@ -291,15 +305,13 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc,
@@ -292,15 +306,13 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc,
CoglFramebuffer *framebuffer =
clutter_stage_view_get_onscreen (CLUTTER_STAGE_VIEW (view));
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
@ -1720,7 +1455,7 @@ index db4bbe0f1..a166e31f5 100644
}
static void
@@ -369,7 +381,8 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
@@ -367,7 +379,8 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
}
meta_onscreen_native_notify_frame_complete (onscreen);
@ -1730,7 +1465,7 @@ index db4bbe0f1..a166e31f5 100644
}
static const MetaKmsPageFlipListenerVtable page_flip_listener_vtable = {
@@ -430,18 +443,39 @@ custom_egl_stream_page_flip (gpointer custom_page_flip_data,
@@ -428,18 +441,39 @@ custom_egl_stream_page_flip (gpointer custom_page_flip_data,
}
#endif /* HAVE_EGL_DEVICE */
@ -1773,7 +1508,7 @@ index db4bbe0f1..a166e31f5 100644
static void
apply_transform (MetaCrtcKms *crtc_kms,
MetaKmsPlaneAssignment *kms_plane_assignment,
@@ -518,7 +552,7 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
@@ -544,7 +578,7 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
@ -1782,7 +1517,7 @@ index db4bbe0f1..a166e31f5 100644
MetaFrameNative *frame_native;
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc);
@@ -534,6 +568,7 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
@@ -560,6 +594,7 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
COGL_TRACE_BEGIN_SCOPED (MetaOnscreenNativeFlipCrtcs,
"Meta::OnscreenNative::flip_crtc()");
@ -1790,7 +1525,7 @@ index db4bbe0f1..a166e31f5 100644
g_return_if_fail (frame);
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
@@ -596,6 +631,10 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
@@ -622,6 +657,10 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
#endif
}
@ -1801,36 +1536,7 @@ index db4bbe0f1..a166e31f5 100644
meta_kms_update_add_page_flip_listener (kms_update,
kms_crtc,
&page_flip_listener_vtable,
@@ -854,6 +893,7 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
struct gbm_bo *bo;
EGLSync egl_sync = EGL_NO_SYNC;
g_autofd int sync_fd = -1;
+ EGLImageKHR egl_image;
COGL_TRACE_BEGIN_SCOPED (CopySharedFramebufferSecondaryGpu,
"copy_shared_framebuffer_gpu()");
@@ -907,11 +947,19 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
buffer_gbm = META_DRM_BUFFER_GBM (primary_gpu_fb);
bo = meta_drm_buffer_gbm_get_bo (buffer_gbm);
+ egl_image = meta_drm_buffer_gbm_get_native_blit_image (egl, egl_display, bo, error);
+
+ if (!egl_image)
+ {
+ g_prefix_error (error, "Failed to create EGL image from buffer object for secondary GPU: ");
+ goto done;
+ }
+
if (!meta_renderer_native_gles3_blit_shared_bo (egl,
gles3,
egl_display,
renderer_gpu_data->secondary.egl_context,
- secondary_gpu_state->egl_surface,
+ egl_image,
bo,
error))
{
@@ -972,12 +1020,17 @@ static MetaDrmBufferDumb *
@@ -1007,12 +1046,17 @@ static MetaDrmBufferDumb *
secondary_gpu_get_next_dumb_buffer (MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state)
{
MetaDrmBufferDumb *current_dumb_fb;
@ -1852,7 +1558,7 @@ index db4bbe0f1..a166e31f5 100644
}
static MetaDrmBuffer *
@@ -1313,10 +1366,36 @@ swap_buffer_result_feedback (const MetaKmsFeedback *kms_feedback,
@@ -1351,10 +1395,36 @@ swap_buffer_result_feedback (const MetaKmsFeedback *kms_feedback,
g_warning ("Page flip failed: %s", error->message);
frame_info = cogl_onscreen_peek_head_frame_info (onscreen);
@ -1892,7 +1598,7 @@ index db4bbe0f1..a166e31f5 100644
}
static const MetaKmsResultListenerVtable swap_buffer_result_listener_vtable = {
@@ -1336,53 +1415,41 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1374,53 +1444,41 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
@ -1960,7 +1666,7 @@ index db4bbe0f1..a166e31f5 100644
cogl_onscreen_egl_maybe_create_timestamp_query (onscreen, frame_info);
parent_class = COGL_ONSCREEN_CLASS (meta_onscreen_native_parent_class);
@@ -1445,15 +1512,86 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1483,15 +1541,86 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
#endif
}
@ -2051,7 +1757,7 @@ index db4bbe0f1..a166e31f5 100644
kms_update = meta_frame_native_ensure_kms_update (frame_native,
kms_device);
meta_kms_update_add_result_listener (kms_update,
@@ -1475,13 +1613,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1513,13 +1642,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
{
meta_renderer_native_queue_power_save_page_flip (renderer_native,
onscreen);
@ -2066,7 +1772,7 @@ index db4bbe0f1..a166e31f5 100644
switch (renderer_gpu_data->mode)
{
@@ -1496,8 +1632,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1534,8 +1661,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update = meta_frame_native_steal_kms_update (frame_native);
meta_renderer_native_queue_mode_set_update (renderer_native,
kms_update);
@ -2075,7 +1781,7 @@ index db4bbe0f1..a166e31f5 100644
return;
}
else if (meta_renderer_native_has_pending_mode_set (renderer_native))
@@ -1511,8 +1645,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1549,8 +1674,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
meta_frame_native_steal_kms_update (frame_native);
meta_renderer_native_post_mode_set_updates (renderer_native);
@ -2084,7 +1790,7 @@ index db4bbe0f1..a166e31f5 100644
return;
}
break;
@@ -1528,8 +1660,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1566,8 +1689,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update);
meta_renderer_native_post_mode_set_updates (renderer_native);
@ -2093,7 +1799,7 @@ index db4bbe0f1..a166e31f5 100644
return;
}
break;
@@ -1543,7 +1673,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1581,7 +1702,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update = meta_frame_native_steal_kms_update (frame_native);
@ -2102,7 +1808,7 @@ index db4bbe0f1..a166e31f5 100644
{
int sync_fd;
@@ -1553,13 +1683,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1591,13 +1712,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
meta_kms_device_post_update (kms_device, kms_update,
META_KMS_UPDATE_FLAG_NONE);
@ -2116,7 +1822,7 @@ index db4bbe0f1..a166e31f5 100644
}
gboolean
@@ -1627,11 +1750,11 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
@@ -1665,11 +1779,11 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
G_IO_ERROR_PERMISSION_DENIED))
{
ClutterStageView *view = CLUTTER_STAGE_VIEW (onscreen_native->view);
@ -2132,7 +1838,7 @@ index db4bbe0f1..a166e31f5 100644
g_warning ("Direct scanout page flip failed: %s", error->message);
@@ -1644,7 +1767,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
@@ -1682,7 +1796,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
meta_onscreen_native_notify_frame_complete (onscreen);
@ -2141,7 +1847,7 @@ index db4bbe0f1..a166e31f5 100644
}
static const MetaKmsResultListenerVtable scanout_result_listener_vtable = {
@@ -1696,13 +1819,24 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
@@ -1734,13 +1848,24 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
return FALSE;
}
@ -2168,7 +1874,7 @@ index db4bbe0f1..a166e31f5 100644
meta_frame_native_set_scanout (frame_native, scanout);
meta_frame_native_set_buffer (frame_native,
@@ -1949,22 +2083,79 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
@@ -1987,22 +2112,79 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc);
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
MetaKmsUpdate *kms_update;
@ -2256,7 +1962,7 @@ index db4bbe0f1..a166e31f5 100644
meta_kms_update_add_result_listener (kms_update,
&finish_frame_result_listener_vtable,
NULL,
@@ -1987,7 +2178,17 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
@@ -2025,7 +2207,17 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
meta_kms_update_set_flushing (kms_update, kms_crtc);
meta_kms_device_post_update (kms_device, kms_update,
META_KMS_UPDATE_FLAG_NONE);
@ -2275,7 +1981,7 @@ index db4bbe0f1..a166e31f5 100644
}
static gboolean
@@ -2714,7 +2915,10 @@ init_secondary_gpu_state (MetaRendererNative *renderer_native,
@@ -2731,7 +2923,10 @@ init_secondary_gpu_state (MetaRendererNative *renderer_native,
onscreen,
renderer_gpu_data,
&local_error))
@ -2287,7 +1993,7 @@ index db4bbe0f1..a166e31f5 100644
g_warning ("Secondary GPU initialization failed (%s). "
"Falling back to GPU-less mode instead, so the "
@@ -2898,6 +3102,8 @@ meta_onscreen_native_dispose (GObject *object)
@@ -2915,6 +3110,8 @@ meta_onscreen_native_dispose (GObject *object)
meta_onscreen_native_detach (onscreen_native);
g_clear_pointer (&onscreen_native->next_frame, clutter_frame_unref);
@ -2309,106 +2015,8 @@ index 0e1193325..e30357d19 100644
void meta_onscreen_native_set_view (CoglOnscreen *onscreen,
MetaRendererView *view);
diff --git a/src/backends/native/meta-renderer-native-gles3.c b/src/backends/native/meta-renderer-native-gles3.c
index 159e2daef..51a449a96 100644
--- a/src/backends/native/meta-renderer-native-gles3.c
+++ b/src/backends/native/meta-renderer-native-gles3.c
@@ -352,21 +352,12 @@ meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
MetaGles3 *gles3,
EGLDisplay egl_display,
EGLContext egl_context,
- EGLSurface egl_surface,
+ EGLImageKHR egl_image,
struct gbm_bo *shared_bo,
GError **error)
{
- int shared_bo_fd;
unsigned int width;
unsigned int height;
- uint32_t i, n_planes;
- uint32_t strides[4] = { 0 };
- uint32_t offsets[4] = { 0 };
- uint64_t modifiers[4] = { 0 };
- int fds[4] = { -1, -1, -1, -1 };
- uint32_t format;
- EGLImageKHR egl_image;
- gboolean use_modifiers;
GQuark context_data_quark;
ContextData *context_data;
gboolean can_blit;
@@ -390,57 +381,14 @@ meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
gbm_bo_get_format (shared_bo),
gbm_bo_get_modifier (shared_bo));
- shared_bo_fd = gbm_bo_get_fd (shared_bo);
- if (shared_bo_fd < 0)
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Failed to export gbm_bo: %s", strerror (errno));
- return FALSE;
- }
-
width = gbm_bo_get_width (shared_bo);
height = gbm_bo_get_height (shared_bo);
- format = gbm_bo_get_format (shared_bo);
-
- n_planes = gbm_bo_get_plane_count (shared_bo);
- for (i = 0; i < n_planes; i++)
- {
- strides[i] = gbm_bo_get_stride_for_plane (shared_bo, i);
- offsets[i] = gbm_bo_get_offset (shared_bo, i);
- modifiers[i] = gbm_bo_get_modifier (shared_bo);
- fds[i] = shared_bo_fd;
- }
-
- /* Workaround for https://gitlab.gnome.org/GNOME/mutter/issues/18 */
- if (modifiers[0] == DRM_FORMAT_MOD_LINEAR ||
- modifiers[0] == DRM_FORMAT_MOD_INVALID)
- use_modifiers = FALSE;
- else
- use_modifiers = TRUE;
-
- egl_image = meta_egl_create_dmabuf_image (egl,
- egl_display,
- width,
- height,
- format,
- n_planes,
- fds,
- strides,
- offsets,
- use_modifiers ? modifiers : NULL,
- error);
- close (shared_bo_fd);
-
- if (!egl_image)
- return FALSE;
if (can_blit)
blit_egl_image (gles3, egl_image, width, height);
else
paint_egl_image (context_data, gles3, egl_image, width, height);
- meta_egl_destroy_image (egl, egl_display, egl_image, NULL);
-
return TRUE;
}
diff --git a/src/backends/native/meta-renderer-native-gles3.h b/src/backends/native/meta-renderer-native-gles3.h
index f5791a171..6a935c7e6 100644
--- a/src/backends/native/meta-renderer-native-gles3.h
+++ b/src/backends/native/meta-renderer-native-gles3.h
@@ -30,7 +30,7 @@ gboolean meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
MetaGles3 *gles3,
EGLDisplay egl_display,
EGLContext egl_context,
- EGLSurface egl_surface,
+ EGLImageKHR egl_image,
struct gbm_bo *shared_bo,
GError **error);
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 8bcca82cb..369a68fc0 100644
index e0185699e..c15ba38ee 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -747,12 +747,17 @@ static gboolean