[mutter] backends/native: Don't set discarded framebuffer as current
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] backends/native: Don't set discarded framebuffer as current
- Date: Thu, 17 Nov 2016 16:07:56 +0000 (UTC)
commit ad784501a6139af7d9dbc44c1b5a857d6319cf26
Author: Jonas Ådahl <jadahl gmail com>
Date: Thu Nov 17 20:17:15 2016 +0800
backends/native: Don't set discarded framebuffer as current
When a swap failed with EACCES (possibly due to VT switching), don't
mark the framebuffer as 'in use', so that it'll be cleaned up properly
and not set as current.
https://bugzilla.gnome.org/show_bug.cgi?id=773629
src/backends/native/meta-monitor-manager-kms.c | 27 +++++++++++++++++------
src/backends/native/meta-monitor-manager-kms.h | 13 ++++++-----
src/backends/native/meta-renderer-native.c | 5 +--
3 files changed, 29 insertions(+), 16 deletions(-)
---
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 2067f31..fae195f 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -1546,7 +1546,7 @@ get_crtc_connectors (MetaMonitorManager *manager,
*connectors = (uint32_t *) g_array_free (connectors_array, FALSE);
}
-void
+gboolean
meta_monitor_manager_kms_apply_crtc_mode (MetaMonitorManagerKms *manager_kms,
MetaCRTC *crtc,
int x,
@@ -1571,9 +1571,14 @@ meta_monitor_manager_kms_apply_crtc_mode (MetaMonitorManagerKms *manager_kms,
x, y,
connectors, n_connectors,
mode) != 0)
- g_warning ("Failed to set CRTC mode %s: %m", crtc->current_mode->name);
+ {
+ g_warning ("Failed to set CRTC mode %s: %m", crtc->current_mode->name);
+ return FALSE;
+ }
g_free (connectors);
+
+ return TRUE;
}
static void
@@ -1622,7 +1627,8 @@ meta_monitor_manager_kms_flip_crtc (MetaMonitorManagerKms *manager_kms,
int x,
int y,
uint32_t fb_id,
- GClosure *flip_closure)
+ GClosure *flip_closure,
+ gboolean *fb_in_use)
{
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
uint32_t *connectors;
@@ -1649,14 +1655,21 @@ meta_monitor_manager_kms_flip_crtc (MetaMonitorManagerKms *manager_kms,
}
if (manager_kms->page_flips_not_supported)
- meta_monitor_manager_kms_apply_crtc_mode (manager_kms,
- crtc,
- x, y,
- fb_id);
+ {
+ if (meta_monitor_manager_kms_apply_crtc_mode (manager_kms,
+ crtc,
+ x, y,
+ fb_id))
+ {
+ *fb_in_use = TRUE;
+ return FALSE;
+ }
+ }
if (ret != 0)
return FALSE;
+ *fb_in_use = TRUE;
g_closure_ref (flip_closure);
return TRUE;
diff --git a/src/backends/native/meta-monitor-manager-kms.h b/src/backends/native/meta-monitor-manager-kms.h
index 53a019e..96468cf 100644
--- a/src/backends/native/meta-monitor-manager-kms.h
+++ b/src/backends/native/meta-monitor-manager-kms.h
@@ -39,11 +39,11 @@ GType meta_monitor_manager_kms_get_type (void);
typedef void (*MetaKmsFlipCallback) (void *user_data);
-void meta_monitor_manager_kms_apply_crtc_mode (MetaMonitorManagerKms *manager_kms,
- MetaCRTC *crtc,
- int x,
- int y,
- uint32_t fb_id);
+gboolean meta_monitor_manager_kms_apply_crtc_mode (MetaMonitorManagerKms *manager_kms,
+ MetaCRTC *crtc,
+ int x,
+ int y,
+ uint32_t fb_id);
gboolean meta_monitor_manager_kms_is_crtc_active (MetaMonitorManagerKms *manager_kms,
MetaCRTC *crtc);
@@ -53,7 +53,8 @@ gboolean meta_monitor_manager_kms_flip_crtc (MetaMonitorManagerKms *manager_kms,
int x,
int y,
uint32_t fb_id,
- GClosure *flip_closure);
+ GClosure *flip_closure,
+ gboolean *fb_in_use);
void meta_monitor_manager_kms_wait_for_flip (MetaMonitorManagerKms *manager_kms);
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 8a46dc4..9acf7fc 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -457,10 +457,9 @@ meta_onscreen_native_flip_crtc (MetaOnscreenNative *onscreen_native,
crtc,
x, y,
onscreen_native->gbm.next_fb_id,
- flip_closure))
+ flip_closure,
+ fb_in_use))
onscreen_native->pending_flips++;
-
- *fb_in_use = TRUE;
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]