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 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 = 47.3 pkgver = 47.4
pkgrel = 1 pkgrel = 1
epoch = 1 epoch = 1
url = https://gitlab.gnome.org/GNOME/mutter url = https://gitlab.gnome.org/GNOME/mutter
@ -73,17 +73,17 @@ pkgbase = mutter-performance
depends = systemd-libs depends = systemd-libs
depends = wayland depends = wayland
depends = xorg-xwayland 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 = git+https://gitlab.gnome.org/GNOME/gvdb.git#commit=b54bc5da25127ef416858a3ad92e57159ff565b3
source = mr1441.patch source = mr1441.patch
source = mr3751.patch source = mr3751.patch
sha256sums = a27bfdfc513bf1fa0b5feb7616b8898fc478d4149137e488c42121d176e4d0a4 sha256sums = f589bdd2b7c4f7eb80d723b0f1e05080ec9c0e17e384918d582a0218588152aa
sha256sums = ba56c003c1c16f1f8e411f6d5213878bcf059d4d39ece100fc414228a1bf22d5 sha256sums = ba56c003c1c16f1f8e411f6d5213878bcf059d4d39ece100fc414228a1bf22d5
sha256sums = a32ff6ea20af04e62e40232644518e64d4d20c1c68bbcdfb16e6062540f80e6b sha256sums = 004a890489aa05df6bd4193b4b22415fa58d117ebeee671d57a1183c392a7dd8
sha256sums = 67943a22cb75df955fc475e5ae101984d87e4a1f51d56be5f50696cc3355a3c4 sha256sums = 67943a22cb75df955fc475e5ae101984d87e4a1f51d56be5f50696cc3355a3c4
b2sums = 65ad1b7cbb3261bbb044d31666cafa075599fadf8afd6f772a65faed73fd0b4c1d3d95e44e63efce62255b89bdf69542f15d2ea06cf3908d1b824467f6458abb b2sums = 24b61029ec913919a9a9d9a929048207e34defa433b1088aa7737efbc267dbd954197500828101e84dc5681ad95f8201f2605675d6aaf6e7e3454f1f24fa78f6
b2sums = f989bc2ceb52aad3c6a23c439df3bbc672bc11d561a247d19971d30cc85ed5d42295de40f8e55b13404ed32aa44f12307c9f5b470f2e288d1c9c8329255c43bf b2sums = f989bc2ceb52aad3c6a23c439df3bbc672bc11d561a247d19971d30cc85ed5d42295de40f8e55b13404ed32aa44f12307c9f5b470f2e288d1c9c8329255c43bf
b2sums = 031f3b4eedab7da3f92958dffd52725d083b90b93ab18b5c542534319b20f422abac5bdc8e1c444262f4a7b6041a8e5502e2c54f296b1529d51999f36b55da15 b2sums = 5a1c560bf4c671cdc17cee5e37f55337b19254598dca5fb95bc30809fef2504e40cb3350e5ad226bea5feb46b3fbc6683e9e6f212826a5ba549ba1237a34b40b
b2sums = e13742a68cd831827e88ddf1801caca39fa9c77dd8c08a851bc87914f2961119fc1a7643628fc63cad8dedf03533148539a242cca23313c250bd65867ea84d8d b2sums = e13742a68cd831827e88ddf1801caca39fa9c77dd8c08a851bc87914f2961119fc1a7643628fc63cad8dedf03533148539a242cca23313c250bd65867ea84d8d
pkgname = mutter-performance pkgname = mutter-performance

View file

