Sync to main
Signed-off-by: Mingi Sung <me@saltyming.pe.kr>
This commit is contained in:
parent
8b9a80453d
commit
b67260a087
5 changed files with 58 additions and 525 deletions
18
.SRCINFO
18
.SRCINFO
|
@ -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 = 46.0+r20+g34d79b9dd
|
||||
pkgver = 46.0+r49+gd53da3819
|
||||
pkgrel = 1
|
||||
epoch = 1
|
||||
url = https://gitlab.gnome.org/GNOME/mutter
|
||||
|
@ -72,21 +72,15 @@ pkgbase = mutter-performance
|
|||
depends = systemd-libs
|
||||
depends = wayland
|
||||
depends = xorg-xwayland
|
||||
source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=34d79b9ddf2b2455dbde78372e7355e8b6f95e96
|
||||
source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=d53da38198947754bd7e9cc264d6073caeb2447b
|
||||
source = mr1441.patch
|
||||
source = mr3304.patch
|
||||
source = mr3373.patch
|
||||
source = mr3674.patch
|
||||
sha256sums = d7cac80530a925413d6f69139fa0aa77468d547e5a71de4d04fbb5e69cf09a70
|
||||
sha256sums = e5b85a47436cfac47f76f53e540f3e36886e65a991b1dbecbf5756eb062a8ea6
|
||||
sha256sums = 90261cf4b2133ed3bf8c9c9e37c72ce816e5b0d75b55ae0c3899f7ef5809d593
|
||||
sha256sums = 4a87fac85b97038d1b3b1e831c84f9a038d5ff68b68d4f8dced718d337321267
|
||||
sha256sums = 1a0e4ca2ebf32c9b75085114cb1c6856e6f35ea3a157a7e2c5be765466716a34
|
||||
sha256sums = 3e1f07b696ad37b1c639a524c092cd9259444bc6156542901ccaec936bea240f
|
||||
sha256sums = 414e1dad3e527fc6f9ef6e5006700d97738bef6de9b087af9e232a2084b0ac88
|
||||
b2sums = c3b55a34d1abd3a3e381593741ee0ffc14feebcb8725da92e99829452638abbe596e5149f9ac1460b01b8e5f40c84848ca8b8cedbfe28c8359208ccf7cbb9f74
|
||||
b2sums = 75fb3ae1d4149c1cd82ae5cc23335e6d517665ba0527c6cbe112585706fa5191fb67e3264402527229185c0f6fc6638bb604243bb7c8123b7acc0b0a4379ba7e
|
||||
b2sums = f53c0a7cf5fe400e83379be5e3694dba0668e0917b5bf29c485cef802660e38176ab856118a030ddc87bd49b75d0dd6f9e0d8f32d2b2ef27ebb1737f8914bf21
|
||||
b2sums = 85e630084b973eabc831f5f870b1bef1aad344151cc77bc5cc99323dfd6dc16ea8aaa2b2c7660a5d9ae1201cb389a2a91705d491a09b32a8a3e620663c6bfb75
|
||||
b2sums = a40fdd0d5c01c0bd5cea98e8aeae6d313834a863b2c4789aea107c8318ab63783a5e4cb92759f3c2b74e8fcac5775b7fa14bf7d11692524f8d0a46f67ac532d6
|
||||
b2sums = 71f10db4ebe04a787940c7048131eac67cffd3ec8e415cfc961b8041b881f272650581e9df273e2a8da23a50ec9151c790dc2d5ecc0309ab2847a22f8c922c9c
|
||||
b2sums = 12b128e46f47c077b504f2707a8b0ba407617b50c267f785982dc62ab3045202abe1cce3dfbb49b80fb27b70c2ff5dc188155c93cf7131bebda2e4f1f77077f6
|
||||
|
||||
pkgname = mutter-performance
|
||||
groups = gnome
|
||||
|
|
44
PKGBUILD
44
PKGBUILD
|
@ -11,8 +11,8 @@
|
|||
|
||||
### PACKAGE OPTIONS
|
||||
## MERGE REQUESTS SELECTION
|
||||
# Merge Requests List: ('579' '1441' '3304' '3373' '3674')
|
||||
_merge_requests_to_use=('1441' '3304' '3373' '3674')
|
||||
# Merge Requests List: ('579' '1441' '3373')
|
||||
_merge_requests_to_use=('1441' '3373')
|
||||
|
||||
## Disable building the DOCS package (Enabled if not set)
|
||||
# Remember to unset this variable when producing .SRCINFO
|
||||
|
@ -32,7 +32,7 @@ else
|
|||
pkgname=(mutter-performance mutter-performance-docs)
|
||||
fi
|
||||
epoch=1
|
||||
pkgver=46.0+r20+g34d79b9dd
|
||||
pkgver=46.0+r49+gd53da3819
|
||||
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"
|
||||
|
@ -111,22 +111,16 @@ makedepends=(
|
|||
if [ -n "$_enable_check" ]; then
|
||||
checkdepends=(gnome-session xorg-server-xvfb pipewire-session-manager python-dbusmock zenity)
|
||||
fi
|
||||
_commit=34d79b9ddf2b2455dbde78372e7355e8b6f95e96 # tags/46.0^20
|
||||
_commit=d53da38198947754bd7e9cc264d6073caeb2447b # tags/46.0^49
|
||||
source=("git+https://gitlab.gnome.org/GNOME/mutter.git#commit=$_commit"
|
||||
'mr1441.patch'
|
||||
'mr3304.patch'
|
||||
'mr3373.patch'
|
||||
'mr3674.patch')
|
||||
sha256sums=('d7cac80530a925413d6f69139fa0aa77468d547e5a71de4d04fbb5e69cf09a70'
|
||||
'e5b85a47436cfac47f76f53e540f3e36886e65a991b1dbecbf5756eb062a8ea6'
|
||||
'90261cf4b2133ed3bf8c9c9e37c72ce816e5b0d75b55ae0c3899f7ef5809d593'
|
||||
'3e1f07b696ad37b1c639a524c092cd9259444bc6156542901ccaec936bea240f'
|
||||
'414e1dad3e527fc6f9ef6e5006700d97738bef6de9b087af9e232a2084b0ac88')
|
||||
b2sums=('c3b55a34d1abd3a3e381593741ee0ffc14feebcb8725da92e99829452638abbe596e5149f9ac1460b01b8e5f40c84848ca8b8cedbfe28c8359208ccf7cbb9f74'
|
||||
'75fb3ae1d4149c1cd82ae5cc23335e6d517665ba0527c6cbe112585706fa5191fb67e3264402527229185c0f6fc6638bb604243bb7c8123b7acc0b0a4379ba7e'
|
||||
'f53c0a7cf5fe400e83379be5e3694dba0668e0917b5bf29c485cef802660e38176ab856118a030ddc87bd49b75d0dd6f9e0d8f32d2b2ef27ebb1737f8914bf21'
|
||||
'71f10db4ebe04a787940c7048131eac67cffd3ec8e415cfc961b8041b881f272650581e9df273e2a8da23a50ec9151c790dc2d5ecc0309ab2847a22f8c922c9c'
|
||||
'12b128e46f47c077b504f2707a8b0ba407617b50c267f785982dc62ab3045202abe1cce3dfbb49b80fb27b70c2ff5dc188155c93cf7131bebda2e4f1f77077f6')
|
||||
'mr3373.patch')
|
||||
sha256sums=('4a87fac85b97038d1b3b1e831c84f9a038d5ff68b68d4f8dced718d337321267'
|
||||
'1a0e4ca2ebf32c9b75085114cb1c6856e6f35ea3a157a7e2c5be765466716a34'
|
||||
'3e1f07b696ad37b1c639a524c092cd9259444bc6156542901ccaec936bea240f')
|
||||
b2sums=('85e630084b973eabc831f5f870b1bef1aad344151cc77bc5cc99323dfd6dc16ea8aaa2b2c7660a5d9ae1201cb389a2a91705d491a09b32a8a3e620663c6bfb75'
|
||||
'a40fdd0d5c01c0bd5cea98e8aeae6d313834a863b2c4789aea107c8318ab63783a5e4cb92759f3c2b74e8fcac5775b7fa14bf7d11692524f8d0a46f67ac532d6'
|
||||
'71f10db4ebe04a787940c7048131eac67cffd3ec8e415cfc961b8041b881f272650581e9df273e2a8da23a50ec9151c790dc2d5ecc0309ab2847a22f8c922c9c')
|
||||
|
||||
pkgver() {
|
||||
cd $_pkgname
|
||||
|
@ -209,14 +203,6 @@ prepare() {
|
|||
# If you use stenography software or play hardcore rhythm games like Lunatic Rave 2/osumania, use it.
|
||||
pick_mr '579' ce86f90efbaa51522ba14c5b4cad933c2106de42 'revert'
|
||||
|
||||
# Title: Nvidia secondary GPU copy acceleration
|
||||
# Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
|
||||
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3304
|
||||
# Type: 3
|
||||
# Status: 2
|
||||
# Comment: This fixes three issues that were preventing GPU copies on the Nvidia proprietary driver.
|
||||
pick_mr '3304' 'mr3304.patch' 'patch'
|
||||
|
||||
# Title: kms/crtc: Increase default deadline evasion to 1000 microseconds
|
||||
# Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
|
||||
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3373
|
||||
|
@ -225,14 +211,6 @@ prepare() {
|
|||
# Comment: This fix cursor stutter.
|
||||
pick_mr '3373' 'mr3373.patch' 'patch'
|
||||
|
||||
# Title: drm-buffer-gbm: Do not call ensure_fb_id from lock_front
|
||||
# Author: Michel Dänzer <mdaenzer@redhat.com>
|
||||
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3674
|
||||
# Type: 3
|
||||
# Status: Reviewed and to be merged.
|
||||
# Comment: This closes #3389
|
||||
pick_mr '3674' 'mr3674.patch' 'patch'
|
||||
|
||||
# Title: Draft: Dynamic triple/double buffering (v4)
|
||||
# Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
|
||||
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441
|
||||
|
|
80
mr1441.patch
80
mr1441.patch
|
@ -1,7 +1,7 @@
|
|||
Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
|
||||
Source: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441
|
||||
Commit: c8d1c9273bfb654ac2e35135a2754e3e0860cf79
|
||||
Last Updated: 04/04/24 (Mutter 46.0+r12)
|
||||
Commit: 745d25c4fc20e8bf474e00756fa93a0c63d3b816
|
||||
Last Updated: 04/17/24 (Mutter 46.0+r49)
|
||||
---
|
||||
|
||||
Use triple buffering if and when the previous frame is running late.
|
||||
|
@ -779,10 +779,10 @@ index 959a60533b3fac8fbe2bf791d3228f54e302fb98..86d8ea2d5ff3dbc15f41627475cd8ebf
|
|||
+COGL_EXPORT unsigned int
|
||||
+cogl_onscreen_count_pending_frames (CoglOnscreen *onscreen);
|
||||
diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c
|
||||
index f4b460a83f122047a730a56386d6f28b2716aa6e..3e3f73a69faa9c0cbc685bb71f01b56183391edf 100644
|
||||
index afb648bcd8110979cc6c0dbe21481822660d2e4e..086be7ed7a9292013842516e9428808080c8eaf6 100644
|
||||
--- a/cogl/cogl/cogl-onscreen.c
|
||||
+++ b/cogl/cogl/cogl-onscreen.c
|
||||
@@ -511,6 +511,14 @@ cogl_onscreen_pop_head_frame_info (CoglOnscreen *onscreen)
|
||||
@@ -515,6 +515,14 @@ cogl_onscreen_pop_head_frame_info (CoglOnscreen *onscreen)
|
||||
return g_queue_pop_head (&priv->pending_frame_infos);
|
||||
}
|
||||
|
||||
|
@ -875,10 +875,10 @@ index 74340140639f14a6913dec269f014e7be42d6db0..f6b19520bec5c13b8685bea139a48b13
|
|||
MetaKmsFlags flags,
|
||||
GError **error);
|
||||
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
|
||||
index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910cf424dec 100644
|
||||
index 1a31f04a164d9acf05523555cb2f515b23a526cc..9836663d0c7f481d82c8715f1d856a0662a3218a 100644
|
||||
--- a/src/backends/native/meta-onscreen-native.c
|
||||
+++ b/src/backends/native/meta-onscreen-native.c
|
||||
@@ -75,7 +75,7 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
|
||||
@@ -76,7 +76,7 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
|
||||
|
||||
struct {
|
||||
MetaDrmBufferDumb *current_dumb_fb;
|
||||
|
@ -887,7 +887,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
} cpu;
|
||||
|
||||
gboolean noted_primary_gpu_copy_ok;
|
||||
@@ -97,9 +97,13 @@ struct _MetaOnscreenNative
|
||||
@@ -98,9 +98,13 @@ struct _MetaOnscreenNative
|
||||
struct {
|
||||
struct gbm_surface *surface;
|
||||
MetaDrmBuffer *current_fb;
|
||||
|
@ -901,7 +901,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
} gbm;
|
||||
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
@@ -124,6 +128,16 @@ struct _MetaOnscreenNative
|
||||
@@ -125,6 +129,16 @@ struct _MetaOnscreenNative
|
||||
gulong privacy_screen_changed_handler_id;
|
||||
gulong color_space_changed_handler_id;
|
||||
gulong hdr_metadata_changed_handler_id;
|
||||
|
@ -918,7 +918,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
|
||||
@@ -131,44 +145,42 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
|
||||
@@ -132,44 +146,42 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
|
||||
|
||||
static GQuark blit_source_quark = 0;
|
||||
|
||||
|
@ -979,7 +979,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
static void
|
||||
@@ -206,7 +218,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen)
|
||||
@@ -207,7 +219,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen)
|
||||
|
||||
info = cogl_onscreen_pop_head_frame_info (onscreen);
|
||||
|
||||
|
@ -988,7 +988,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
|
||||
_cogl_onscreen_notify_frame_sync (onscreen, info);
|
||||
_cogl_onscreen_notify_complete (onscreen, info);
|
||||
@@ -242,6 +254,7 @@ notify_view_crtc_presented (MetaRendererView *view,
|
||||
@@ -243,6 +255,7 @@ notify_view_crtc_presented (MetaRendererView *view,
|
||||
|
||||
meta_onscreen_native_notify_frame_complete (onscreen);
|
||||
meta_onscreen_native_swap_drm_fb (onscreen);
|
||||
|
@ -996,7 +996,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
static void
|
||||
@@ -291,15 +304,13 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc,
|
||||
@@ -292,15 +305,13 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc,
|
||||
CoglFramebuffer *framebuffer =
|
||||
clutter_stage_view_get_onscreen (CLUTTER_STAGE_VIEW (view));
|
||||
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
|
||||
|
@ -1013,7 +1013,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
static void
|
||||
@@ -349,7 +360,8 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
|
||||
@@ -350,7 +361,8 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
|
||||
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
|
||||
|
||||
meta_onscreen_native_notify_frame_complete (onscreen);
|
||||
|
@ -1023,7 +1023,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
static const MetaKmsPageFlipListenerVtable page_flip_listener_vtable = {
|
||||
@@ -410,18 +422,41 @@ custom_egl_stream_page_flip (gpointer custom_page_flip_data,
|
||||
@@ -411,18 +423,41 @@ custom_egl_stream_page_flip (gpointer custom_page_flip_data,
|
||||
}
|
||||
#endif /* HAVE_EGL_DEVICE */
|
||||
|
||||
|
@ -1068,7 +1068,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
static void
|
||||
apply_transform (MetaCrtcKms *crtc_kms,
|
||||
MetaKmsPlaneAssignment *kms_plane_assignment,
|
||||
@@ -520,13 +555,21 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
@@ -521,13 +556,21 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
switch (renderer_gpu_data->mode)
|
||||
{
|
||||
case META_RENDERER_NATIVE_MODE_GBM:
|
||||
|
@ -1094,7 +1094,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
&dst_rect);
|
||||
}
|
||||
else
|
||||
@@ -914,12 +957,17 @@ static MetaDrmBufferDumb *
|
||||
@@ -918,12 +961,17 @@ static MetaDrmBufferDumb *
|
||||
secondary_gpu_get_next_dumb_buffer (MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state)
|
||||
{
|
||||
MetaDrmBufferDumb *current_dumb_fb;
|
||||
|
@ -1116,7 +1116,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
static MetaDrmBuffer *
|
||||
@@ -1252,10 +1300,17 @@ swap_buffer_result_feedback (const MetaKmsFeedback *kms_feedback,
|
||||
@@ -1255,10 +1303,17 @@ 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);
|
||||
|
@ -1137,7 +1137,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
static const MetaKmsResultListenerVtable swap_buffer_result_listener_vtable = {
|
||||
@@ -1276,30 +1331,35 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1279,32 +1334,37 @@ 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;
|
||||
|
@ -1146,12 +1146,14 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
- MetaMonitorManager *monitor_manager =
|
||||
- meta_backend_get_monitor_manager (backend);
|
||||
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
|
||||
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
|
||||
MetaDeviceFile *render_device_file;
|
||||
ClutterFrame *frame = user_data;
|
||||
- MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
|
||||
- MetaKmsUpdate *kms_update;
|
||||
CoglOnscreenClass *parent_class;
|
||||
gboolean create_timestamp_query = TRUE;
|
||||
gboolean egl_context_changed = FALSE;
|
||||
- MetaPowerSave power_save_mode;
|
||||
g_autoptr (GError) error = NULL;
|
||||
|
@ -1182,7 +1184,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
secondary_gpu_fb =
|
||||
update_secondary_gpu_state_pre_swap_buffers (onscreen,
|
||||
rectangles,
|
||||
@@ -1358,7 +1418,17 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1379,7 +1439,17 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
switch (renderer_gpu_data->mode)
|
||||
{
|
||||
case META_RENDERER_NATIVE_MODE_GBM:
|
||||
|
@ -1201,7 +1203,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
if (onscreen_native->secondary_gpu_state)
|
||||
g_set_object (&onscreen_native->gbm.next_fb, secondary_gpu_fb);
|
||||
else
|
||||
@@ -1372,6 +1442,9 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1404,6 +1474,9 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1211,7 +1213,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
/*
|
||||
* If we changed EGL context, cogl will have the wrong idea about what is
|
||||
* current, making it fail to set it when it needs to. Avoid that by making
|
||||
@@ -1381,12 +1454,78 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1413,12 +1486,78 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
if (egl_context_changed)
|
||||
_cogl_winsys_egl_ensure_current (cogl_display);
|
||||
|
||||
|
@ -1292,7 +1294,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
kms_update = meta_frame_native_ensure_kms_update (frame_native,
|
||||
kms_device);
|
||||
meta_kms_update_add_result_listener (kms_update,
|
||||
@@ -1401,15 +1540,13 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1433,15 +1572,13 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
onscreen_native->crtc,
|
||||
kms_update,
|
||||
META_KMS_ASSIGN_PLANE_FLAG_NONE,
|
||||
|
@ -1310,7 +1312,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
return;
|
||||
}
|
||||
|
||||
@@ -1429,8 +1566,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1461,8 +1598,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);
|
||||
|
@ -1319,7 +1321,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
return;
|
||||
}
|
||||
else if (meta_renderer_native_has_pending_mode_set (renderer_native))
|
||||
@@ -1444,8 +1579,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1476,8 +1611,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);
|
||||
|
@ -1328,7 +1330,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
return;
|
||||
}
|
||||
break;
|
||||
@@ -1461,8 +1594,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1493,8 +1626,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
kms_update);
|
||||
|
||||
meta_renderer_native_post_mode_set_updates (renderer_native);
|
||||
|
@ -1337,7 +1339,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
return;
|
||||
}
|
||||
break;
|
||||
@@ -1477,7 +1608,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
@@ -1509,7 +1640,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
kms_update = meta_frame_native_steal_kms_update (frame_native);
|
||||
meta_kms_device_post_update (kms_device, kms_update,
|
||||
META_KMS_UPDATE_FLAG_NONE);
|
||||
|
@ -1345,7 +1347,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
gboolean
|
||||
@@ -1548,7 +1678,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
|
||||
@@ -1580,7 +1710,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
|
||||
|
||||
g_warning ("Direct scanout page flip failed: %s", error->message);
|
||||
|
||||
|
@ -1354,7 +1356,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
onscreen);
|
||||
clutter_stage_view_add_redraw_clip (view, NULL);
|
||||
clutter_stage_view_schedule_update_now (view);
|
||||
@@ -1558,7 +1688,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
|
||||
@@ -1590,7 +1720,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
|
||||
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
|
||||
|
||||
meta_onscreen_native_notify_frame_complete (onscreen);
|
||||
|
@ -1363,7 +1365,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
static const MetaKmsResultListenerVtable scanout_result_listener_vtable = {
|
||||
@@ -1610,6 +1740,18 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
|
||||
@@ -1642,6 +1772,18 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -1382,7 +1384,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||
render_gpu);
|
||||
|
||||
@@ -1725,11 +1867,7 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen,
|
||||
@@ -1757,11 +1899,7 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen,
|
||||
ClutterFrame *frame)
|
||||
{
|
||||
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
||||
|
@ -1394,7 +1396,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
maybe_update_frame_sync (onscreen_native, frame);
|
||||
}
|
||||
|
||||
@@ -1845,22 +1983,79 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
|
||||
@@ -1877,22 +2015,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;
|
||||
|
@ -1482,7 +1484,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
meta_kms_update_add_result_listener (kms_update,
|
||||
&finish_frame_result_listener_vtable,
|
||||
NULL,
|
||||
@@ -1883,7 +2078,19 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
|
||||
@@ -1915,7 +2110,19 @@ 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);
|
||||
|
@ -1503,7 +1505,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
}
|
||||
|
||||
static gboolean
|
||||
@@ -2789,8 +2996,11 @@ meta_onscreen_native_dispose (GObject *object)
|
||||
@@ -2830,8 +3037,11 @@ meta_onscreen_native_dispose (GObject *object)
|
||||
{
|
||||
case META_RENDERER_NATIVE_MODE_GBM:
|
||||
g_clear_object (&onscreen_native->gbm.next_fb);
|
||||
|
@ -1516,7 +1518,7 @@ index 32cbff412242ffa22f211c930506195fa2cecfa6..0254505ba50a91bf369d0f1258308910
|
|||
break;
|
||||
case META_RENDERER_NATIVE_MODE_SURFACELESS:
|
||||
g_assert_not_reached ();
|
||||
@@ -2824,6 +3034,10 @@ meta_onscreen_native_dispose (GObject *object)
|
||||
@@ -2865,6 +3075,10 @@ meta_onscreen_native_dispose (GObject *object)
|
||||
|
||||
g_clear_object (&onscreen_native->output);
|
||||
g_clear_object (&onscreen_native->crtc);
|
||||
|
@ -1541,10 +1543,10 @@ index 0e1193325a958fadc28e1177d61171fe459f284d..e30357d19d1fd4544026f0f7ef6dba62
|
|||
MetaRendererView *view);
|
||||
|
||||
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
|
||||
index 7b64ff3f464c88c2075c57bc08b725000fe72c36..c32a6caa62aef211ed6ae3358b6ec9dd35c04a4d 100644
|
||||
index aa76d018ca29b56271d34d81bf39995e14093884..3c22b4e86a7cff8ed7bf378621c9ec63c6e79e5f 100644
|
||||
--- a/src/backends/native/meta-renderer-native.c
|
||||
+++ b/src/backends/native/meta-renderer-native.c
|
||||
@@ -726,12 +726,18 @@ static gboolean
|
||||
@@ -731,12 +731,18 @@ static gboolean
|
||||
dummy_power_save_page_flip_cb (gpointer user_data)
|
||||
{
|
||||
MetaRendererNative *renderer_native = user_data;
|
||||
|
@ -1565,7 +1567,7 @@ index 7b64ff3f464c88c2075c57bc08b725000fe72c36..c32a6caa62aef211ed6ae3358b6ec9dd
|
|||
renderer_native->power_save_page_flip_source_id = 0;
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
@@ -743,6 +749,9 @@ meta_renderer_native_queue_power_save_page_flip (MetaRendererNative *renderer_na
|
||||
@@ -748,6 +754,9 @@ meta_renderer_native_queue_power_save_page_flip (MetaRendererNative *renderer_na
|
||||
{
|
||||
const unsigned int timeout_ms = 100;
|
||||
|
||||
|
@ -1575,7 +1577,7 @@ index 7b64ff3f464c88c2075c57bc08b725000fe72c36..c32a6caa62aef211ed6ae3358b6ec9dd
|
|||
if (!renderer_native->power_save_page_flip_source_id)
|
||||
{
|
||||
renderer_native->power_save_page_flip_source_id =
|
||||
@@ -1524,6 +1533,26 @@ detach_onscreens (MetaRenderer *renderer)
|
||||
@@ -1529,6 +1538,26 @@ detach_onscreens (MetaRenderer *renderer)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1602,7 +1604,7 @@ index 7b64ff3f464c88c2075c57bc08b725000fe72c36..c32a6caa62aef211ed6ae3358b6ec9dd
|
|||
static void
|
||||
meta_renderer_native_rebuild_views (MetaRenderer *renderer)
|
||||
{
|
||||
@@ -1534,6 +1563,7 @@ meta_renderer_native_rebuild_views (MetaRenderer *renderer)
|
||||
@@ -1539,6 +1568,7 @@ meta_renderer_native_rebuild_views (MetaRenderer *renderer)
|
||||
MetaRendererClass *parent_renderer_class =
|
||||
META_RENDERER_CLASS (meta_renderer_native_parent_class);
|
||||
|
||||
|
|
388
mr3304.patch
388
mr3304.patch
|
@ -1,388 +0,0 @@
|
|||
Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
|
||||
Source: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3304
|
||||
Commit: 48ca241a070a6d6a757a7f4745fef6ef15a28234
|
||||
Last Updated: 01/19/24 (Mutter 46.0)
|
||||
---
|
||||
|
||||
This fixes three issues that were preventing GPU copies on the Nvidia proprietary driver:
|
||||
|
||||
gbm_surface_create is not implemented. Nvidia only implements gbm_surface_create_with_modifiers.
|
||||
Missing call to glViewport in meta-renderer-native-gles3.c.
|
||||
Checking for GL_OES_EGL_image_external but then using GL_OES_EGL_image semantics which Nvidia does not support.
|
||||
|
||||
Measurements from !3314:
|
||||
Driver | Before | After
|
||||
nvidia-drm | 32.5 FPS, 23 ms | 65.0 FPS, 11 ms
|
||||
nouveau | 65.0 FPS, 9 ms | 65.0 FPS, 9 ms
|
||||
amdgpu [1] | 60.0 FPS, 10 ms | 60.0 FPS, 10 ms
|
||||
amdgpu [2] | 30.0 FPS | 30.0 FPS
|
||||
|
||||
nvidia-drm and nouveau are the same NVIDIA GTX 1650 card plugged into 2.5K 130 Hz. Hence the decimation to 65 FPS and 32.5 FPS.
|
||||
amdgpu is a Radeon PRO WX 2100 card plugged into 4K 60 Hz.
|
||||
amdgpu [1] is CLUTTER_SHOW_FPS=1 COGL_DEBUG=sync-frame which seems to be a workaround for #3070.
|
||||
amdgpu [2] is CLUTTER_SHOW_FPS=1 and slower presumably due to #3070.
|
||||
|
||||
Closes: gnome-shell#6221, #2247 (closed), #2551, https://launchpad.net/bugs/1970291
|
||||
Mutter 46 requires a fix for #3235 before this works. Mutter 45 has no such problem.
|
||||
|
||||
---
|
||||
diff --git a/src/backends/meta-egl.c b/src/backends/meta-egl.c
|
||||
index ac19828c4cd7fb120a96902a1bf6934ac1d522ac..c468c6f970c784db301b10376b32a63c76289eed 100644
|
||||
--- a/src/backends/meta-egl.c
|
||||
+++ b/src/backends/meta-egl.c
|
||||
@@ -238,6 +238,14 @@ meta_egl_has_extensions (MetaEgl *egl,
|
||||
return has_extensions;
|
||||
}
|
||||
|
||||
+const char *
|
||||
+meta_egl_query_string (MetaEgl *egl,
|
||||
+ EGLDisplay display,
|
||||
+ EGLint name)
|
||||
+{
|
||||
+ return eglQueryString (display, name);
|
||||
+}
|
||||
+
|
||||
gboolean
|
||||
meta_egl_initialize (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
diff --git a/src/backends/meta-egl.h b/src/backends/meta-egl.h
|
||||
index 4ed54a5399727c2c8d53727089a6c34fc9a5d13f..55976bfdb156657085fc7df077e3ac6da398a090 100644
|
||||
--- a/src/backends/meta-egl.h
|
||||
+++ b/src/backends/meta-egl.h
|
||||
@@ -47,6 +47,10 @@ gboolean meta_egl_has_extensions (MetaEgl *egl,
|
||||
const char *first_extension,
|
||||
...);
|
||||
|
||||
+const char * meta_egl_query_string (MetaEgl *egl,
|
||||
+ EGLDisplay display,
|
||||
+ EGLint name);
|
||||
+
|
||||
gboolean meta_egl_initialize (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
GError **error);
|
||||
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
|
||||
index e315a9b5f0370d544c9a90e7dc3d3eebadf09a0a..7dd79e615661708047f0ba063b804cfa66e50a0e 100644
|
||||
--- a/src/backends/native/meta-onscreen-native.c
|
||||
+++ b/src/backends/native/meta-onscreen-native.c
|
||||
@@ -620,6 +620,9 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
|
||||
COGL_TRACE_BEGIN_SCOPED (CopySharedFramebufferSecondaryGpu,
|
||||
"copy_shared_framebuffer_gpu()");
|
||||
|
||||
+ if (renderer_gpu_data->secondary.needs_explicit_sync)
|
||||
+ cogl_framebuffer_finish (COGL_FRAMEBUFFER (onscreen));
|
||||
+
|
||||
render_device = renderer_gpu_data->render_device;
|
||||
egl_display = meta_render_device_get_egl_display (render_device);
|
||||
|
||||
@@ -726,8 +729,7 @@ copy_shared_framebuffer_primary_gpu (CoglOnscreen *onscre
|
||||
COGL_TRACE_BEGIN_SCOPED (CopySharedFramebufferPrimaryGpu,
|
||||
"copy_shared_framebuffer_primary_gpu()");
|
||||
|
||||
- if (!secondary_gpu_state ||
|
||||
- secondary_gpu_state->egl_surface == EGL_NO_SURFACE)
|
||||
+ if (!secondary_gpu_state)
|
||||
return NULL;
|
||||
|
||||
primary_gpu = meta_renderer_native_get_primary_gpu (renderer_native);
|
||||
@@ -2122,6 +2124,15 @@ init_secondary_gpu_state_gpu_copy_mode (MetaRendererNative *renderer_nat
|
||||
width, height,
|
||||
format,
|
||||
GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
|
||||
+
|
||||
+ if (!gbm_surface)
|
||||
+ {
|
||||
+ gbm_surface = gbm_surface_create (gbm_device,
|
||||
+ width, height,
|
||||
+ format,
|
||||
+ 0);
|
||||
+ }
|
||||
+
|
||||
if (!gbm_surface)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
diff --git a/src/backends/native/meta-renderer-native-gles3.c b/src/backends/native/meta-renderer-native-gles3.c
|
||||
index cf27ba8d4617b75ec6614e44734b594312075b66..693db0ad8c85086310f9ddf2f851790e24d883ea 100644
|
||||
--- a/src/backends/native/meta-renderer-native-gles3.c
|
||||
+++ b/src/backends/native/meta-renderer-native-gles3.c
|
||||
@@ -3,6 +3,7 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Red Hat
|
||||
* Copyright (c) 2018 DisplayLink (UK) Ltd.
|
||||
+ * Copyright (c) 2023 Canonical Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -43,6 +44,127 @@
|
||||
#error "Somehow included OpenGL headers when we shouldn't have"
|
||||
#endif
|
||||
|
||||
+static GQuark
|
||||
+get_quark_for_egl_context (EGLContext egl_context)
|
||||
+{
|
||||
+ char key[128];
|
||||
+
|
||||
+ g_snprintf (key, sizeof key, "EGLContext %p", egl_context);
|
||||
+
|
||||
+ return g_quark_from_string (key);
|
||||
+}
|
||||
+
|
||||
+static GLuint
|
||||
+load_shader (const char *src,
|
||||
+ GLenum type)
|
||||
+{
|
||||
+ GLuint shader = glCreateShader (type);
|
||||
+
|
||||
+ if (shader)
|
||||
+ {
|
||||
+ GLint compiled;
|
||||
+
|
||||
+ glShaderSource (shader, 1, &src, NULL);
|
||||
+ glCompileShader (shader);
|
||||
+ glGetShaderiv (shader, GL_COMPILE_STATUS, &compiled);
|
||||
+ if (!compiled)
|
||||
+ {
|
||||
+ GLchar log[1024];
|
||||
+
|
||||
+ glGetShaderInfoLog (shader, sizeof (log) - 1, NULL, log);
|
||||
+ log[sizeof (log) - 1] = '\0';
|
||||
+ g_warning ("load_shader compile failed: %s", log);
|
||||
+ glDeleteShader (shader);
|
||||
+ shader = 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return shader;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+ensure_shader_program (MetaGles3 *gles3)
|
||||
+{
|
||||
+ static const char vertex_shader_source[] =
|
||||
+ "#version 100\n"
|
||||
+ "attribute vec2 position;\n"
|
||||
+ "attribute vec2 texcoord;\n"
|
||||
+ "varying vec2 v_texcoord;\n"
|
||||
+ "\n"
|
||||
+ "void main()\n"
|
||||
+ "{\n"
|
||||
+ " gl_Position = vec4(position, 0.0, 1.0);\n"
|
||||
+ " v_texcoord = texcoord;\n"
|
||||
+ "}\n";
|
||||
+
|
||||
+ static const char fragment_shader_source[] =
|
||||
+ "#version 100\n"
|
||||
+ "#extension GL_OES_EGL_image_external : require\n"
|
||||
+ "precision mediump float;\n"
|
||||
+ "uniform samplerExternalOES s_texture;\n"
|
||||
+ "varying vec2 v_texcoord;\n"
|
||||
+ "\n"
|
||||
+ " void main()\n"
|
||||
+ "{\n"
|
||||
+ " gl_FragColor = texture2D(s_texture, v_texcoord);\n"
|
||||
+ "}\n";
|
||||
+
|
||||
+ static const GLfloat box[] =
|
||||
+ { /* position texcoord */
|
||||
+ -1.0f, +1.0f, 0.0f, 0.0f,
|
||||
+ +1.0f, +1.0f, 1.0f, 0.0f,
|
||||
+ +1.0f, -1.0f, 1.0f, 1.0f,
|
||||
+ -1.0f, -1.0f, 0.0f, 1.0f,
|
||||
+ };
|
||||
+ GLint linked;
|
||||
+ GLuint vertex_shader, fragment_shader;
|
||||
+ GLint position_attrib, texcoord_attrib;
|
||||
+ GQuark shader_program_quark;
|
||||
+ GLuint shader_program;
|
||||
+
|
||||
+ shader_program_quark = get_quark_for_egl_context (eglGetCurrentContext ());
|
||||
+ if (g_object_get_qdata (G_OBJECT (gles3), shader_program_quark))
|
||||
+ return;
|
||||
+
|
||||
+ shader_program = glCreateProgram ();
|
||||
+ g_return_if_fail (shader_program);
|
||||
+ g_object_set_qdata_full (G_OBJECT (gles3),
|
||||
+ shader_program_quark,
|
||||
+ GUINT_TO_POINTER (shader_program),
|
||||
+ NULL);
|
||||
+
|
||||
+ vertex_shader = load_shader (vertex_shader_source, GL_VERTEX_SHADER);
|
||||
+ g_return_if_fail (vertex_shader);
|
||||
+ fragment_shader = load_shader (fragment_shader_source, GL_FRAGMENT_SHADER);
|
||||
+ g_return_if_fail (fragment_shader);
|
||||
+
|
||||
+ GLBAS (gles3, glAttachShader, (shader_program, vertex_shader));
|
||||
+ GLBAS (gles3, glAttachShader, (shader_program, fragment_shader));
|
||||
+ GLBAS (gles3, glLinkProgram, (shader_program));
|
||||
+ GLBAS (gles3, glGetProgramiv, (shader_program, GL_LINK_STATUS, &linked));
|
||||
+ if (!linked)
|
||||
+ {
|
||||
+ GLchar log[1024];
|
||||
+
|
||||
+ glGetProgramInfoLog (shader_program, sizeof (log) - 1, NULL, log);
|
||||
+ log[sizeof (log) - 1] = '\0';
|
||||
+ g_warning ("Link failed: %s", log);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ GLBAS (gles3, glUseProgram, (shader_program));
|
||||
+
|
||||
+ position_attrib = glGetAttribLocation (shader_program, "position");
|
||||
+ GLBAS (gles3, glEnableVertexAttribArray, (position_attrib));
|
||||
+ GLBAS (gles3, glVertexAttribPointer,
|
||||
+ (position_attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof (GLfloat), box));
|
||||
+
|
||||
+ texcoord_attrib = glGetAttribLocation (shader_program, "texcoord");
|
||||
+ GLBAS (gles3, glEnableVertexAttribArray, (texcoord_attrib));
|
||||
+ GLBAS (gles3, glVertexAttribPointer,
|
||||
+ (texcoord_attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof (GLfloat), box + 2));
|
||||
+}
|
||||
+
|
||||
static void
|
||||
paint_egl_image (MetaGles3 *gles3,
|
||||
EGLImageKHR egl_image,
|
||||
@@ -50,39 +172,33 @@ paint_egl_image (MetaGles3 *gles3,
|
||||
int height)
|
||||
{
|
||||
GLuint texture;
|
||||
- GLuint framebuffer;
|
||||
|
||||
meta_gles3_clear_error (gles3);
|
||||
+ ensure_shader_program (gles3);
|
||||
|
||||
- GLBAS (gles3, glGenFramebuffers, (1, &framebuffer));
|
||||
- GLBAS (gles3, glBindFramebuffer, (GL_READ_FRAMEBUFFER, framebuffer));
|
||||
+ GLBAS (gles3, glViewport, (0, 0, width, height));
|
||||
|
||||
GLBAS (gles3, glActiveTexture, (GL_TEXTURE0));
|
||||
GLBAS (gles3, glGenTextures, (1, &texture));
|
||||
- GLBAS (gles3, glBindTexture, (GL_TEXTURE_2D, texture));
|
||||
- GLEXT (gles3, glEGLImageTargetTexture2DOES, (GL_TEXTURE_2D, egl_image));
|
||||
- GLBAS (gles3, glTexParameteri, (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||
+ GLBAS (gles3, glBindTexture, (GL_TEXTURE_EXTERNAL_OES, texture));
|
||||
+ GLEXT (gles3, glEGLImageTargetTexture2DOES, (GL_TEXTURE_EXTERNAL_OES,
|
||||
+ egl_image));
|
||||
+ GLBAS (gles3, glTexParameteri, (GL_TEXTURE_EXTERNAL_OES,
|
||||
+ GL_TEXTURE_MAG_FILTER,
|
||||
GL_NEAREST));
|
||||
- GLBAS (gles3, glTexParameteri, (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||
+ GLBAS (gles3, glTexParameteri, (GL_TEXTURE_EXTERNAL_OES,
|
||||
+ GL_TEXTURE_MIN_FILTER,
|
||||
GL_NEAREST));
|
||||
- GLBAS (gles3, glTexParameteri, (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
|
||||
+ GLBAS (gles3, glTexParameteri, (GL_TEXTURE_EXTERNAL_OES,
|
||||
+ GL_TEXTURE_WRAP_S,
|
||||
GL_CLAMP_TO_EDGE));
|
||||
- GLBAS (gles3, glTexParameteri, (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
|
||||
+ GLBAS (gles3, glTexParameteri, (GL_TEXTURE_EXTERNAL_OES,
|
||||
+ GL_TEXTURE_WRAP_T,
|
||||
GL_CLAMP_TO_EDGE));
|
||||
- GLBAS (gles3, glTexParameteri, (GL_TEXTURE_2D, GL_TEXTURE_WRAP_R_OES,
|
||||
- GL_CLAMP_TO_EDGE));
|
||||
-
|
||||
- GLBAS (gles3, glFramebufferTexture2D, (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||
- GL_TEXTURE_2D, texture, 0));
|
||||
|
||||
- GLBAS (gles3, glBindFramebuffer, (GL_READ_FRAMEBUFFER, framebuffer));
|
||||
- GLBAS (gles3, glBlitFramebuffer, (0, height, width, 0,
|
||||
- 0, 0, width, height,
|
||||
- GL_COLOR_BUFFER_BIT,
|
||||
- GL_NEAREST));
|
||||
+ GLBAS (gles3, glDrawArrays, (GL_TRIANGLE_FAN, 0, 4));
|
||||
|
||||
GLBAS (gles3, glDeleteTextures, (1, &texture));
|
||||
- GLBAS (gles3, glDeleteFramebuffers, (1, &framebuffer));
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -156,3 +272,12 @@ meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
+
|
||||
+void
|
||||
+meta_renderer_native_gles3_forget_context (MetaGles3 *gles3,
|
||||
+ EGLContext egl_context)
|
||||
+{
|
||||
+ GQuark shader_program_quark = get_quark_for_egl_context (egl_context);
|
||||
+
|
||||
+ g_object_set_qdata (G_OBJECT (gles3), shader_program_quark, NULL);
|
||||
+}
|
||||
diff --git a/src/backends/native/meta-renderer-native-gles3.h b/src/backends/native/meta-renderer-native-gles3.h
|
||||
index 591ff82e1746e5c357e1bfe4b88a0af74d1d0a40..f5791a171fedc4489f106e911510059ea40c81d2 100644
|
||||
--- a/src/backends/native/meta-renderer-native-gles3.h
|
||||
+++ b/src/backends/native/meta-renderer-native-gles3.h
|
||||
@@ -26,10 +26,13 @@
|
||||
#include "backends/meta-egl.h"
|
||||
#include "backends/meta-gles3.h"
|
||||
|
||||
-gboolean meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
|
||||
- MetaGles3 *gles3,
|
||||
- EGLDisplay egl_display,
|
||||
- EGLContext egl_context,
|
||||
- EGLSurface egl_surface,
|
||||
- struct gbm_bo *shared_bo,
|
||||
- GError **error);
|
||||
+gboolean meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
|
||||
+ MetaGles3 *gles3,
|
||||
+ EGLDisplay egl_display,
|
||||
+ EGLContext egl_context,
|
||||
+ EGLSurface egl_surface,
|
||||
+ struct gbm_bo *shared_bo,
|
||||
+ GError **error);
|
||||
+
|
||||
+void meta_renderer_native_gles3_forget_context (MetaGles3 *gles3,
|
||||
+ EGLContext egl_context);
|
||||
diff --git a/src/backends/native/meta-renderer-native-private.h b/src/backends/native/meta-renderer-native-private.h
|
||||
index 66b987a5c0c4b0cf65ca57df3391b27a6feffab7..1a4ee2c8106ec677fc9226f430d894a0699e25ce 100644
|
||||
--- a/src/backends/native/meta-renderer-native-private.h
|
||||
+++ b/src/backends/native/meta-renderer-native-private.h
|
||||
@@ -60,6 +60,7 @@ typedef struct _MetaRendererNativeGpuData
|
||||
struct {
|
||||
MetaSharedFramebufferCopyMode copy_mode;
|
||||
gboolean has_EGL_EXT_image_dma_buf_import_modifiers;
|
||||
+ gboolean needs_explicit_sync;
|
||||
|
||||
/* For GPU blit mode */
|
||||
EGLContext egl_context;
|
||||
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
|
||||
index dc08824c181f59d2921d31344bc4584d9cf93fc3..1ac95569ca5a1065e0a264e484216c558e05e6c8 100644
|
||||
--- a/src/backends/native/meta-renderer-native.c
|
||||
+++ b/src/backends/native/meta-renderer-native.c
|
||||
@@ -62,6 +62,7 @@
|
||||
#include "backends/native/meta-output-kms.h"
|
||||
#include "backends/native/meta-render-device-gbm.h"
|
||||
#include "backends/native/meta-render-device-surfaceless.h"
|
||||
+#include "backends/native/meta-renderer-native-gles3.h"
|
||||
#include "backends/native/meta-renderer-native-private.h"
|
||||
#include "backends/native/meta-renderer-view-native.h"
|
||||
#include "cogl/cogl.h"
|
||||
@@ -135,6 +136,9 @@ meta_renderer_native_gpu_data_free (MetaRendererNativeGpuData *renderer_gpu_data
|
||||
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
|
||||
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
|
||||
|
||||
+ meta_renderer_native_gles3_forget_context (renderer_native->gles3,
|
||||
+ renderer_gpu_data->secondary.egl_context);
|
||||
+
|
||||
meta_egl_destroy_context (egl,
|
||||
egl_display,
|
||||
renderer_gpu_data->secondary.egl_context,
|
||||
@@ -1757,6 +1761,7 @@ init_secondary_gpu_data_gpu (MetaRendererNativeGpuData *renderer_gpu_data,
|
||||
CoglContext *cogl_context;
|
||||
CoglDisplay *cogl_display;
|
||||
const char **missing_gl_extensions;
|
||||
+ const char *egl_vendor;
|
||||
|
||||
egl_display = meta_render_device_get_egl_display (render_device);
|
||||
if (egl_display == EGL_NO_DISPLAY)
|
||||
@@ -1823,6 +1828,11 @@ init_secondary_gpu_data_gpu (MetaRendererNativeGpuData *renderer_gpu_data,
|
||||
meta_egl_has_extensions (egl, egl_display, NULL,
|
||||
"EGL_EXT_image_dma_buf_import_modifiers",
|
||||
NULL);
|
||||
+
|
||||
+ egl_vendor = meta_egl_query_string (egl, egl_display, EGL_VENDOR);
|
||||
+ if (!g_strcmp0 (egl_vendor, "NVIDIA"))
|
||||
+ renderer_gpu_data->secondary.needs_explicit_sync = TRUE;
|
||||
+
|
||||
ret = TRUE;
|
||||
out:
|
||||
maybe_restore_cogl_egl_api (renderer_native);
|
53
mr3674.patch
53
mr3674.patch
|
@ -1,53 +0,0 @@
|
|||
From 6fd0a273b669414aa1fcfd4cf193d8e6c9cd2773 Mon Sep 17 00:00:00 2001
|
||||
From: Michel Dänzer <mdaenzer@redhat.com>
|
||||
Date: Wed, 27 Mar 2024 18:16:17 +0100
|
||||
Subject: [PATCH] drm-buffer-gbm: Do not call ensure_fb_id from lock_front
|
||||
|
||||
When preparing a frame for scanout on a secondary GPU, calling
|
||||
meta_drm_buffer_gbm_ensure_fb_id for the primary GPU device is
|
||||
unnecessary and potentially harmful.
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3389
|
||||
---
|
||||
src/backends/native/meta-drm-buffer-gbm.c | 2 +-
|
||||
src/backends/native/meta-onscreen-native.c | 11 +++++++++++
|
||||
2 files changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-drm-buffer-gbm.c b/src/backends/native/meta-drm-buffer-gbm.c
|
||||
index 161d43957d4..4ca8fb0f462 100644
|
||||
--- a/src/backends/native/meta-drm-buffer-gbm.c
|
||||
+++ b/src/backends/native/meta-drm-buffer-gbm.c
|
||||
@@ -186,7 +186,7 @@ lock_front_buffer (MetaDrmBufferGbm *buffer_gbm,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
- return meta_drm_buffer_gbm_ensure_fb_id (META_DRM_BUFFER (buffer_gbm), error);
|
||||
+ return TRUE;
|
||||
}
|
||||
|
||||
MetaDrmBufferGbm *
|
||||
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
|
||||
index e40b03f3eaf..f2bae4f00d6 100644
|
||||
--- a/src/backends/native/meta-onscreen-native.c
|
||||
+++ b/src/backends/native/meta-onscreen-native.c
|
||||
@@ -1373,6 +1373,17 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
#endif
|
||||
}
|
||||
|
||||
+ if (!meta_drm_buffer_ensure_fb_id (onscreen_native->gbm.next_fb, &error))
|
||||
+ {
|
||||
+ g_warning ("Failed to ensure KMS FB ID on %s: %s",
|
||||
+ meta_device_file_get_path (render_device_file),
|
||||
+ error->message);
|
||||
+
|
||||
+ frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
|
||||
+ meta_onscreen_native_notify_frame_complete (onscreen);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* If we changed EGL context, cogl will have the wrong idea about what is
|
||||
* current, making it fail to set it when it needs to. Avoid that by making
|
||||
--
|
||||
GitLab
|
||||
|
Loading…
Reference in a new issue