@ -20,7 +20,7 @@ _merge_requests_to_use=('1441' '3751')
_pkgname=mutter _pkgname=mutter
pkgname=mutter-performance pkgname=mutter-performance
epoch=1 epoch=1
pkgver=47.3 pkgver=47.4
pkgrel=1 pkgrel=1
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"
@ -97,18 +97,18 @@ makedepends=(
xorg-server xorg-server
xorg-server-xvfb xorg-server-xvfb
) )
_commit=a5e1f011268ca128d1d3d1f3d4b15b760459ad4a # tags/47.3^0 _commit=96e62be1022a45b7012d5a97b667b28dad13f74b # tags/47.4^0
source=("git+$url.git#commit=$_commit" source=("git+$url.git#commit=$_commit"
"git+https://gitlab.gnome.org/GNOME/gvdb.git#commit=b54bc5da25127ef416858a3ad92e57159ff565b3" "git+https://gitlab.gnome.org/GNOME/gvdb.git#commit=b54bc5da25127ef416858a3ad92e57159ff565b3"
'mr1441.patch' 'mr1441.patch'
'mr3751.patch') 'mr3751.patch')
sha256sums=('a27bfdfc513bf1fa0b5feb7616b8898fc478d4149137e488c42121d176e4d0a4' sha256sums=('f589bdd2b7c4f7eb80d723b0f1e05080ec9c0e17e384918d582a0218588152aa'
'ba56c003c1c16f1f8e411f6d5213878bcf059d4d39ece100fc414228a1bf22d5' 'ba56c003c1c16f1f8e411f6d5213878bcf059d4d39ece100fc414228a1bf22d5'
'a32ff6ea20af04e62e40232644518e64d4d20c1c68bbcdfb16e6062540f80e6b' '004a890489aa05df6bd4193b4b22415fa58d117ebeee671d57a1183c392a7dd8'
'67943a22cb75df955fc475e5ae101984d87e4a1f51d56be5f50696cc3355a3c4') '67943a22cb75df955fc475e5ae101984d87e4a1f51d56be5f50696cc3355a3c4')
b2sums=('65ad1b7cbb3261bbb044d31666cafa075599fadf8afd6f772a65faed73fd0b4c1d3d95e44e63efce62255b89bdf69542f15d2ea06cf3908d1b824467f6458abb' b2sums=('24b61029ec913919a9a9d9a929048207e34defa433b1088aa7737efbc267dbd954197500828101e84dc5681ad95f8201f2605675d6aaf6e7e3454f1f24fa78f6'
'f989bc2ceb52aad3c6a23c439df3bbc672bc11d561a247d19971d30cc85ed5d42295de40f8e55b13404ed32aa44f12307c9f5b470f2e288d1c9c8329255c43bf' 'f989bc2ceb52aad3c6a23c439df3bbc672bc11d561a247d19971d30cc85ed5d42295de40f8e55b13404ed32aa44f12307c9f5b470f2e288d1c9c8329255c43bf'
'031f3b4eedab7da3f92958dffd52725d083b90b93ab18b5c542534319b20f422abac5bdc8e1c444262f4a7b6041a8e5502e2c54f296b1529d51999f36b55da15' '5a1c560bf4c671cdc17cee5e37f55337b19254598dca5fb95bc30809fef2504e40cb3350e5ad226bea5feb46b3fbc6683e9e6f212826a5ba549ba1237a34b40b'
'e13742a68cd831827e88ddf1801caca39fa9c77dd8c08a851bc87914f2961119fc1a7643628fc63cad8dedf03533148539a242cca23313c250bd65867ea84d8d') 'e13742a68cd831827e88ddf1801caca39fa9c77dd8c08a851bc87914f2961119fc1a7643628fc63cad8dedf03533148539a242cca23313c250bd65867ea84d8d')
pkgver() { 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> 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 Subject: [PATCH] Merge branch 'sungmg-triple-buffering-v4-47' into gnome-47
Use triple buffering if and when the previous frame is running late. 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 Origin: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441
Source: https://git.saltyming.net/sungmg/mutter-performance-source 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/3961
Included: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4027 Included: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4069
Included: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4057
Signed-off-by: Mingi Sung <sungmg@saltyming.net> 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-clock.h | 11 +-
clutter/clutter/clutter-frame-private.h | 1 + clutter/clutter/clutter-frame-private.h | 1 +
clutter/clutter/clutter-frame.c | 13 + clutter/clutter/clutter-frame.c | 13 +
@ -35,20 +34,16 @@ Signed-off-by: Mingi Sung <sungmg@saltyming.net>
cogl/cogl/cogl-onscreen.c | 8 + cogl/cogl/cogl-onscreen.c | 8 +
doc/clutter-frame-scheduling.md | 17 +- doc/clutter-frame-scheduling.md | 17 +-
src/backends/meta-stage-impl.c | 2 + 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.c | 31 ++
src/backends/native/meta-frame-native.h | 9 + 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.c | 9 +
src/backends/native/meta-kms.h | 2 + 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-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/backends/native/meta-renderer-native.c | 35 +-
src/tests/native-kms-render.c | 106 ++++- src/tests/native-kms-render.c | 106 +++++-
23 files changed, 1093 insertions(+), 373 deletions(-) 19 files changed, 937 insertions(+), 268 deletions(-)
diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c
index 0cc1f2eb4..d5c403201 100644 index 0cc1f2eb4..d5c403201 100644
@ -1119,7 +1114,7 @@ index 34f0770bd..905e399a6 100644
+ +
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFrame, clutter_frame_unref) 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 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 --- a/clutter/clutter/clutter-stage-view.c
+++ b/clutter/clutter/clutter-stage-view.c +++ b/clutter/clutter/clutter-stage-view.c
@@ -1076,8 +1076,9 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock, @@ -1076,8 +1076,9 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
@ -1146,10 +1141,10 @@ index e732d3fd0..c7c392592 100644
+COGL_EXPORT unsigned int +COGL_EXPORT unsigned int
+cogl_onscreen_get_pending_frame_count (CoglOnscreen *onscreen); +cogl_onscreen_get_pending_frame_count (CoglOnscreen *onscreen);
diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c 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 --- a/cogl/cogl/cogl-onscreen.c
+++ b/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); 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, if (meta_stage_impl_scanout_view (stage_impl,
stage_view, stage_view,
scanout, 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 diff --git a/src/backends/native/meta-frame-native.c b/src/backends/native/meta-frame-native.c
index 70461be32..8dc9dba9b 100644 index 70461be32..8dc9dba9b 100644
--- a/src/backends/native/meta-frame-native.c --- a/src/backends/native/meta-frame-native.c
@ -1534,10 +1269,10 @@ index 3df4eff78..84bd43b8c 100644
+meta_frame_native_get_damage (MetaFrameNative *frame_native, +meta_frame_native_get_damage (MetaFrameNative *frame_native,
+ int **rectangles); + int **rectangles);
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c 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 --- a/src/backends/native/meta-kms-impl-device.c
+++ b/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); MetaThreadImpl *thread_impl = META_THREAD_IMPL (kms_impl);
MetaThread *thread = meta_thread_impl_get_thread (thread_impl); MetaThread *thread = meta_thread_impl_get_thread (thread_impl);
MetaKmsFeedback *feedback; MetaKmsFeedback *feedback;
@ -1613,10 +1348,10 @@ index f5ec4c1c3..77fd62662 100644
MetaKmsFlags flags, MetaKmsFlags flags,
GError **error); GError **error);
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c 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 --- a/src/backends/native/meta-onscreen-native.c
+++ b/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 { struct {
MetaDrmBufferDumb *current_dumb_fb; MetaDrmBufferDumb *current_dumb_fb;
@ -1625,7 +1360,7 @@ index db4bbe0f1..a166e31f5 100644
} cpu; } cpu;
gboolean noted_primary_gpu_copy_ok; gboolean noted_primary_gpu_copy_ok;
@@ -102,8 +102,11 @@ struct _MetaOnscreenNative @@ -103,8 +103,11 @@ struct _MetaOnscreenNative
MetaCrtc *crtc; MetaCrtc *crtc;
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state; MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
@ -1637,7 +1372,7 @@ index db4bbe0f1..a166e31f5 100644
ClutterFrame *next_frame; ClutterFrame *next_frame;
struct { struct {
@@ -118,6 +121,9 @@ struct _MetaOnscreenNative @@ -119,6 +122,9 @@ struct _MetaOnscreenNative
} egl; } egl;
#endif #endif
@ -1647,7 +1382,7 @@ index db4bbe0f1..a166e31f5 100644
gboolean frame_sync_requested; gboolean frame_sync_requested;
gboolean frame_sync_enabled; 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; static GQuark blit_source_quark = 0;
@ -1661,7 +1396,7 @@ index db4bbe0f1..a166e31f5 100644
static gboolean static gboolean
init_secondary_gpu_state (MetaRendererNative *renderer_native, init_secondary_gpu_state (MetaRendererNative *renderer_native,
CoglOnscreen *onscreen, 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); MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
@ -1686,7 +1421,7 @@ index db4bbe0f1..a166e31f5 100644
} }
static void 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); 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_frame_sync (onscreen, info);
_cogl_onscreen_notify_complete (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_notify_frame_complete (onscreen);
meta_onscreen_native_swap_drm_fb (onscreen); meta_onscreen_native_swap_drm_fb (onscreen);
@ -1703,7 +1438,7 @@ index db4bbe0f1..a166e31f5 100644
} }
static void 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 = CoglFramebuffer *framebuffer =
clutter_stage_view_get_onscreen (CLUTTER_STAGE_VIEW (view)); clutter_stage_view_get_onscreen (CLUTTER_STAGE_VIEW (view));
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
@ -1720,7 +1455,7 @@ index db4bbe0f1..a166e31f5 100644
} }
static void 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); meta_onscreen_native_notify_frame_complete (onscreen);
@ -1730,7 +1465,7 @@ index db4bbe0f1..a166e31f5 100644
} }
static const MetaKmsPageFlipListenerVtable page_flip_listener_vtable = { 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 */ #endif /* HAVE_EGL_DEVICE */
@ -1773,7 +1508,7 @@ index db4bbe0f1..a166e31f5 100644
static void static void
apply_transform (MetaCrtcKms *crtc_kms, apply_transform (MetaCrtcKms *crtc_kms,
MetaKmsPlaneAssignment *kms_plane_assignment, 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); MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
MetaRendererNative *renderer_native = onscreen_native->renderer_native; MetaRendererNative *renderer_native = onscreen_native->renderer_native;
@ -1782,7 +1517,7 @@ index db4bbe0f1..a166e31f5 100644
MetaFrameNative *frame_native; MetaFrameNative *frame_native;
MetaGpuKms *render_gpu = onscreen_native->render_gpu; MetaGpuKms *render_gpu = onscreen_native->render_gpu;
MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc); 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, COGL_TRACE_BEGIN_SCOPED (MetaOnscreenNativeFlipCrtcs,
"Meta::OnscreenNative::flip_crtc()"); "Meta::OnscreenNative::flip_crtc()");
@ -1790,7 +1525,7 @@ index db4bbe0f1..a166e31f5 100644
g_return_if_fail (frame); g_return_if_fail (frame);
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc)); 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 #endif
} }
@ -1801,36 +1536,7 @@ index db4bbe0f1..a166e31f5 100644
meta_kms_update_add_page_flip_listener (kms_update, meta_kms_update_add_page_flip_listener (kms_update,
kms_crtc, kms_crtc,
&page_flip_listener_vtable, &page_flip_listener_vtable,
@@ -854,6 +893,7 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen, @@ -1007,12 +1046,17 @@ static MetaDrmBufferDumb *
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 *
secondary_gpu_get_next_dumb_buffer (MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state) secondary_gpu_get_next_dumb_buffer (MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state)
{ {
MetaDrmBufferDumb *current_dumb_fb; MetaDrmBufferDumb *current_dumb_fb;
@ -1852,7 +1558,7 @@ index db4bbe0f1..a166e31f5 100644
} }
static MetaDrmBuffer * 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); g_warning ("Page flip failed: %s", error->message);
frame_info = cogl_onscreen_peek_head_frame_info (onscreen); 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 = { 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; CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform; MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native; 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); cogl_onscreen_egl_maybe_create_timestamp_query (onscreen, frame_info);
parent_class = COGL_ONSCREEN_CLASS (meta_onscreen_native_parent_class); 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 #endif
} }
@ -2051,7 +1757,7 @@ index db4bbe0f1..a166e31f5 100644
kms_update = meta_frame_native_ensure_kms_update (frame_native, kms_update = meta_frame_native_ensure_kms_update (frame_native,
kms_device); kms_device);
meta_kms_update_add_result_listener (kms_update, 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, meta_renderer_native_queue_power_save_page_flip (renderer_native,
onscreen); onscreen);
@ -2066,7 +1772,7 @@ index db4bbe0f1..a166e31f5 100644
switch (renderer_gpu_data->mode) 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); kms_update = meta_frame_native_steal_kms_update (frame_native);
meta_renderer_native_queue_mode_set_update (renderer_native, meta_renderer_native_queue_mode_set_update (renderer_native,
kms_update); kms_update);
@ -2075,7 +1781,7 @@ index db4bbe0f1..a166e31f5 100644
return; return;
} }
else if (meta_renderer_native_has_pending_mode_set (renderer_native)) 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_frame_native_steal_kms_update (frame_native);
meta_renderer_native_post_mode_set_updates (renderer_native); meta_renderer_native_post_mode_set_updates (renderer_native);
@ -2084,7 +1790,7 @@ index db4bbe0f1..a166e31f5 100644
return; return;
} }
break; 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); kms_update);
meta_renderer_native_post_mode_set_updates (renderer_native); meta_renderer_native_post_mode_set_updates (renderer_native);
@ -2093,7 +1799,7 @@ index db4bbe0f1..a166e31f5 100644
return; return;
} }
break; 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); kms_update = meta_frame_native_steal_kms_update (frame_native);
@ -2102,7 +1808,7 @@ index db4bbe0f1..a166e31f5 100644
{ {
int sync_fd; 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_device_post_update (kms_device, kms_update,
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
@ -2116,7 +1822,7 @@ index db4bbe0f1..a166e31f5 100644
} }
gboolean 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)) G_IO_ERROR_PERMISSION_DENIED))
{ {
ClutterStageView *view = CLUTTER_STAGE_VIEW (onscreen_native->view); 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); 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; frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
meta_onscreen_native_notify_frame_complete (onscreen); meta_onscreen_native_notify_frame_complete (onscreen);
@ -2141,7 +1847,7 @@ index db4bbe0f1..a166e31f5 100644
} }
static const MetaKmsResultListenerVtable scanout_result_listener_vtable = { 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; return FALSE;
} }
@ -2168,7 +1874,7 @@ index db4bbe0f1..a166e31f5 100644
meta_frame_native_set_scanout (frame_native, scanout); meta_frame_native_set_scanout (frame_native, scanout);
meta_frame_native_set_buffer (frame_native, 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); MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc);
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame); MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
MetaKmsUpdate *kms_update; MetaKmsUpdate *kms_update;
@ -2256,7 +1962,7 @@ index db4bbe0f1..a166e31f5 100644
meta_kms_update_add_result_listener (kms_update, meta_kms_update_add_result_listener (kms_update,
&finish_frame_result_listener_vtable, &finish_frame_result_listener_vtable,
NULL, 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_update_set_flushing (kms_update, kms_crtc);
meta_kms_device_post_update (kms_device, kms_update, meta_kms_device_post_update (kms_device, kms_update,
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
@ -2275,7 +1981,7 @@ index db4bbe0f1..a166e31f5 100644
} }
static gboolean 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, onscreen,
renderer_gpu_data, renderer_gpu_data,
&local_error)) &local_error))
@ -2287,7 +1993,7 @@ index db4bbe0f1..a166e31f5 100644
g_warning ("Secondary GPU initialization failed (%s). " g_warning ("Secondary GPU initialization failed (%s). "
"Falling back to GPU-less mode instead, so the " "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); meta_onscreen_native_detach (onscreen_native);
g_clear_pointer (&onscreen_native->next_frame, clutter_frame_unref); 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, void meta_onscreen_native_set_view (CoglOnscreen *onscreen,
MetaRendererView *view); 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 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 --- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c
@@ -747,12 +747,17 @@ static gboolean @@ -747,12 +747,17 @@ static gboolean