Last active
April 26, 2023 08:13
-
-
Save GloriousEggroll/e73ca01ad337816ac89d741e68efa888 to your computer and use it in GitHub Desktop.
gnome-mutter-44-vrr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/panels/display/cc-display-config-dbus.c b/panels/display/cc-display-config-dbus.c | |
index 83a49ade9..91ca02da0 100644 | |
--- a/panels/display/cc-display-config-dbus.c | |
+++ b/panels/display/cc-display-config-dbus.c | |
@@ -280,7 +280,6 @@ cc_display_logical_monitor_class_init (CcDisplayLogicalMonitorClass *klass) | |
gobject_class->finalize = cc_display_logical_monitor_finalize; | |
} | |
- | |
typedef enum _CcDisplayMonitorUnderscanning | |
{ | |
UNDERSCANNING_UNSUPPORTED = 0, | |
@@ -288,6 +287,13 @@ typedef enum _CcDisplayMonitorUnderscanning | |
UNDERSCANNING_ENABLED | |
} CcDisplayMonitorUnderscanning; | |
+typedef enum _CcDisplayMonitorVariableRefreshRate | |
+{ | |
+ VRR_UNSUPPORTED = 0, | |
+ VRR_DISALLOWED, | |
+ VRR_ALLOWED | |
+} CcDisplayMonitorVariableRefreshRate; | |
+ | |
struct _CcDisplayMonitorDBus | |
{ | |
CcDisplayMonitor parent_instance; | |
@@ -303,6 +309,7 @@ struct _CcDisplayMonitorDBus | |
int height_mm; | |
gboolean builtin; | |
CcDisplayMonitorUnderscanning underscanning; | |
+ CcDisplayMonitorVariableRefreshRate vrr_mode; | |
int max_width; | |
int max_height; | |
@@ -603,6 +610,37 @@ cc_display_monitor_dbus_set_underscanning (CcDisplayMonitor *pself, | |
self->underscanning = UNDERSCANNING_DISABLED; | |
} | |
+static gboolean | |
+cc_display_monitor_dbus_supports_variable_refresh_rate (CcDisplayMonitor *pself) | |
+{ | |
+ CcDisplayMonitorDBus *self = CC_DISPLAY_MONITOR_DBUS (pself); | |
+ | |
+ return self->vrr_mode != VRR_UNSUPPORTED; | |
+} | |
+ | |
+static gboolean | |
+cc_display_monitor_dbus_get_variable_refresh_rate (CcDisplayMonitor *pself) | |
+{ | |
+ CcDisplayMonitorDBus *self = CC_DISPLAY_MONITOR_DBUS (pself); | |
+ | |
+ return self->vrr_mode == VRR_ALLOWED; | |
+} | |
+ | |
+static void | |
+cc_display_monitor_dbus_set_variable_refresh_rate (CcDisplayMonitor *pself, | |
+ gboolean allowed) | |
+{ | |
+ CcDisplayMonitorDBus *self = CC_DISPLAY_MONITOR_DBUS (pself); | |
+ | |
+ if (self->vrr_mode == VRR_UNSUPPORTED) | |
+ return; | |
+ | |
+ if (allowed) | |
+ self->vrr_mode = VRR_ALLOWED; | |
+ else | |
+ self->vrr_mode = VRR_DISALLOWED; | |
+} | |
+ | |
static CcDisplayMode * | |
cc_display_monitor_dbus_get_closest_mode (CcDisplayMonitorDBus *self, | |
CcDisplayModeDBus *mode) | |
@@ -715,6 +753,7 @@ static void | |
cc_display_monitor_dbus_init (CcDisplayMonitorDBus *self) | |
{ | |
self->underscanning = UNDERSCANNING_UNSUPPORTED; | |
+ self->vrr_mode = VRR_UNSUPPORTED; | |
self->max_width = G_MAXINT; | |
self->max_height = G_MAXINT; | |
} | |
@@ -768,6 +807,9 @@ cc_display_monitor_dbus_class_init (CcDisplayMonitorDBusClass *klass) | |
parent_class->supports_underscanning = cc_display_monitor_dbus_supports_underscanning; | |
parent_class->get_underscanning = cc_display_monitor_dbus_get_underscanning; | |
parent_class->set_underscanning = cc_display_monitor_dbus_set_underscanning; | |
+ parent_class->supports_variable_refresh_rate = cc_display_monitor_dbus_supports_variable_refresh_rate; | |
+ parent_class->get_variable_refresh_rate = cc_display_monitor_dbus_get_variable_refresh_rate; | |
+ parent_class->set_variable_refresh_rate = cc_display_monitor_dbus_set_variable_refresh_rate; | |
parent_class->set_mode = cc_display_monitor_dbus_set_mode; | |
parent_class->set_position = cc_display_monitor_dbus_set_position; | |
parent_class->get_scale = cc_display_monitor_dbus_get_scale; | |
@@ -844,6 +886,15 @@ cc_display_monitor_dbus_new (GVariant *variant, | |
else | |
self->underscanning = UNDERSCANNING_DISABLED; | |
} | |
+ else if (g_str_equal (s, "is-vrr-allowed")) | |
+ { | |
+ gboolean vrr_allowed = FALSE; | |
+ g_variant_get (v, "b", &vrr_allowed); | |
+ if (vrr_allowed) | |
+ self->vrr_mode = VRR_ALLOWED; | |
+ else | |
+ self->vrr_mode = VRR_DISALLOWED; | |
+ } | |
else if (g_str_equal (s, "max-screen-size")) | |
{ | |
g_variant_get (v, "ii", &self->max_width, &self->max_height); | |
@@ -944,6 +995,10 @@ build_monitors_variant (GHashTable *monitors) | |
"underscanning", | |
g_variant_new_boolean (monitor->underscanning == UNDERSCANNING_ENABLED)); | |
+ g_variant_builder_add (&props_builder, "{sv}", | |
+ "allow_vrr", | |
+ g_variant_new_boolean (monitor->vrr_mode == VRR_ALLOWED)); | |
+ | |
mode_dbus = CC_DISPLAY_MODE_DBUS (monitor->current_mode); | |
g_variant_builder_add (&builder, "(ss@*)", | |
monitor->connector_name, | |
@@ -1078,6 +1133,9 @@ cc_display_config_dbus_equal (CcDisplayConfig *pself, | |
if (m1->underscanning != m2->underscanning) | |
return FALSE; | |
+ if (m1->vrr_mode != m2->vrr_mode) | |
+ return FALSE; | |
+ | |
if (!cc_display_logical_monitor_equal (m1->logical_monitor, m2->logical_monitor)) | |
return FALSE; | |
diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c | |
index a78b33fc9..c66128265 100644 | |
--- a/panels/display/cc-display-config.c | |
+++ b/panels/display/cc-display-config.c | |
@@ -322,6 +322,26 @@ cc_display_monitor_set_underscanning (CcDisplayMonitor *self, | |
return CC_DISPLAY_MONITOR_GET_CLASS (self)->set_underscanning (self, underscanning); | |
} | |
+gboolean | |
+cc_display_monitor_supports_variable_refresh_rate (CcDisplayMonitor *self) | |
+{ | |
+ return CC_DISPLAY_MONITOR_GET_CLASS (self)->supports_variable_refresh_rate (self); | |
+} | |
+ | |
+gboolean | |
+cc_display_monitor_get_variable_refresh_rate (CcDisplayMonitor *self) | |
+{ | |
+ return CC_DISPLAY_MONITOR_GET_CLASS (self)->get_variable_refresh_rate (self); | |
+} | |
+ | |
+void | |
+cc_display_monitor_set_variable_refresh_rate (CcDisplayMonitor *self, | |
+ gboolean allowed) | |
+{ | |
+ return CC_DISPLAY_MONITOR_GET_CLASS (self)->set_variable_refresh_rate (self, allowed); | |
+} | |
+ | |
+ | |
void | |
cc_display_monitor_set_mode (CcDisplayMonitor *self, CcDisplayMode *m) | |
{ | |
diff --git a/panels/display/cc-display-config.h b/panels/display/cc-display-config.h | |
index d83fa8edc..065435ca7 100644 | |
--- a/panels/display/cc-display-config.h | |
+++ b/panels/display/cc-display-config.h | |
@@ -121,6 +121,10 @@ struct _CcDisplayMonitorClass | |
gboolean (*get_underscanning) (CcDisplayMonitor *self); | |
void (*set_underscanning) (CcDisplayMonitor *self, | |
gboolean u); | |
+ gboolean (*supports_variable_refresh_rate) (CcDisplayMonitor *self); | |
+ gboolean (*get_variable_refresh_rate) (CcDisplayMonitor *self); | |
+ void (*set_variable_refresh_rate) (CcDisplayMonitor *self, | |
+ gboolean u); | |
CcDisplayMode* (*get_mode) (CcDisplayMonitor *self); | |
CcDisplayMode* (*get_preferred_mode) (CcDisplayMonitor *self); | |
GList* (*get_modes) (CcDisplayMonitor *self); | |
@@ -214,6 +218,11 @@ gboolean cc_display_monitor_get_underscanning (CcDisplayMonitor * | |
void cc_display_monitor_set_underscanning (CcDisplayMonitor *monitor, | |
gboolean underscanning); | |
+gboolean cc_display_monitor_supports_variable_refresh_rate (CcDisplayMonitor *monitor); | |
+gboolean cc_display_monitor_get_variable_refresh_rate (CcDisplayMonitor *monitor); | |
+void cc_display_monitor_set_variable_refresh_rate (CcDisplayMonitor *monitor, | |
+ gboolean allowed); | |
+ | |
CcDisplayMode* cc_display_monitor_get_mode (CcDisplayMonitor *monitor); | |
void cc_display_monitor_get_geometry (CcDisplayMonitor *monitor, | |
int *x, | |
diff --git a/panels/display/cc-display-settings.c b/panels/display/cc-display-settings.c | |
index 54301b30a..e3a562fe1 100644 | |
--- a/panels/display/cc-display-settings.c | |
+++ b/panels/display/cc-display-settings.c | |
@@ -57,6 +57,8 @@ struct _CcDisplaySettings | |
GtkWidget *scale_combo_row; | |
GtkWidget *underscanning_row; | |
GtkWidget *underscanning_switch; | |
+ GtkWidget *variable_refresh_rate_row; | |
+ GtkWidget *variable_refresh_rate_switch; | |
}; | |
typedef struct _CcDisplaySettings CcDisplaySettings; | |
@@ -254,6 +256,7 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self) | |
gtk_widget_set_visible (self->scale_combo_row, FALSE); | |
gtk_widget_set_visible (self->scale_buttons_row, FALSE); | |
gtk_widget_set_visible (self->underscanning_row, FALSE); | |
+ gtk_widget_set_visible (self->variable_refresh_rate_row, FALSE); | |
return G_SOURCE_REMOVE; | |
} | |
@@ -264,6 +267,7 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self) | |
g_object_freeze_notify ((GObject*) self->resolution_row); | |
g_object_freeze_notify ((GObject*) self->scale_combo_row); | |
g_object_freeze_notify ((GObject*) self->underscanning_switch); | |
+ g_object_freeze_notify ((GObject*) self->variable_refresh_rate_switch); | |
cc_display_monitor_get_geometry (self->selected_output, NULL, NULL, &width, &height); | |
@@ -463,6 +467,12 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self) | |
gtk_switch_set_active (GTK_SWITCH (self->underscanning_switch), | |
cc_display_monitor_get_underscanning (self->selected_output)); | |
+ gtk_widget_set_visible (self->variable_refresh_rate_row, | |
+ cc_display_monitor_supports_variable_refresh_rate (self->selected_output) && | |
+ !cc_display_config_is_cloning (self->config)); | |
+ gtk_switch_set_active (GTK_SWITCH (self->variable_refresh_rate_switch), | |
+ cc_display_monitor_get_variable_refresh_rate (self->selected_output)); | |
+ | |
self->updating = TRUE; | |
g_object_thaw_notify ((GObject*) self->enabled_switch); | |
g_object_thaw_notify ((GObject*) self->orientation_row); | |
@@ -470,6 +480,7 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self) | |
g_object_thaw_notify ((GObject*) self->resolution_row); | |
g_object_thaw_notify ((GObject*) self->scale_combo_row); | |
g_object_thaw_notify ((GObject*) self->underscanning_switch); | |
+ g_object_thaw_notify ((GObject*) self->variable_refresh_rate_switch); | |
self->updating = FALSE; | |
return G_SOURCE_REMOVE; | |
@@ -630,6 +641,21 @@ on_underscanning_switch_active_changed_cb (GtkWidget *widget, | |
g_signal_emit_by_name (G_OBJECT (self), "updated", self->selected_output); | |
} | |
+static void | |
+on_variable_refresh_rate_switch_active_changed_cb (GtkWidget *widget, | |
+ GParamSpec *pspec, | |
+ CcDisplaySettings *self) | |
+{ | |
+ if (self->updating) | |
+ return; | |
+ | |
+ cc_display_monitor_set_variable_refresh_rate (self->selected_output, | |
+ gtk_switch_get_active (GTK_SWITCH (self->variable_refresh_rate_switch))); | |
+ | |
+ g_signal_emit_by_name (G_OBJECT (self), "updated", self->selected_output); | |
+} | |
+ | |
+ | |
static void | |
cc_display_settings_get_property (GObject *object, | |
guint prop_id, | |
@@ -754,6 +780,8 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass) | |
gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_combo_row); | |
gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, underscanning_row); | |
gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, underscanning_switch); | |
+ gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, variable_refresh_rate_row); | |
+ gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, variable_refresh_rate_switch); | |
gtk_widget_class_bind_template_callback (widget_class, on_enabled_switch_active_changed_cb); | |
gtk_widget_class_bind_template_callback (widget_class, on_orientation_selection_changed_cb); | |
@@ -761,6 +789,7 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass) | |
gtk_widget_class_bind_template_callback (widget_class, on_resolution_selection_changed_cb); | |
gtk_widget_class_bind_template_callback (widget_class, on_scale_selection_changed_cb); | |
gtk_widget_class_bind_template_callback (widget_class, on_underscanning_switch_active_changed_cb); | |
+ gtk_widget_class_bind_template_callback (widget_class, on_variable_refresh_rate_switch_active_changed_cb); | |
} | |
static void | |
diff --git a/panels/display/cc-display-settings.ui b/panels/display/cc-display-settings.ui | |
index 6233629c3..2ec7f497a 100644 | |
--- a/panels/display/cc-display-settings.ui | |
+++ b/panels/display/cc-display-settings.ui | |
@@ -55,6 +55,20 @@ | |
<signal name="notify::selected-item" handler="on_refresh_rate_selection_changed_cb" swapped="no"/> | |
</object> | |
</child> | |
+ <child> | |
+ <object class="AdwActionRow" id="variable_refresh_rate_row"> | |
+ <property name="width_request">100</property> | |
+ <property name="title" translatable="yes">Variable Refresh Rate</property> | |
+ <child> | |
+ <object class="GtkSwitch" id="variable_refresh_rate_switch"> | |
+ <property name="can_focus">False</property> | |
+ <property name="halign">end</property> | |
+ <property name="valign">center</property> | |
+ <signal name="notify::active" handler="on_variable_refresh_rate_switch_active_changed_cb" swapped="no"/> | |
+ </object> | |
+ </child> | |
+ </object> | |
+ </child> | |
<child> | |
<object class="AdwActionRow" id="underscanning_row"> | |
<property name="width_request">100</property> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From d56389bda253c4ff2f6fbe0a600498687b39d528 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 00:24:51 -0600 | |
Subject: [PATCH 01/16] 1 | |
--- | |
src/compositor/meta-surface-actor.c | 11 +++++++++++ | |
1 file changed, 11 insertions(+) | |
diff --git a/src/compositor/meta-surface-actor.c b/src/compositor/meta-surface-actor.c | |
index fcd94b86d..7279d7dd0 100644 | |
--- a/src/compositor/meta-surface-actor.c | |
+++ b/src/compositor/meta-surface-actor.c | |
@@ -51,6 +51,7 @@ enum | |
{ | |
REPAINT_SCHEDULED, | |
SIZE_CHANGED, | |
+ FROZEN, | |
LAST_SIGNAL, | |
}; | |
@@ -269,6 +270,13 @@ meta_surface_actor_class_init (MetaSurfaceActorClass *klass) | |
0, | |
NULL, NULL, NULL, | |
G_TYPE_NONE, 0); | |
+ | |
+ signals[FROZEN] = g_signal_new ("frozen", | |
+ G_TYPE_FROM_CLASS (object_class), | |
+ G_SIGNAL_RUN_LAST, | |
+ 0, | |
+ NULL, NULL, NULL, | |
+ G_TYPE_NONE, 0); | |
} | |
gboolean | |
@@ -594,6 +602,9 @@ meta_surface_actor_set_frozen (MetaSurfaceActor *self, | |
priv->frozen = frozen; | |
+ if (frozen) | |
+ g_signal_emit (self, signals[FROZEN], 0); | |
+ | |
if (!frozen && priv->pending_damage) | |
{ | |
int i, n_rects = cairo_region_num_rectangles (priv->pending_damage); | |
-- | |
2.40.0 | |
From 14333d2b91b114dd14e2868507d92e3a6d1d818e Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 00:27:07 -0600 | |
Subject: [PATCH 02/16] 2 | |
--- | |
clutter/clutter/clutter-stage-view-private.h | 4 +++ | |
clutter/clutter/clutter-stage-view.c | 18 ++++++++++++ | |
clutter/clutter/clutter-stage-view.h | 3 ++ | |
clutter/clutter/clutter-stage.c | 30 ++++++++++++++++++++ | |
clutter/clutter/clutter-stage.h | 4 +++ | |
5 files changed, 59 insertions(+) | |
diff --git a/clutter/clutter/clutter-stage-view-private.h b/clutter/clutter/clutter-stage-view-private.h | |
index 309dde496..a6ea4b614 100644 | |
--- a/clutter/clutter/clutter-stage-view-private.h | |
+++ b/clutter/clutter/clutter-stage-view-private.h | |
@@ -78,6 +78,10 @@ void clutter_stage_view_transform_rect_to_onscreen (ClutterStageView | |
CLUTTER_EXPORT | |
void clutter_stage_view_schedule_update (ClutterStageView *view); | |
+CLUTTER_EXPORT | |
+void clutter_stage_view_schedule_actor_update (ClutterStageView *view, | |
+ ClutterActor *actor); | |
+ | |
CLUTTER_EXPORT | |
void clutter_stage_view_notify_presented (ClutterStageView *view, | |
ClutterFrameInfo *frame_info); | |
diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c | |
index 5f66d6032..be230c3f0 100644 | |
--- a/clutter/clutter/clutter-stage-view.c | |
+++ b/clutter/clutter/clutter-stage-view.c | |
@@ -1116,6 +1116,22 @@ clutter_stage_view_schedule_update_now (ClutterStageView *view) | |
clutter_frame_clock_schedule_update_now (priv->frame_clock); | |
} | |
+void | |
+clutter_stage_view_schedule_actor_update (ClutterStageView *view, | |
+ ClutterActor *actor) | |
+{ | |
+ ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_GET_CLASS (view); | |
+ | |
+ view_class->schedule_actor_update (view, actor); | |
+} | |
+ | |
+static void | |
+clutter_stage_view_real_schedule_actor_update (ClutterStageView *view, | |
+ ClutterActor *actor) | |
+{ | |
+ clutter_stage_view_schedule_update (view); | |
+} | |
+ | |
float | |
clutter_stage_view_get_refresh_rate (ClutterStageView *view) | |
{ | |
@@ -1535,6 +1551,8 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass) | |
object_class->dispose = clutter_stage_view_dispose; | |
object_class->finalize = clutter_stage_view_finalize; | |
+ klass->schedule_actor_update = clutter_stage_view_real_schedule_actor_update; | |
+ | |
obj_props[PROP_NAME] = | |
g_param_spec_string ("name", | |
"Name", | |
diff --git a/clutter/clutter/clutter-stage-view.h b/clutter/clutter/clutter-stage-view.h | |
index a2c5aad15..0b3f5d902 100644 | |
--- a/clutter/clutter/clutter-stage-view.h | |
+++ b/clutter/clutter/clutter-stage-view.h | |
@@ -51,6 +51,9 @@ struct _ClutterStageViewClass | |
int dst_height, | |
cairo_rectangle_int_t *dst_rect); | |
+ void (* schedule_actor_update) (ClutterStageView *view, | |
+ ClutterActor *actor); | |
+ | |
ClutterFrame * (* new_frame) (ClutterStageView *view); | |
}; | |
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c | |
index 14774f6f0..25abb9de4 100644 | |
--- a/clutter/clutter/clutter-stage.c | |
+++ b/clutter/clutter/clutter-stage.c | |
@@ -2475,6 +2475,36 @@ clutter_stage_schedule_update (ClutterStage *stage) | |
} | |
} | |
+/** | |
+ * clutter_stage_schedule_actor_update: | |
+ * @stage: a #ClutterStage actor | |
+ * @actor: a #ClutterActor which requires an update | |
+ * | |
+ * Schedules a redraw of the #ClutterStage at the next optimal timestamp | |
+ * for the specified actor. | |
+ */ | |
+void | |
+clutter_stage_schedule_actor_update (ClutterStage *stage, | |
+ ClutterActor *actor) | |
+{ | |
+ ClutterStageWindow *stage_window; | |
+ GList *l; | |
+ | |
+ if (CLUTTER_ACTOR_IN_DESTRUCTION (stage)) | |
+ return; | |
+ | |
+ stage_window = _clutter_stage_get_window (stage); | |
+ if (stage_window == NULL) | |
+ return; | |
+ | |
+ for (l = clutter_stage_peek_stage_views (stage); l; l = l->next) | |
+ { | |
+ ClutterStageView *view = l->data; | |
+ | |
+ clutter_stage_view_schedule_actor_update (view, actor); | |
+ } | |
+} | |
+ | |
ClutterPaintVolume * | |
_clutter_stage_paint_volume_stack_allocate (ClutterStage *stage) | |
{ | |
diff --git a/clutter/clutter/clutter-stage.h b/clutter/clutter/clutter-stage.h | |
index a579003cb..c6d31a587 100644 | |
--- a/clutter/clutter/clutter-stage.h | |
+++ b/clutter/clutter/clutter-stage.h | |
@@ -196,6 +196,10 @@ gboolean clutter_stage_is_redraw_queued_on_view (ClutterStage | |
CLUTTER_EXPORT | |
void clutter_stage_schedule_update (ClutterStage *stage); | |
+CLUTTER_EXPORT | |
+void clutter_stage_schedule_actor_update (ClutterStage *stage, | |
+ ClutterActor *actor); | |
+ | |
CLUTTER_EXPORT | |
gboolean clutter_stage_get_capture_final_size (ClutterStage *stage, | |
cairo_rectangle_int_t *rect, | |
-- | |
2.40.0 | |
From 838995497960dbee8757d86eca7a8891ef858c91 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:42:16 -0600 | |
Subject: [PATCH 3/3] 3 | |
--- | |
clutter/clutter/clutter-frame-clock.c | 102 +++++++++++++++++++++++++- | |
clutter/clutter/clutter-frame-clock.h | 10 +++ | |
2 files changed, 110 insertions(+), 2 deletions(-) | |
diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c | |
index 3aeb29042..bf5a25b75 100644 | |
--- a/clutter/clutter/clutter-frame-clock.c | |
+++ b/clutter/clutter/clutter-frame-clock.c | |
@@ -37,6 +37,8 @@ static guint signals[N_SIGNALS]; | |
#define SYNC_DELAY_FALLBACK_FRACTION 0.875 | |
+#define MINIMUM_REFRESH_RATE 30 | |
+ | |
typedef struct _ClutterFrameListener | |
{ | |
const ClutterFrameListenerIface *iface; | |
@@ -54,6 +56,7 @@ typedef enum _ClutterFrameClockState | |
{ | |
CLUTTER_FRAME_CLOCK_STATE_INIT, | |
CLUTTER_FRAME_CLOCK_STATE_IDLE, | |
+ CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT, | |
CLUTTER_FRAME_CLOCK_STATE_SCHEDULED, | |
CLUTTER_FRAME_CLOCK_STATE_DISPATCHING, | |
CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED, | |
@@ -65,6 +68,8 @@ struct _ClutterFrameClock | |
float refresh_rate; | |
int64_t refresh_interval_us; | |
+ int64_t minimum_refresh_interval_us; | |
+ | |
ClutterFrameListener listener; | |
GSource *source; | |
@@ -72,6 +77,8 @@ struct _ClutterFrameClock | |
int64_t frame_count; | |
ClutterFrameClockState state; | |
+ ClutterFrameClockMode mode; | |
+ | |
int64_t last_dispatch_time_us; | |
int64_t last_dispatch_lateness_us; | |
int64_t last_presentation_time_us; | |
@@ -380,6 +387,7 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, | |
{ | |
case CLUTTER_FRAME_CLOCK_STATE_INIT: | |
case CLUTTER_FRAME_CLOCK_STATE_IDLE: | |
+ case CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT: | |
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: | |
g_warn_if_reached (); | |
break; | |
@@ -400,6 +408,7 @@ clutter_frame_clock_notify_ready (ClutterFrameClock *frame_clock) | |
{ | |
case CLUTTER_FRAME_CLOCK_STATE_INIT: | |
case CLUTTER_FRAME_CLOCK_STATE_IDLE: | |
+ case CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT: | |
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: | |
g_warn_if_reached (); | |
break; | |
@@ -619,6 +628,39 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, | |
*out_min_render_time_allowed_us = min_render_time_allowed_us; | |
} | |
+static void | |
+calculate_next_idle_timeout_us (ClutterFrameClock *frame_clock, | |
+ int64_t *out_next_update_time_us) | |
+{ | |
+ int64_t now_us; | |
+ int64_t last_presentation_time_us; | |
+ int64_t next_presentation_time_us; | |
+ int64_t timeout_interval_us; | |
+ | |
+ now_us = g_get_monotonic_time (); | |
+ | |
+ last_presentation_time_us = frame_clock->last_presentation_time_us; | |
+ | |
+ timeout_interval_us = frame_clock->minimum_refresh_interval_us; | |
+ | |
+ if (last_presentation_time_us == 0) | |
+ { | |
+ *out_next_update_time_us = | |
+ frame_clock->last_dispatch_time_us ? | |
+ ((frame_clock->last_dispatch_time_us - | |
+ frame_clock->last_dispatch_lateness_us) + timeout_interval_us) : | |
+ now_us; | |
+ return; | |
+ } | |
+ | |
+ next_presentation_time_us = last_presentation_time_us + timeout_interval_us; | |
+ | |
+ while (next_presentation_time_us < now_us) | |
+ next_presentation_time_us += timeout_interval_us; | |
+ | |
+ *out_next_update_time_us = next_presentation_time_us; | |
+} | |
+ | |
void | |
clutter_frame_clock_inhibit (ClutterFrameClock *frame_clock) | |
{ | |
@@ -631,6 +673,7 @@ clutter_frame_clock_inhibit (ClutterFrameClock *frame_clock) | |
case CLUTTER_FRAME_CLOCK_STATE_INIT: | |
case CLUTTER_FRAME_CLOCK_STATE_IDLE: | |
break; | |
+ case CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT: | |
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: | |
frame_clock->pending_reschedule = TRUE; | |
frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE; | |
@@ -671,6 +714,7 @@ clutter_frame_clock_schedule_update_now (ClutterFrameClock *frame_clock) | |
{ | |
case CLUTTER_FRAME_CLOCK_STATE_INIT: | |
case CLUTTER_FRAME_CLOCK_STATE_IDLE: | |
+ case CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT: | |
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: | |
next_update_time_us = g_get_monotonic_time (); | |
break; | |
@@ -704,7 +748,9 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock) | |
{ | |
case CLUTTER_FRAME_CLOCK_STATE_INIT: | |
next_update_time_us = g_get_monotonic_time (); | |
- break; | |
+ g_source_set_ready_time (frame_clock->source, next_update_time_us); | |
+ frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_SCHEDULED; | |
+ return; | |
case CLUTTER_FRAME_CLOCK_STATE_IDLE: | |
calculate_next_update_time_us (frame_clock, | |
&next_update_time_us, | |
@@ -713,6 +759,7 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock) | |
frame_clock->is_next_presentation_time_valid = | |
(frame_clock->next_presentation_time_us != 0); | |
break; | |
+ case CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT: | |
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: | |
return; | |
case CLUTTER_FRAME_CLOCK_STATE_DISPATCHING: | |
@@ -721,11 +768,56 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock) | |
return; | |
} | |
+ switch (frame_clock->mode) | |
+ { | |
+ case CLUTTER_FRAME_CLOCK_MODE_FIXED: | |
+ calculate_next_update_time_us (frame_clock, | |
+ &next_update_time_us, | |
+ &frame_clock->next_presentation_time_us, | |
+ &frame_clock->min_render_time_allowed_us); | |
+ frame_clock->is_next_presentation_time_valid = | |
+ (frame_clock->next_presentation_time_us != 0); | |
+ frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_SCHEDULED; | |
+ break; | |
+ case CLUTTER_FRAME_CLOCK_MODE_VARIABLE: | |
+ calculate_next_idle_timeout_us (frame_clock, | |
+ &next_update_time_us); | |
+ frame_clock->is_next_presentation_time_valid = FALSE; | |
+ frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT; | |
+ break; | |
+ } | |
+ | |
g_warn_if_fail (next_update_time_us != -1); | |
frame_clock->next_update_time_us = next_update_time_us; | |
g_source_set_ready_time (frame_clock->source, next_update_time_us); | |
- frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_SCHEDULED; | |
+} | |
+ | |
+void | |
+clutter_frame_clock_set_mode (ClutterFrameClock *frame_clock, | |
+ ClutterFrameClockMode mode) | |
+{ | |
+ if (frame_clock->mode == mode) | |
+ return; | |
+ | |
+ frame_clock->mode = mode; | |
+ | |
+ switch (frame_clock->state) | |
+ { | |
+ case CLUTTER_FRAME_CLOCK_STATE_INIT: | |
+ case CLUTTER_FRAME_CLOCK_STATE_IDLE: | |
+ break; | |
+ case CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT: | |
+ case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: | |
+ frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE; | |
+ frame_clock->pending_reschedule = TRUE; | |
+ break; | |
+ case CLUTTER_FRAME_CLOCK_STATE_DISPATCHING: | |
+ case CLUTTER_FRAME_CLOCK_STATE_PENDING_PRESENTED: | |
+ break; | |
+ } | |
+ | |
+ maybe_reschedule_update (frame_clock); | |
} | |
static void | |
@@ -804,6 +896,7 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, | |
g_warn_if_reached (); | |
break; | |
case CLUTTER_FRAME_CLOCK_STATE_IDLE: | |
+ case CLUTTER_FRAME_CLOCK_STATE_IDLE_TIMEOUT: | |
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: | |
break; | |
case CLUTTER_FRAME_CLOCK_STATE_DISPATCHING: | |
@@ -946,6 +1039,10 @@ clutter_frame_clock_new (float refresh_rate, | |
init_frame_clock_source (frame_clock); | |
clutter_frame_clock_set_refresh_rate (frame_clock, refresh_rate); | |
+ | |
+ frame_clock->minimum_refresh_interval_us = | |
+ (int64_t) (0.5 + G_USEC_PER_SEC / MINIMUM_REFRESH_RATE); | |
+ | |
frame_clock->vblank_duration_us = vblank_duration_us; | |
return frame_clock; | |
@@ -979,6 +1076,7 @@ static void | |
clutter_frame_clock_init (ClutterFrameClock *frame_clock) | |
{ | |
frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_INIT; | |
+ frame_clock->mode = CLUTTER_FRAME_CLOCK_MODE_FIXED; | |
} | |
static void | |
diff --git a/clutter/clutter/clutter-frame-clock.h b/clutter/clutter/clutter-frame-clock.h | |
index 6fd5de47a..085c7a096 100644 | |
--- a/clutter/clutter/clutter-frame-clock.h | |
+++ b/clutter/clutter/clutter-frame-clock.h | |
@@ -55,6 +55,12 @@ typedef struct _ClutterFrameListenerIface | |
gpointer user_data); | |
} ClutterFrameListenerIface; | |
+typedef enum _ClutterFrameClockMode | |
+{ | |
+ CLUTTER_FRAME_CLOCK_MODE_FIXED, | |
+ CLUTTER_FRAME_CLOCK_MODE_VARIABLE, | |
+} ClutterFrameClockMode; | |
+ | |
CLUTTER_EXPORT | |
ClutterFrameClock * clutter_frame_clock_new (float refresh_rate, | |
int64_t vblank_duration_us, | |
@@ -64,6 +70,10 @@ ClutterFrameClock * clutter_frame_clock_new (float re | |
CLUTTER_EXPORT | |
void clutter_frame_clock_destroy (ClutterFrameClock *frame_clock); | |
+CLUTTER_EXPORT | |
+void clutter_frame_clock_set_mode (ClutterFrameClock *frame_clock, | |
+ ClutterFrameClockMode mode); | |
+ | |
CLUTTER_EXPORT | |
void clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, | |
ClutterFrameInfo *frame_info); | |
-- | |
2.40.0 | |
From 745cb07069f4ed87fa2f7437e1d277258af71939 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 00:59:09 -0600 | |
Subject: [PATCH 04/16] 5 | |
--- | |
src/backends/native/meta-renderer-native.c | 2 + | |
.../native/meta-renderer-view-native.c | 143 ++++++++++++++++++ | |
.../native/meta-renderer-view-native.h | 5 + | |
3 files changed, 150 insertions(+) | |
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c | |
index 4da361e2b..e90c082e3 100644 | |
--- a/src/backends/native/meta-renderer-native.c | |
+++ b/src/backends/native/meta-renderer-native.c | |
@@ -1534,6 +1534,8 @@ meta_renderer_native_prepare_frame (MetaRendererNative *renderer_native, | |
meta_onscreen_native_prepare_frame (onscreen, frame); | |
} | |
+ | |
+ meta_renderer_view_native_maybe_set_frame_sync (META_RENDERER_VIEW_NATIVE (view)); | |
} | |
void | |
diff --git a/src/backends/native/meta-renderer-view-native.c b/src/backends/native/meta-renderer-view-native.c | |
index 52872ff3c..0d7d279e5 100644 | |
--- a/src/backends/native/meta-renderer-view-native.c | |
+++ b/src/backends/native/meta-renderer-view-native.c | |
@@ -26,9 +26,25 @@ | |
#include "backends/native/meta-frame-native.h" | |
+#include "clutter/clutter.h" | |
+ | |
+typedef enum _MetaFrameSyncMode | |
+{ | |
+ META_FRAME_SYNC_MODE_INIT, | |
+ META_FRAME_SYNC_MODE_ENABLED, | |
+ META_FRAME_SYNC_MODE_DISABLED, | |
+} MetaFrameSyncMode; | |
+ | |
struct _MetaRendererViewNative | |
{ | |
MetaRendererView parent; | |
+ gboolean frame_sync_mode_update_queued; | |
+ | |
+ MetaFrameSyncMode frame_sync_mode; | |
+ ClutterActor *frame_sync_actor; | |
+ | |
+ gulong frame_sync_actor_frozen_id; | |
+ gulong frame_sync_actor_destroy_id; | |
}; | |
G_DEFINE_TYPE (MetaRendererViewNative, meta_renderer_view_native, | |
@@ -40,6 +56,133 @@ meta_renderer_view_native_new_frame (ClutterStageView *stage_view) | |
return (ClutterFrame *) meta_frame_native_new (); | |
} | |
+static void | |
+on_frame_sync_actor_frozen (ClutterActor *actor, | |
+ MetaRendererViewNative *view_native) | |
+{ | |
+ meta_renderer_view_native_set_frame_sync_actor (view_native, NULL); | |
+} | |
+ | |
+static void | |
+on_frame_sync_actor_destroyed (ClutterActor *actor, | |
+ MetaRendererViewNative *view_native) | |
+{ | |
+ meta_renderer_view_native_set_frame_sync_actor (view_native, NULL); | |
+} | |
+ | |
+static void | |
+meta_renderer_view_native_schedule_actor_update (ClutterStageView *stage_view, | |
+ ClutterActor *actor) | |
+{ | |
+ MetaRendererViewNative *view_native = META_RENDERER_VIEW_NATIVE (stage_view); | |
+ ClutterFrameClock *frame_clock; | |
+ | |
+ g_return_if_fail (actor != NULL); | |
+ | |
+ frame_clock = clutter_stage_view_get_frame_clock (stage_view); | |
+ | |
+ if (view_native->frame_sync_mode == META_FRAME_SYNC_MODE_ENABLED && | |
+ actor == view_native->frame_sync_actor) | |
+ clutter_frame_clock_schedule_update_now (frame_clock); | |
+ else | |
+ clutter_frame_clock_schedule_update (frame_clock); | |
+} | |
+ | |
+void | |
+meta_renderer_view_native_set_frame_sync_actor (MetaRendererViewNative *view_native, | |
+ ClutterActor *actor) | |
+{ | |
+ if (G_LIKELY (actor == view_native->frame_sync_actor)) | |
+ return; | |
+ | |
+ g_clear_signal_handler (&view_native->frame_sync_actor_frozen_id, | |
+ view_native->frame_sync_actor); | |
+ g_clear_signal_handler (&view_native->frame_sync_actor_destroy_id, | |
+ view_native->frame_sync_actor); | |
+ | |
+ if (actor) | |
+ { | |
+ view_native->frame_sync_actor_frozen_id = | |
+ g_signal_connect (actor, "frozen", | |
+ G_CALLBACK (on_frame_sync_actor_frozen), | |
+ view_native); | |
+ view_native->frame_sync_actor_destroy_id = | |
+ g_signal_connect (actor, "destroy", | |
+ G_CALLBACK (on_frame_sync_actor_destroyed), | |
+ view_native); | |
+ } | |
+ | |
+ view_native->frame_sync_actor = actor; | |
+ | |
+ view_native->frame_sync_mode_update_queued = TRUE; | |
+} | |
+ | |
+static void | |
+meta_renderer_view_native_set_frame_sync (MetaRendererViewNative *view_native, | |
+ MetaFrameSyncMode sync_mode) | |
+{ | |
+ ClutterFrameClock *frame_clock = | |
+ clutter_stage_view_get_frame_clock (CLUTTER_STAGE_VIEW (view_native)); | |
+ | |
+ switch (sync_mode) | |
+ { | |
+ case META_FRAME_SYNC_MODE_ENABLED: | |
+ clutter_frame_clock_set_mode (frame_clock, | |
+ CLUTTER_FRAME_CLOCK_MODE_VARIABLE); | |
+ break; | |
+ case META_FRAME_SYNC_MODE_DISABLED: | |
+ clutter_frame_clock_set_mode (frame_clock, | |
+ CLUTTER_FRAME_CLOCK_MODE_FIXED); | |
+ break; | |
+ case META_FRAME_SYNC_MODE_INIT: | |
+ g_assert_not_reached (); | |
+ } | |
+ | |
+ view_native->frame_sync_mode = sync_mode; | |
+} | |
+ | |
+static MetaFrameSyncMode | |
+meta_renderer_view_native_get_applicable_sync_mode (MetaRendererViewNative *view_native) | |
+{ | |
+ return META_FRAME_SYNC_MODE_DISABLED; | |
+} | |
+ | |
+void | |
+meta_renderer_view_native_maybe_set_frame_sync (MetaRendererViewNative *view_native) | |
+{ | |
+ MetaFrameSyncMode applicable_sync_mode; | |
+ | |
+ if (G_LIKELY (!view_native->frame_sync_mode_update_queued)) | |
+ return; | |
+ | |
+ view_native->frame_sync_mode_update_queued = FALSE; | |
+ | |
+ applicable_sync_mode = | |
+ meta_renderer_view_native_get_applicable_sync_mode (view_native); | |
+ | |
+ if (applicable_sync_mode != view_native->frame_sync_mode) | |
+ { | |
+ meta_renderer_view_native_set_frame_sync (view_native, | |
+ applicable_sync_mode); | |
+ } | |
+} | |
+ | |
+static void | |
+meta_renderer_view_native_dispose (GObject *object) | |
+{ | |
+ MetaRendererViewNative *view_native = META_RENDERER_VIEW_NATIVE (object); | |
+ | |
+ if (view_native->frame_sync_actor) | |
+ { | |
+ g_clear_signal_handler (&view_native->frame_sync_actor_destroy_id, | |
+ view_native->frame_sync_actor); | |
+ g_clear_signal_handler (&view_native->frame_sync_actor_frozen_id, | |
+ view_native->frame_sync_actor); | |
+ } | |
+ | |
+ G_OBJECT_CLASS (meta_renderer_view_native_parent_class)->dispose (object); | |
+} | |
+ | |
static void | |
meta_renderer_view_native_class_init (MetaRendererViewNativeClass *klass) | |
{ | |
diff --git a/src/backends/native/meta-renderer-view-native.h b/src/backends/native/meta-renderer-view-native.h | |
index 34c37939c..16e3a8d48 100644 | |
--- a/src/backends/native/meta-renderer-view-native.h | |
+++ b/src/backends/native/meta-renderer-view-native.h | |
@@ -31,4 +31,9 @@ | |
G_DECLARE_FINAL_TYPE (MetaRendererViewNative, meta_renderer_view_native, | |
META, RENDERER_VIEW_NATIVE, MetaRendererView) | |
+void meta_renderer_view_native_set_frame_sync_actor (MetaRendererViewNative *view_native, | |
+ ClutterActor *actor); | |
+ | |
+void meta_renderer_view_native_maybe_set_frame_sync (MetaRendererViewNative *view_native); | |
+ | |
#endif /* META_RENDERER_VIEW_NATIVE_H */ | |
-- | |
2.40.0 | |
From 89a77a9073ac109e90bc18f6b35347952188f1f3 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 00:59:47 -0600 | |
Subject: [PATCH 05/16] 7 | |
--- | |
clutter/clutter/clutter-stage.c | 21 +-------------------- | |
1 file changed, 1 insertion(+), 20 deletions(-) | |
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c | |
index 25abb9de4..0953360f5 100644 | |
--- a/clutter/clutter/clutter-stage.c | |
+++ b/clutter/clutter/clutter-stage.c | |
@@ -144,8 +144,6 @@ struct _ClutterStagePrivate | |
int update_freeze_count; | |
- gboolean pending_finish_queue_redraws; | |
- | |
GHashTable *pointer_devices; | |
GHashTable *touch_sequences; | |
@@ -2556,19 +2554,7 @@ clutter_stage_queue_actor_redraw (ClutterStage *stage, | |
CLUTTER_NOTE (CLIPPING, "stage_queue_actor_redraw (actor=%s, clip=%p): ", | |
_clutter_actor_get_debug_name (actor), clip); | |
- if (!priv->pending_finish_queue_redraws) | |
- { | |
- GList *l; | |
- | |
- for (l = clutter_stage_peek_stage_views (stage); l; l = l->next) | |
- { | |
- ClutterStageView *view = l->data; | |
- | |
- clutter_stage_view_schedule_update (view); | |
- } | |
- | |
- priv->pending_finish_queue_redraws = TRUE; | |
- } | |
+ clutter_stage_schedule_actor_update (stage, actor); | |
entry = g_hash_table_lookup (priv->pending_queue_redraws, actor); | |
@@ -2692,11 +2678,6 @@ clutter_stage_maybe_finish_queue_redraws (ClutterStage *stage) | |
COGL_TRACE_BEGIN_SCOPED (ClutterStageFinishQueueRedraws, "FinishQueueRedraws"); | |
- if (!priv->pending_finish_queue_redraws) | |
- return; | |
- | |
- priv->pending_finish_queue_redraws = FALSE; | |
- | |
g_hash_table_iter_init (&iter, priv->pending_queue_redraws); | |
while (g_hash_table_iter_next (&iter, &key, &value)) | |
{ | |
-- | |
2.40.0 | |
From 097567bb703ee126d4aa0da83a8bc3fb6fb842d0 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:00:37 -0600 | |
Subject: [PATCH 06/16] 8 | |
--- | |
src/compositor/meta-compositor-native.c | 3 + | |
src/compositor/meta-compositor-view-native.c | 73 ++++++++++++++++++++ | |
2 files changed, 76 insertions(+) | |
diff --git a/src/compositor/meta-compositor-native.c b/src/compositor/meta-compositor-native.c | |
index e2e512494..a0e022449 100644 | |
--- a/src/compositor/meta-compositor-native.c | |
+++ b/src/compositor/meta-compositor-native.c | |
@@ -45,6 +45,9 @@ meta_compositor_native_before_paint (MetaCompositor *compositor, | |
compositor); | |
#endif | |
+ meta_compositor_view_native_maybe_set_frame_sync (compositor_view_native, | |
+ compositor); | |
+ | |
parent_class = META_COMPOSITOR_CLASS (meta_compositor_native_parent_class); | |
parent_class->before_paint (compositor, compositor_view); | |
} | |
diff --git a/src/compositor/meta-compositor-view-native.c b/src/compositor/meta-compositor-view-native.c | |
index e9f1ac20c..d1fb5158d 100644 | |
--- a/src/compositor/meta-compositor-view-native.c | |
+++ b/src/compositor/meta-compositor-view-native.c | |
@@ -31,6 +31,10 @@ | |
#include "compositor/compositor-private.h" | |
#include "compositor/meta-window-actor-private.h" | |
+#include "backends/native/meta-renderer-view-native.h" | |
+#include "clutter/clutter.h" | |
+#include "core/window-private.h" | |
+ | |
#ifdef HAVE_WAYLAND | |
#include "compositor/meta-surface-actor-wayland.h" | |
#include "wayland/meta-wayland-surface.h" | |
@@ -271,6 +275,75 @@ meta_compositor_view_native_maybe_assign_scanout (MetaCompositorViewNative *view | |
} | |
#endif /* HAVE_WAYLAND */ | |
+static ClutterActor * | |
+find_frame_sync_actor (MetaCompositorView *compositor_view, | |
+ MetaCompositor *compositor) | |
+{ | |
+ MetaWindowActor *window_actor; | |
+ MetaWindow *window; | |
+ ClutterStageView *stage_view; | |
+ MetaRectangle view_layout; | |
+ MetaSurfaceActor *surface_actor; | |
+ | |
+ if (meta_compositor_is_unredirect_inhibited (compositor)) | |
+ return NULL; | |
+ | |
+ window_actor = | |
+ meta_compositor_view_get_top_window_actor (compositor_view); | |
+ if (!window_actor) | |
+ return NULL; | |
+ | |
+ if (meta_window_actor_is_frozen (window_actor)) | |
+ return NULL; | |
+ | |
+ if (meta_window_actor_effect_in_progress (window_actor)) | |
+ return NULL; | |
+ | |
+ if (clutter_actor_has_transitions (CLUTTER_ACTOR (window_actor))) | |
+ return NULL; | |
+ | |
+ window = meta_window_actor_get_meta_window (window_actor); | |
+ if (!window) | |
+ return NULL; | |
+ | |
+ stage_view = meta_compositor_view_get_stage_view (compositor_view); | |
+ | |
+ clutter_stage_view_get_layout (stage_view, &view_layout); | |
+ | |
+ if (!meta_window_frame_contains_rect (window, &view_layout)) | |
+ return NULL; | |
+ | |
+ surface_actor = meta_window_actor_get_scanout_candidate (window_actor); | |
+ if (!surface_actor) | |
+ return NULL; | |
+ | |
+ if (!meta_surface_actor_contains_rect (surface_actor, | |
+ &view_layout)) | |
+ return NULL; | |
+ | |
+ return CLUTTER_ACTOR (surface_actor); | |
+} | |
+ | |
+void | |
+meta_compositor_view_native_maybe_set_frame_sync (MetaCompositorViewNative *view_native, | |
+ MetaCompositor *compositor) | |
+{ | |
+ MetaCompositorView *compositor_view = | |
+ META_COMPOSITOR_VIEW (view_native); | |
+ ClutterActor *frame_sync_actor; | |
+ MetaRendererViewNative *renderer_view_native; | |
+ ClutterStageView *stage_view; | |
+ | |
+ frame_sync_actor = find_frame_sync_actor (compositor_view, | |
+ compositor); | |
+ | |
+ stage_view = meta_compositor_view_get_stage_view (compositor_view); | |
+ renderer_view_native = META_RENDERER_VIEW_NATIVE (stage_view); | |
+ | |
+ meta_renderer_view_native_set_frame_sync_actor (renderer_view_native, | |
+ frame_sync_actor); | |
+} | |
+ | |
MetaCompositorViewNative * | |
meta_compositor_view_native_new (ClutterStageView *stage_view) | |
{ | |
-- | |
2.40.0 | |
From df54d6dfc5c923575fb3d8e25f3daec4adac79bd Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:01:27 -0600 | |
Subject: [PATCH 07/16] 9 | |
--- | |
src/core/window-private.h | 3 +++ | |
src/core/window.c | 8 ++++++++ | |
2 files changed, 11 insertions(+) | |
diff --git a/src/core/window-private.h b/src/core/window-private.h | |
index 1c1215972..bb7fc1ea5 100644 | |
--- a/src/core/window-private.h | |
+++ b/src/core/window-private.h | |
@@ -695,6 +695,9 @@ void meta_window_get_session_geometry (MetaWindow *window, | |
int *width, | |
int *height); | |
+gboolean meta_window_frame_contains_rect (MetaWindow *window, | |
+ MetaRectangle *rect); | |
+ | |
void meta_window_update_unfocused_button_grabs (MetaWindow *window); | |
void meta_window_update_appears_focused (MetaWindow *window); | |
diff --git a/src/core/window.c b/src/core/window.c | |
index 40cc7b7da..812fe5a2a 100644 | |
--- a/src/core/window.c | |
+++ b/src/core/window.c | |
@@ -4262,6 +4262,14 @@ meta_window_get_session_geometry (MetaWindow *window, | |
window->size_hints.height_inc; | |
} | |
+gboolean | |
+meta_window_frame_contains_rect (MetaWindow *window, | |
+ MetaRectangle *rect) | |
+{ | |
+ return meta_rectangle_contains_rect (&window->rect, | |
+ rect); | |
+} | |
+ | |
/** | |
* meta_window_get_buffer_rect: | |
* @window: a #MetaWindow | |
-- | |
2.40.0 | |
From d79b58c39c0f1a8d96edb951c69141338f414513 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:01:50 -0600 | |
Subject: [PATCH 08/16] 10 | |
--- | |
src/compositor/meta-surface-actor.c | 16 ++++++++++++++++ | |
src/compositor/meta-surface-actor.h | 3 +++ | |
2 files changed, 19 insertions(+) | |
diff --git a/src/compositor/meta-surface-actor.c b/src/compositor/meta-surface-actor.c | |
index 7279d7dd0..7ecef8819 100644 | |
--- a/src/compositor/meta-surface-actor.c | |
+++ b/src/compositor/meta-surface-actor.c | |
@@ -521,6 +521,22 @@ meta_surface_actor_is_obscured_on_stage_view (MetaSurfaceActor *self, | |
stage_view); | |
} | |
+gboolean | |
+meta_surface_actor_contains_rect (MetaSurfaceActor *surface_actor, | |
+ MetaRectangle *rect) | |
+{ | |
+ ClutterActor *actor = CLUTTER_ACTOR (surface_actor); | |
+ graphene_rect_t bounding_rect; | |
+ graphene_rect_t bound_rect; | |
+ | |
+ clutter_actor_get_transformed_extents (actor, &bounding_rect); | |
+ | |
+ _clutter_util_rect_from_rectangle (rect, &bound_rect); | |
+ | |
+ return graphene_rect_contains_rect (&bounding_rect, | |
+ &bound_rect); | |
+} | |
+ | |
void | |
meta_surface_actor_set_input_region (MetaSurfaceActor *self, | |
cairo_region_t *region) | |
diff --git a/src/compositor/meta-surface-actor.h b/src/compositor/meta-surface-actor.h | |
index f69cb1527..3128f513c 100644 | |
--- a/src/compositor/meta-surface-actor.h | |
+++ b/src/compositor/meta-surface-actor.h | |
@@ -40,6 +40,9 @@ gboolean meta_surface_actor_is_obscured_on_stage_view (MetaSurfaceActor *self, | |
ClutterStageView *stage_view, | |
float *unobscurred_fraction); | |
+gboolean meta_surface_actor_contains_rect (MetaSurfaceActor *surface_actor, | |
+ MetaRectangle *rect); | |
+ | |
void meta_surface_actor_set_input_region (MetaSurfaceActor *self, | |
cairo_region_t *region); | |
void meta_surface_actor_set_opaque_region (MetaSurfaceActor *self, | |
-- | |
2.40.0 | |
From d1bb092a722775b94a65ff7cf3e6aace15f60cc5 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:06:23 -0600 | |
Subject: [PATCH 09/16] 11 | |
--- | |
src/backends/native/meta-kms-connector-private.h | 1 + | |
src/backends/native/meta-kms-connector.c | 13 +++++++++++++ | |
src/backends/native/meta-kms-connector.h | 1 + | |
3 files changed, 15 insertions(+) | |
diff --git a/src/backends/native/meta-kms-connector-private.h b/src/backends/native/meta-kms-connector-private.h | |
index c5ae9e251..8f9bcdafa 100644 | |
--- a/src/backends/native/meta-kms-connector-private.h | |
+++ b/src/backends/native/meta-kms-connector-private.h | |
@@ -40,6 +40,7 @@ typedef enum _MetaKmsConnectorProp | |
META_KMS_CONNECTOR_PROP_PANEL_ORIENTATION, | |
META_KMS_CONNECTOR_PROP_NON_DESKTOP, | |
META_KMS_CONNECTOR_PROP_MAX_BPC, | |
+ META_KMS_CONNECTOR_PROP_VRR_CAPABLE, | |
META_KMS_CONNECTOR_PROP_COLORSPACE, | |
META_KMS_CONNECTOR_PROP_HDR_OUTPUT_METADATA, | |
META_KMS_CONNECTOR_N_PROPS | |
diff --git a/src/backends/native/meta-kms-connector.c b/src/backends/native/meta-kms-connector.c | |
index 0f96a5c26..7f34dfb89 100644 | |
--- a/src/backends/native/meta-kms-connector.c | |
+++ b/src/backends/native/meta-kms-connector.c | |
@@ -394,6 +394,10 @@ state_set_properties (MetaKmsConnectorState *state, | |
if (prop->prop_id) | |
set_privacy_screen (state, connector, prop); | |
+ prop = &props[META_KMS_CONNECTOR_PROP_VRR_CAPABLE]; | |
+ if (prop->prop_id) | |
+ state->vrr_capable = prop->value; | |
+ | |
prop = &props[META_KMS_CONNECTOR_PROP_MAX_BPC]; | |
if (prop->prop_id) | |
{ | |
@@ -842,6 +846,7 @@ meta_kms_connector_state_new (void) | |
state = g_new0 (MetaKmsConnectorState, 1); | |
state->suggested_x = -1; | |
state->suggested_y = -1; | |
+ state->vrr_capable = FALSE; | |
return state; | |
} | |
@@ -1006,6 +1011,9 @@ meta_kms_connector_state_changes (MetaKmsConnectorState *state, | |
state->max_bpc.max_value != new_state->max_bpc.max_value) | |
return META_KMS_RESOURCE_CHANGE_FULL; | |
+ if (state->vrr_capable != new_state->vrr_capable) | |
+ return META_KMS_RESOURCE_CHANGE_FULL; | |
+ | |
if (state->colorspace.value != new_state->colorspace.value || | |
state->colorspace.supported != new_state->colorspace.supported) | |
return META_KMS_RESOURCE_CHANGE_FULL; | |
@@ -1341,6 +1349,11 @@ init_properties (MetaKmsConnector *connector, | |
.name = "non-desktop", | |
.type = DRM_MODE_PROP_RANGE, | |
}, | |
+ [META_KMS_CONNECTOR_PROP_VRR_CAPABLE] = | |
+ { | |
+ .name = "vrr_capable", | |
+ .type = DRM_MODE_PROP_RANGE, | |
+ }, | |
[META_KMS_CONNECTOR_PROP_MAX_BPC] = | |
{ | |
.name = "max bpc", | |
diff --git a/src/backends/native/meta-kms-connector.h b/src/backends/native/meta-kms-connector.h | |
index be946a506..7350b01f7 100644 | |
--- a/src/backends/native/meta-kms-connector.h | |
+++ b/src/backends/native/meta-kms-connector.h | |
@@ -61,6 +61,7 @@ typedef struct _MetaKmsConnectorState | |
MetaMonitorTransform panel_orientation_transform; | |
MetaKmsRange max_bpc; | |
+ gboolean vrr_capable; | |
struct { | |
MetaOutputColorspace value; | |
-- | |
2.40.0 | |
From e57539ba7ab2f230000ddf38bdd5079148b241a6 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:11:36 -0600 | |
Subject: [PATCH 10/16] 12 | |
--- | |
src/backends/native/meta-kms-impl-device-atomic.c | 2 +- | |
src/backends/native/meta-kms-update-private.h | 3 +++ | |
src/backends/native/meta-kms-update.c | 11 +++++++++++ | |
3 files changed, 15 insertions(+), 1 deletion(-) | |
diff --git a/src/backends/native/meta-kms-impl-device-atomic.c b/src/backends/native/meta-kms-impl-device-atomic.c | |
index 83b217274..b971bb25c 100644 | |
--- a/src/backends/native/meta-kms-impl-device-atomic.c | |
+++ b/src/backends/native/meta-kms-impl-device-atomic.c | |
@@ -1017,7 +1017,7 @@ meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device, | |
&error)) | |
goto err; | |
- if (meta_kms_update_get_needs_modeset (update)) | |
+ if (meta_kms_update_needs_allow_modeset (update)) | |
commit_flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; | |
else | |
commit_flags |= DRM_MODE_ATOMIC_NONBLOCK; | |
diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h | |
index ab4ad1395..18c548f38 100644 | |
--- a/src/backends/native/meta-kms-update-private.h | |
+++ b/src/backends/native/meta-kms-update-private.h | |
@@ -185,6 +185,9 @@ GList * meta_kms_update_get_connector_updates (MetaKmsUpdate *update); | |
META_EXPORT_TEST | |
GList * meta_kms_update_get_crtc_color_updates (MetaKmsUpdate *update); | |
+META_EXPORT_TEST | |
+gboolean meta_kms_update_needs_allow_modeset (MetaKmsUpdate *update); | |
+ | |
MetaKmsCustomPageFlip * meta_kms_update_take_custom_page_flip_func (MetaKmsUpdate *update); | |
void meta_kms_update_drop_plane_assignment (MetaKmsUpdate *update, | |
diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c | |
index ceb298a80..40cba9ba3 100644 | |
--- a/src/backends/native/meta-kms-update.c | |
+++ b/src/backends/native/meta-kms-update.c | |
@@ -41,6 +41,8 @@ struct _MetaKmsUpdate | |
GList *connector_updates; | |
GList *crtc_color_updates; | |
+ gboolean needs_allow_modeset; | |
+ | |
MetaKmsCustomPageFlip *custom_page_flip; | |
GList *page_flip_listeners; | |
@@ -321,6 +323,8 @@ meta_kms_update_mode_set (MetaKmsUpdate *update, | |
}; | |
update->mode_sets = g_list_prepend (update->mode_sets, mode_set); | |
+ | |
+ update->needs_allow_modeset = TRUE; | |
} | |
static MetaKmsConnectorUpdate * | |
@@ -697,6 +701,12 @@ meta_kms_update_get_crtc_color_updates (MetaKmsUpdate *update) | |
return update->crtc_color_updates; | |
} | |
+gboolean | |
+meta_kms_update_needs_allow_modeset (MetaKmsUpdate *update) | |
+{ | |
+ return update->needs_allow_modeset; | |
+} | |
+ | |
void | |
meta_kms_update_seal (MetaKmsUpdate *update) | |
{ | |
@@ -1013,6 +1023,7 @@ meta_kms_update_new (MetaKmsDevice *device) | |
update = g_new0 (MetaKmsUpdate, 1); | |
update->device = device; | |
+ update->needs_allow_modeset = FALSE; | |
return update; | |
} | |
-- | |
2.40.0 | |
From 9a823f53b46298bbab2fca3b8fad8ce90f5ce74b Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:16:22 -0600 | |
Subject: [PATCH 11/16] 13 | |
--- | |
src/backends/native/meta-kms-crtc-private.h | 8 ++ | |
src/backends/native/meta-kms-crtc.c | 5 ++ | |
.../native/meta-kms-impl-device-atomic.c | 43 ++++++++++ | |
.../native/meta-kms-impl-device-simple.c | 78 +++++++++++++++++++ | |
src/backends/native/meta-kms-update-private.h | 13 ++++ | |
src/backends/native/meta-kms-update.c | 47 +++++++++++ | |
src/backends/native/meta-kms-update.h | 4 + | |
7 files changed, 198 insertions(+) | |
diff --git a/src/backends/native/meta-kms-crtc-private.h b/src/backends/native/meta-kms-crtc-private.h | |
index e36202be7..ce1bdc647 100644 | |
--- a/src/backends/native/meta-kms-crtc-private.h | |
+++ b/src/backends/native/meta-kms-crtc-private.h | |
@@ -31,9 +31,17 @@ typedef enum _MetaKmsCrtcProp | |
META_KMS_CRTC_PROP_ACTIVE, | |
META_KMS_CRTC_PROP_GAMMA_LUT, | |
META_KMS_CRTC_PROP_GAMMA_LUT_SIZE, | |
+ META_KMS_CRTC_PROP_VRR_ENABLED, | |
META_KMS_CRTC_N_PROPS | |
} MetaKmsCrtcProp; | |
+typedef enum _MetaKmsCrtcVRRMode | |
+{ | |
+ META_KMS_CRTC_VRR_MODE_DISABLED = 0, | |
+ META_KMS_CRTC_VRR_MODE_ENABLED, | |
+ META_KMS_CRTC_VRR_MODE_N_PROPS, | |
+} MetaKmsCrtcVRRMode; | |
+ | |
MetaKmsCrtc * meta_kms_crtc_new (MetaKmsImplDevice *impl_device, | |
drmModeCrtc *drm_crtc, | |
int idx, | |
diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c | |
index e5405428c..719d1857e 100644 | |
--- a/src/backends/native/meta-kms-crtc.c | |
+++ b/src/backends/native/meta-kms-crtc.c | |
@@ -425,6 +425,11 @@ init_properties (MetaKmsCrtc *crtc, | |
.name = "GAMMA_LUT_SIZE", | |
.type = DRM_MODE_PROP_RANGE, | |
}, | |
+ [META_KMS_CRTC_PROP_VRR_ENABLED] = | |
+ { | |
+ .name = "VRR_ENABLED", | |
+ .type = DRM_MODE_PROP_RANGE, | |
+ }, | |
} | |
}; | |
} | |
diff --git a/src/backends/native/meta-kms-impl-device-atomic.c b/src/backends/native/meta-kms-impl-device-atomic.c | |
index b971bb25c..8f45cc16b 100644 | |
--- a/src/backends/native/meta-kms-impl-device-atomic.c | |
+++ b/src/backends/native/meta-kms-impl-device-atomic.c | |
@@ -335,6 +335,39 @@ add_crtc_property (MetaKmsImplDevice *impl_device, | |
return TRUE; | |
} | |
+static gboolean | |
+process_crtc_update (MetaKmsImplDevice *impl_device, | |
+ MetaKmsUpdate *update, | |
+ drmModeAtomicReq *req, | |
+ GArray *blob_ids, | |
+ gpointer update_entry, | |
+ gpointer user_data, | |
+ GError **error) | |
+{ | |
+ MetaKmsCrtcUpdate *crtc_update = update_entry; | |
+ MetaKmsCrtc *crtc = crtc_update->crtc; | |
+ | |
+ if (crtc_update->vrr_mode.has_update) | |
+ { | |
+ meta_topic (META_DEBUG_KMS, | |
+ "[atomic] Setting VRR mode to %d on CRTC %u (%s)", | |
+ crtc_update->vrr_mode.is_enabled ? | |
+ META_KMS_CRTC_VRR_MODE_ENABLED : | |
+ META_KMS_CRTC_VRR_MODE_DISABLED, | |
+ meta_kms_crtc_get_id (crtc), | |
+ meta_kms_impl_device_get_path (impl_device)); | |
+ | |
+ if (!add_crtc_property (impl_device, | |
+ crtc, req, | |
+ META_KMS_CRTC_PROP_VRR_ENABLED, | |
+ crtc_update->vrr_mode.is_enabled, | |
+ error)) | |
+ return FALSE; | |
+ } | |
+ | |
+ return TRUE; | |
+} | |
+ | |
static gboolean | |
process_mode_set (MetaKmsImplDevice *impl_device, | |
MetaKmsUpdate *update, | |
@@ -1007,6 +1040,16 @@ meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device, | |
&error)) | |
goto err; | |
+ if (!process_entries (impl_device, | |
+ update, | |
+ req, | |
+ blob_ids, | |
+ meta_kms_update_get_crtc_updates (update), | |
+ NULL, | |
+ process_crtc_update, | |
+ &error)) | |
+ goto err; | |
+ | |
if (!process_entries (impl_device, | |
update, | |
req, | |
diff --git a/src/backends/native/meta-kms-impl-device-simple.c b/src/backends/native/meta-kms-impl-device-simple.c | |
index 341d54cc7..509f26033 100644 | |
--- a/src/backends/native/meta-kms-impl-device-simple.c | |
+++ b/src/backends/native/meta-kms-impl-device-simple.c | |
@@ -180,6 +180,47 @@ set_connector_property (MetaKmsImplDevice *impl_device, | |
return TRUE; | |
} | |
+static gboolean | |
+set_crtc_property (MetaKmsImplDevice *impl_device, | |
+ MetaKmsCrtc *crtc, | |
+ MetaKmsCrtcProp prop, | |
+ uint64_t value, | |
+ GError **error) | |
+{ | |
+ uint32_t prop_id; | |
+ int fd; | |
+ int ret; | |
+ | |
+ prop_id = meta_kms_crtc_get_prop_id (crtc, prop); | |
+ if (!prop_id) | |
+ { | |
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, | |
+ "Property (%s) not found on CRTC %u", | |
+ meta_kms_crtc_get_prop_name (crtc, prop), | |
+ meta_kms_crtc_get_id (crtc)); | |
+ return FALSE; | |
+ } | |
+ | |
+ fd = meta_kms_impl_device_get_fd (impl_device); | |
+ | |
+ ret = drmModeObjectSetProperty (fd, | |
+ meta_kms_crtc_get_id (crtc), | |
+ DRM_MODE_OBJECT_CRTC, | |
+ prop_id, | |
+ value); | |
+ if (ret != 0) | |
+ { | |
+ g_set_error (error, G_IO_ERROR, g_io_error_from_errno (-ret), | |
+ "Failed to set CRTC %u property %u: %s", | |
+ meta_kms_crtc_get_id (crtc), | |
+ prop_id, | |
+ g_strerror (-ret)); | |
+ return FALSE; | |
+ } | |
+ | |
+ return TRUE; | |
+} | |
+ | |
static gboolean | |
process_connector_update (MetaKmsImplDevice *impl_device, | |
MetaKmsUpdate *update, | |
@@ -269,6 +310,36 @@ process_connector_update (MetaKmsImplDevice *impl_device, | |
return TRUE; | |
} | |
+static gboolean | |
+process_crtc_update (MetaKmsImplDevice *impl_device, | |
+ MetaKmsUpdate *update, | |
+ gpointer update_entry, | |
+ GError **error) | |
+{ | |
+ MetaKmsCrtcUpdate *crtc_update = update_entry; | |
+ MetaKmsCrtc *crtc = crtc_update->crtc; | |
+ | |
+ if (crtc_update->vrr_mode.has_update) | |
+ { | |
+ meta_topic (META_DEBUG_KMS, | |
+ "[simple] Setting VRR mode to %d on CRTC %u (%s)", | |
+ crtc_update->vrr_mode.is_enabled ? | |
+ META_KMS_CRTC_VRR_MODE_ENABLED : | |
+ META_KMS_CRTC_VRR_MODE_DISABLED, | |
+ meta_kms_crtc_get_id (crtc), | |
+ meta_kms_impl_device_get_path (impl_device)); | |
+ | |
+ if (!set_crtc_property (impl_device, | |
+ crtc, | |
+ META_KMS_CRTC_PROP_VRR_ENABLED, | |
+ crtc_update->vrr_mode.is_enabled, | |
+ error)) | |
+ return FALSE; | |
+ } | |
+ | |
+ return TRUE; | |
+} | |
+ | |
static CachedModeSet * | |
cached_mode_set_new (GList *connectors, | |
const drmModeModeInfo *drm_mode, | |
@@ -1514,6 +1585,13 @@ meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device, | |
&error)) | |
goto err; | |
+ if (!process_entries (impl_device, | |
+ update, | |
+ meta_kms_update_get_crtc_updates (update), | |
+ process_crtc_update, | |
+ &error)) | |
+ goto err; | |
+ | |
if (!process_entries (impl_device, | |
update, | |
meta_kms_update_get_crtc_color_updates (update), | |
diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h | |
index 18c548f38..5bbc617a7 100644 | |
--- a/src/backends/native/meta-kms-update-private.h | |
+++ b/src/backends/native/meta-kms-update-private.h | |
@@ -114,6 +114,16 @@ typedef struct _MetaKmsConnectorUpdate | |
} hdr; | |
} MetaKmsConnectorUpdate; | |
+typedef struct _MetaKmsCrtcUpdate | |
+{ | |
+ MetaKmsCrtc *crtc; | |
+ | |
+ struct { | |
+ gboolean has_update; | |
+ gboolean is_enabled; | |
+ } vrr_mode; | |
+} MetaKmsCrtcUpdate; | |
+ | |
typedef struct _MetaKmsPageFlipListener | |
{ | |
gatomicrefcount ref_count; | |
@@ -185,6 +195,9 @@ GList * meta_kms_update_get_connector_updates (MetaKmsUpdate *update); | |
META_EXPORT_TEST | |
GList * meta_kms_update_get_crtc_color_updates (MetaKmsUpdate *update); | |
+META_EXPORT_TEST | |
+GList * meta_kms_update_get_crtc_updates (MetaKmsUpdate *update); | |
+ | |
META_EXPORT_TEST | |
gboolean meta_kms_update_needs_allow_modeset (MetaKmsUpdate *update); | |
diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c | |
index 40cba9ba3..db0c77bd3 100644 | |
--- a/src/backends/native/meta-kms-update.c | |
+++ b/src/backends/native/meta-kms-update.c | |
@@ -39,6 +39,7 @@ struct _MetaKmsUpdate | |
GList *mode_sets; | |
GList *plane_assignments; | |
GList *connector_updates; | |
+ GList *crtc_updates; | |
GList *crtc_color_updates; | |
gboolean needs_allow_modeset; | |
@@ -496,6 +497,45 @@ meta_kms_crtc_color_updates_free (MetaKmsCrtcColorUpdate *color_update) | |
g_clear_pointer (&color_update->gamma.state, meta_gamma_lut_free); | |
} | |
+static MetaKmsCrtcUpdate * | |
+ensure_crtc_update (MetaKmsUpdate *update, | |
+ MetaKmsCrtc *crtc) | |
+{ | |
+ GList *l; | |
+ MetaKmsCrtcUpdate *crtc_update; | |
+ | |
+ for (l = update->crtc_updates; l; l = l->next) | |
+ { | |
+ crtc_update = l->data; | |
+ | |
+ if (crtc_update->crtc == crtc) | |
+ return crtc_update; | |
+ } | |
+ | |
+ crtc_update = g_new0 (MetaKmsCrtcUpdate, 1); | |
+ crtc_update->crtc = crtc; | |
+ | |
+ update->crtc_updates = g_list_prepend (update->crtc_updates, | |
+ crtc_update); | |
+ | |
+ return crtc_update; | |
+} | |
+ | |
+void | |
+meta_kms_update_set_vrr_mode (MetaKmsUpdate *update, | |
+ MetaKmsCrtc *crtc, | |
+ gboolean enabled) | |
+{ | |
+ MetaKmsCrtcUpdate *crtc_update; | |
+ | |
+ g_assert (!meta_kms_update_is_sealed (update)); | |
+ g_assert (meta_kms_crtc_get_device (crtc) == update->device); | |
+ | |
+ crtc_update = ensure_crtc_update (update, crtc); | |
+ crtc_update->vrr_mode.has_update = TRUE; | |
+ crtc_update->vrr_mode.is_enabled = enabled; | |
+} | |
+ | |
void | |
meta_kms_update_add_page_flip_listener (MetaKmsUpdate *update, | |
MetaKmsCrtc *crtc, | |
@@ -695,6 +735,12 @@ meta_kms_update_get_connector_updates (MetaKmsUpdate *update) | |
return update->connector_updates; | |
} | |
+GList * | |
+meta_kms_update_get_crtc_updates (MetaKmsUpdate *update) | |
+{ | |
+ return update->crtc_updates; | |
+} | |
+ | |
GList * | |
meta_kms_update_get_crtc_color_updates (MetaKmsUpdate *update) | |
{ | |
@@ -1043,6 +1089,7 @@ meta_kms_update_free (MetaKmsUpdate *update) | |
g_list_free_full (update->page_flip_listeners, | |
(GDestroyNotify) meta_kms_page_flip_listener_unref); | |
g_list_free_full (update->connector_updates, g_free); | |
+ g_list_free_full (update->crtc_updates, g_free); | |
g_list_free_full (update->crtc_color_updates, | |
(GDestroyNotify) meta_kms_crtc_color_updates_free); | |
g_clear_pointer (&update->custom_page_flip, meta_kms_custom_page_flip_free); | |
diff --git a/src/backends/native/meta-kms-update.h b/src/backends/native/meta-kms-update.h | |
index 26da6ca27..93bd8e417 100644 | |
--- a/src/backends/native/meta-kms-update.h | |
+++ b/src/backends/native/meta-kms-update.h | |
@@ -146,6 +146,10 @@ void meta_kms_update_set_crtc_gamma (MetaKmsUpdate *update, | |
MetaKmsCrtc *crtc, | |
const MetaGammaLut *gamma); | |
+void meta_kms_update_set_vrr_mode (MetaKmsUpdate *update, | |
+ MetaKmsCrtc *crtc, | |
+ gboolean enabled); | |
+ | |
void meta_kms_plane_assignment_set_fb_damage (MetaKmsPlaneAssignment *plane_assignment, | |
const int *rectangles, | |
int n_rectangles); | |
-- | |
2.40.0 | |
From 3abb5861795f8ad93c2d5c843860a3f1b1423212 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:17:23 -0600 | |
Subject: [PATCH 12/16] 14 | |
--- | |
data/61-mutter.rules | 230 ++++++++++---------- | |
src/backends/meta-monitor-manager-private.h | 1 + | |
src/backends/meta-output.c | 21 +- | |
src/backends/meta-output.h | 7 + | |
src/backends/native/meta-backend-native.c | 3 + | |
src/backends/native/meta-gpu-kms.c | 9 + | |
src/backends/native/meta-gpu-kms.h | 1 + | |
src/backends/native/meta-kms-types.h | 11 +- | |
src/backends/native/meta-output-kms.c | 29 +++ | |
src/backends/native/meta-output-kms.h | 3 + | |
src/backends/native/meta-udev.c | 7 + | |
src/backends/native/meta-udev.h | 2 + | |
12 files changed, 203 insertions(+), 121 deletions(-) | |
diff --git a/data/61-mutter.rules b/data/61-mutter.rules | |
index 9cbeb8c0d..915bee801 100644 | |
--- a/data/61-mutter.rules | |
+++ b/data/61-mutter.rules | |
@@ -1,117 +1,117 @@ | |
DRIVERS=="amdgpu", SUBSYSTEM=="drm", TAG+="mutter-device-disable-client-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1602", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1606", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x160a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x160b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x160d", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x160e", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1612", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1616", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x161a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x161b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x161d", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x161e", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1622", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1626", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x162a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x162b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x162d", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x162e", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1902", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1906", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x190a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x190b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x190e", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1912", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1913", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1915", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1916", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1917", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x191a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x191b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x191d", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x191e", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1921", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1923", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1926", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1927", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x192a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x192b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x192d", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1932", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x193a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x193b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x193d", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x0a84", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1a84", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1a85", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5a84", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5a85", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3184", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3185", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5902", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5906", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x590a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5908", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x590b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x590e", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5913", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5915", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5917", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5912", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5916", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591d", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591e", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5921", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5923", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5926", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5927", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x593b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591c", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x87c0", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x87ca", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e90", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e93", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e99", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e9c", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e91", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e92", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e96", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e98", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e9a", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e9b", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e94", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea9", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea5", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea6", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea7", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea8", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea1", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea4", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea0", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea3", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea2", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9b21", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba0", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba2", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba4", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba5", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba8", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9baa", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bab", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bac", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9b41", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc0", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc2", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc4", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc5", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc6", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc8", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bca", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bcb", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bcc", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9be6", TAG+="mutter-device-disable-kms-modifiers" | |
-DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bf6", TAG+="mutter-device-disable-kms-modifiers" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1602", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1606", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x160a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x160b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x160d", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x160e", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1612", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1616", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x161a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x161b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x161d", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x161e", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1622", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1626", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x162a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x162b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x162d", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x162e", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1902", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1906", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x190a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x190b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x190e", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1912", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1913", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1915", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1916", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1917", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x191a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x191b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x191d", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x191e", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1921", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1923", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1926", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1927", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x192a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x192b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x192d", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1932", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x193a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x193b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x193d", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x0a84", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1a84", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1a85", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5a84", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5a85", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3184", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3185", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5902", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5906", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x590a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5908", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x590b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x590e", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5913", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5915", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5917", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5912", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5916", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591d", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591e", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5921", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5923", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5926", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x5927", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x593b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x591c", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x87c0", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x87ca", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e90", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e93", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e99", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e9c", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e91", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e92", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e96", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e98", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e9a", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e9b", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3e94", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea9", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea5", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea6", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea7", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea8", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea1", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea4", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea0", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea3", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x3ea2", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9b21", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba0", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba2", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba4", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba5", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9ba8", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9baa", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bab", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bac", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9b41", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc0", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc2", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc4", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc5", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc6", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bc8", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bca", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bcb", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bcc", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9be6", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
+DRIVERS=="i915", SUBSYSTEM=="drm",ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bf6", TAG+="mutter-device-disable-kms-modifiers", TAG+="mutter-device-disable-vrr" | |
ENV{ID_PATH}=="platform-vkms", TAG+="mutter-device-ignore" | |
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h | |
index f9cd9ae31..383f5f5c0 100644 | |
--- a/src/backends/meta-monitor-manager-private.h | |
+++ b/src/backends/meta-monitor-manager-private.h | |
@@ -102,6 +102,7 @@ struct _MetaOutputAssignment | |
gboolean is_primary; | |
gboolean is_presentation; | |
gboolean is_underscanning; | |
+ gboolean is_vrr_allowed; | |
gboolean has_max_bpc; | |
unsigned int max_bpc; | |
}; | |
diff --git a/src/backends/meta-output.c b/src/backends/meta-output.c | |
index 2610b3509..85495fab1 100644 | |
--- a/src/backends/meta-output.c | |
+++ b/src/backends/meta-output.c | |
@@ -66,6 +66,8 @@ typedef struct _MetaOutputPrivate | |
gboolean is_underscanning; | |
+ gboolean is_vrr_allowed; | |
+ | |
gboolean has_max_bpc; | |
unsigned int max_bpc; | |
@@ -199,6 +201,22 @@ meta_output_is_underscanning (MetaOutput *output) | |
return priv->is_underscanning; | |
} | |
+gboolean | |
+meta_output_is_vrr_capable (MetaOutput *output) | |
+{ | |
+ const MetaOutputInfo *output_info = meta_output_get_info (output); | |
+ | |
+ return output_info->vrr_capable; | |
+} | |
+ | |
+gboolean | |
+meta_output_is_vrr_allowed (MetaOutput *output) | |
+{ | |
+ MetaOutputPrivate *priv = meta_output_get_instance_private (output); | |
+ | |
+ return priv->is_vrr_allowed; | |
+} | |
+ | |
gboolean | |
meta_output_get_max_bpc (MetaOutput *output, | |
unsigned int *max_bpc) | |
@@ -269,7 +287,8 @@ meta_output_assign_crtc (MetaOutput *output, | |
priv->is_primary = output_assignment->is_primary; | |
priv->is_presentation = output_assignment->is_presentation; | |
priv->is_underscanning = output_assignment->is_underscanning; | |
- | |
+ priv->is_vrr_allowed = output_assignment->is_vrr_allowed; | |
+ | |
priv->has_max_bpc = output_assignment->has_max_bpc; | |
if (priv->has_max_bpc) | |
priv->max_bpc = output_assignment->max_bpc; | |
diff --git a/src/backends/meta-output.h b/src/backends/meta-output.h | |
index 08e59ddd1..0193ca131 100644 | |
--- a/src/backends/meta-output.h | |
+++ b/src/backends/meta-output.h | |
@@ -147,6 +147,8 @@ typedef struct _MetaOutputInfo | |
gboolean supports_underscanning; | |
gboolean supports_color_transform; | |
+ gboolean vrr_capable; | |
+ | |
unsigned int max_bpc_min; | |
unsigned int max_bpc_max; | |
@@ -231,6 +233,11 @@ gboolean meta_output_is_presentation (MetaOutput *output); | |
META_EXPORT_TEST | |
gboolean meta_output_is_underscanning (MetaOutput *output); | |
+gboolean meta_output_is_vrr_capable (MetaOutput *output); | |
+ | |
+META_EXPORT_TEST | |
+gboolean meta_output_is_vrr_allowed (MetaOutput *output); | |
+ | |
META_EXPORT_TEST | |
gboolean meta_output_get_max_bpc (MetaOutput *output, | |
unsigned int *max_bpc); | |
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c | |
index 5c1690d88..bf1b00b55 100644 | |
--- a/src/backends/native/meta-backend-native.c | |
+++ b/src/backends/native/meta-backend-native.c | |
@@ -592,6 +592,9 @@ add_drm_device (MetaBackendNative *backend_native, | |
if (meta_is_udev_device_disable_modifiers (device)) | |
flags |= META_KMS_DEVICE_FLAG_DISABLE_MODIFIERS; | |
+ if (meta_is_udev_device_disable_vrr (device)) | |
+ flags |= META_KMS_DEVICE_FLAG_DISABLE_VRR; | |
+ | |
if (meta_is_udev_device_disable_client_modifiers (device)) | |
flags |= META_KMS_DEVICE_FLAG_DISABLE_CLIENT_MODIFIERS; | |
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c | |
index 7d46955a3..2c5643b49 100644 | |
--- a/src/backends/native/meta-gpu-kms.c | |
+++ b/src/backends/native/meta-gpu-kms.c | |
@@ -134,6 +134,15 @@ meta_gpu_kms_is_platform_device (MetaGpuKms *gpu_kms) | |
return !!(flags & META_KMS_DEVICE_FLAG_PLATFORM_DEVICE); | |
} | |
+gboolean | |
+meta_gpu_kms_disable_vrr (MetaGpuKms *gpu_kms) | |
+{ | |
+ MetaKmsDeviceFlag flags; | |
+ | |
+ flags = meta_kms_device_get_flags (gpu_kms->kms_device); | |
+ return !!(flags & META_KMS_DEVICE_FLAG_DISABLE_VRR); | |
+} | |
+ | |
static int | |
compare_outputs (gconstpointer one, | |
gconstpointer two) | |
diff --git a/src/backends/native/meta-gpu-kms.h b/src/backends/native/meta-gpu-kms.h | |
index 7a890c845..71808eed5 100644 | |
--- a/src/backends/native/meta-gpu-kms.h | |
+++ b/src/backends/native/meta-gpu-kms.h | |
@@ -47,6 +47,7 @@ gboolean meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms, | |
gboolean meta_gpu_kms_is_boot_vga (MetaGpuKms *gpu_kms); | |
gboolean meta_gpu_kms_is_platform_device (MetaGpuKms *gpu_kms); | |
+gboolean meta_gpu_kms_disable_vrr (MetaGpuKms *gpu_kms); | |
MetaKmsDevice * meta_gpu_kms_get_kms_device (MetaGpuKms *gpu_kms); | |
diff --git a/src/backends/native/meta-kms-types.h b/src/backends/native/meta-kms-types.h | |
index 8e035ac1a..a05fc360d 100644 | |
--- a/src/backends/native/meta-kms-types.h | |
+++ b/src/backends/native/meta-kms-types.h | |
@@ -60,11 +60,12 @@ typedef enum _MetaKmsDeviceFlag | |
META_KMS_DEVICE_FLAG_BOOT_VGA = 1 << 0, | |
META_KMS_DEVICE_FLAG_PLATFORM_DEVICE = 1 << 1, | |
META_KMS_DEVICE_FLAG_DISABLE_MODIFIERS = 1 << 2, | |
- META_KMS_DEVICE_FLAG_PREFERRED_PRIMARY = 1 << 3, | |
- META_KMS_DEVICE_FLAG_NO_MODE_SETTING = 1 << 4, | |
- META_KMS_DEVICE_FLAG_HAS_ADDFB2 = 1 << 5, | |
- META_KMS_DEVICE_FLAG_FORCE_LEGACY = 1 << 6, | |
- META_KMS_DEVICE_FLAG_DISABLE_CLIENT_MODIFIERS = 1 << 7, | |
+ META_KMS_DEVICE_FLAG_DISABLE_VRR = 1 << 3, | |
+ META_KMS_DEVICE_FLAG_PREFERRED_PRIMARY = 1 << 4, | |
+ META_KMS_DEVICE_FLAG_NO_MODE_SETTING = 1 << 5, | |
+ META_KMS_DEVICE_FLAG_HAS_ADDFB2 = 1 << 6, | |
+ META_KMS_DEVICE_FLAG_FORCE_LEGACY = 1 << 7, | |
+ META_KMS_DEVICE_FLAG_DISABLE_CLIENT_MODIFIERS = 1 << 8, | |
} MetaKmsDeviceFlag; | |
typedef enum _MetaKmsResourceChanges | |
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c | |
index f071e4d11..fea70b610 100644 | |
--- a/src/backends/native/meta-output-kms.c | |
+++ b/src/backends/native/meta-output-kms.c | |
@@ -97,6 +97,32 @@ meta_output_kms_set_underscan (MetaOutputKms *output_kms, | |
} | |
} | |
+void | |
+meta_output_kms_set_vrr_mode (MetaOutputKms *output_kms, | |
+ gboolean enabled) | |
+{ | |
+ MetaOutput *output = META_OUTPUT (output_kms); | |
+ const MetaOutputInfo *output_info = meta_output_get_info (output); | |
+ MetaCrtc *crtc; | |
+ MetaKmsCrtc *kms_crtc; | |
+ MetaKmsDevice *kms_device; | |
+ MetaKms *kms; | |
+ MetaKmsUpdate *kms_update; | |
+ | |
+ g_assert (output_info->vrr_capable); | |
+ | |
+ crtc = meta_output_get_assigned_crtc (output); | |
+ kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (crtc)); | |
+ kms_device = meta_kms_crtc_get_device (kms_crtc); | |
+ kms = meta_kms_device_get_kms (kms_device); | |
+ | |
+ kms_update = meta_frame_native_ensure_kms_update (kms, kms_device); | |
+ | |
+ meta_kms_update_set_vrr_mode (kms_update, | |
+ kms_crtc, | |
+ enabled); | |
+} | |
+ | |
void | |
meta_output_kms_set_max_bpc (MetaOutputKms *output_kms, | |
MetaKmsUpdate *kms_update) | |
@@ -475,6 +501,9 @@ meta_output_kms_new (MetaGpuKms *gpu_kms, | |
output_info->supports_underscanning = | |
meta_kms_connector_is_underscanning_supported (kms_connector); | |
+ output_info->vrr_capable = (connector_state->vrr_capable && | |
+ !meta_gpu_kms_disable_vrr (gpu_kms)); | |
+ | |
max_bpc_range = meta_kms_connector_get_max_bpc (kms_connector); | |
if (max_bpc_range) | |
{ | |
diff --git a/src/backends/native/meta-output-kms.h b/src/backends/native/meta-output-kms.h | |
index a9d8f99b1..3ae22e2ee 100644 | |
--- a/src/backends/native/meta-output-kms.h | |
+++ b/src/backends/native/meta-output-kms.h | |
@@ -40,6 +40,9 @@ void meta_output_kms_set_power_save_mode (MetaOutputKms *output_kms, | |
void meta_output_kms_set_underscan (MetaOutputKms *output_kms, | |
MetaKmsUpdate *kms_update); | |
+void meta_output_kms_set_vrr_mode (MetaOutputKms *output_kms, | |
+ gboolean enabled); | |
+ | |
void meta_output_kms_set_max_bpc (MetaOutputKms *output_kms, | |
MetaKmsUpdate *kms_update); | |
diff --git a/src/backends/native/meta-udev.c b/src/backends/native/meta-udev.c | |
index c9b0fc74e..3f8de66eb 100644 | |
--- a/src/backends/native/meta-udev.c | |
+++ b/src/backends/native/meta-udev.c | |
@@ -102,6 +102,13 @@ meta_is_udev_device_disable_modifiers (GUdevDevice *device) | |
"mutter-device-disable-kms-modifiers"); | |
} | |
+gboolean | |
+meta_is_udev_device_disable_vrr (GUdevDevice *device) | |
+{ | |
+ return meta_has_udev_device_tag (device, | |
+ "mutter-device-disable-vrr"); | |
+} | |
+ | |
gboolean | |
meta_is_udev_device_disable_client_modifiers (GUdevDevice *device) | |
{ | |
diff --git a/src/backends/native/meta-udev.h b/src/backends/native/meta-udev.h | |
index 49e06f14a..24b637196 100644 | |
--- a/src/backends/native/meta-udev.h | |
+++ b/src/backends/native/meta-udev.h | |
@@ -35,6 +35,8 @@ gboolean meta_is_udev_device_boot_vga (GUdevDevice *device); | |
gboolean meta_is_udev_device_disable_modifiers (GUdevDevice *device); | |
+gboolean meta_is_udev_device_disable_vrr (GUdevDevice *device); | |
+ | |
gboolean meta_is_udev_device_disable_client_modifiers (GUdevDevice *device); | |
gboolean meta_is_udev_device_ignore (GUdevDevice *device); | |
-- | |
2.40.0 | |
From 4d92fbd7e8b99a9f8beac9802bed250a0da63c74 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:18:31 -0600 | |
Subject: [PATCH 13/16] 16 | |
--- | |
src/backends/meta-monitor.c | 19 +++++++++++++++++++ | |
src/backends/meta-monitor.h | 4 ++++ | |
2 files changed, 23 insertions(+) | |
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c | |
index 00502bb35..c668f3fdc 100644 | |
--- a/src/backends/meta-monitor.c | |
+++ b/src/backends/meta-monitor.c | |
@@ -372,6 +372,25 @@ meta_monitor_is_underscanning (MetaMonitor *monitor) | |
return meta_output_is_underscanning (output); | |
} | |
+gboolean | |
+meta_monitor_is_vrr_capable (MetaMonitor *monitor) | |
+{ | |
+ const MetaOutputInfo *output_info = | |
+ meta_monitor_get_main_output_info (monitor); | |
+ | |
+ return output_info->vrr_capable; | |
+} | |
+ | |
+gboolean | |
+meta_monitor_is_vrr_allowed (MetaMonitor *monitor) | |
+{ | |
+ MetaOutput *output; | |
+ | |
+ output = meta_monitor_get_main_output (monitor); | |
+ | |
+ return meta_output_is_vrr_allowed (output); | |
+} | |
+ | |
gboolean | |
meta_monitor_get_max_bpc (MetaMonitor *monitor, | |
unsigned int *max_bpc) | |
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h | |
index c679f5368..8069dfda8 100644 | |
--- a/src/backends/meta-monitor.h | |
+++ b/src/backends/meta-monitor.h | |
@@ -121,6 +121,10 @@ gboolean meta_monitor_supports_color_transform (MetaMonitor *monitor); | |
gboolean meta_monitor_is_underscanning (MetaMonitor *monitor); | |
+gboolean meta_monitor_is_vrr_capable (MetaMonitor *monitor); | |
+ | |
+gboolean meta_monitor_is_vrr_allowed (MetaMonitor *monitor); | |
+ | |
gboolean meta_monitor_get_max_bpc (MetaMonitor *monitor, | |
unsigned int *max_bpc); | |
-- | |
2.40.0 | |
From 403bc37c31e74322048c65a2660ad434d1490d81 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:19:30 -0600 | |
Subject: [PATCH 14/16] 17 | |
--- | |
.../org.gnome.Mutter.DisplayConfig.xml | 7 + | |
src/backends/meta-monitor-config-manager.c | 5 +- | |
src/backends/meta-monitor-config-manager.h | 1 + | |
src/backends/meta-monitor-config-store.c | 30 +++ | |
src/backends/meta-monitor-manager.c | 27 ++- | |
src/tests/meta-monitor-test-utils.c | 4 + | |
src/tests/meta-monitor-test-utils.h | 2 + | |
src/tests/monitor-store-unit-tests.c | 51 +++++ | |
src/tests/monitor-unit-tests.c | 194 ++++++++++++++++++ | |
9 files changed, 319 insertions(+), 2 deletions(-) | |
diff --git a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml | |
index af78ec051..23ebb7720 100644 | |
--- a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml | |
+++ b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml | |
@@ -343,6 +343,10 @@ | |
- "is-underscanning" (b): whether underscanning is enabled | |
(absence of this means underscanning | |
not being supported) | |
+ - "is-vrr-allowed" (b): whether variable refresh rate is allowed | |
+ (absence of this means variable refresh | |
+ rate not being supported) | |
+ | |
- "max-screen-size" (ii): the maximum size a screen may have | |
(absence of this means unlimited screen | |
size) | |
@@ -461,6 +465,9 @@ | |
- "enable_underscanning" (b): enable monitor underscanning; | |
may only be set when underscanning | |
is supported (see GetCurrentState). | |
+ - "allow_vrr" (b): allow variable refresh rate; may only be set | |
+ when variable refresh rate is supported (see | |
+ GetCurrentState). | |
@properties may effect the global monitor configuration state. Possible | |
properties are: | |
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c | |
index bdafba478..a4c4974c0 100644 | |
--- a/src/backends/meta-monitor-config-manager.c | |
+++ b/src/backends/meta-monitor-config-manager.c | |
@@ -287,6 +287,7 @@ assign_monitor_crtc (MetaMonitor *monitor, | |
.is_primary = assign_output_as_primary, | |
.is_presentation = assign_output_as_presentation, | |
.is_underscanning = data->monitor_config->enable_underscanning, | |
+ .is_vrr_allowed = data->monitor_config->allow_vrr, | |
.has_max_bpc = data->monitor_config->has_max_bpc, | |
.max_bpc = data->monitor_config->max_bpc | |
}; | |
@@ -693,7 +694,8 @@ create_monitor_config (MetaMonitor *monitor, | |
*monitor_config = (MetaMonitorConfig) { | |
.monitor_spec = meta_monitor_spec_clone (monitor_spec), | |
.mode_spec = g_memdup2 (mode_spec, sizeof (MetaMonitorModeSpec)), | |
- .enable_underscanning = meta_monitor_is_underscanning (monitor) | |
+ .enable_underscanning = meta_monitor_is_underscanning (monitor), | |
+ .allow_vrr = meta_monitor_is_vrr_allowed (monitor), | |
}; | |
monitor_config->has_max_bpc = | |
@@ -1047,6 +1049,7 @@ clone_monitor_config_list (GList *monitor_configs_in) | |
.mode_spec = g_memdup2 (monitor_config_in->mode_spec, | |
sizeof (MetaMonitorModeSpec)), | |
.enable_underscanning = monitor_config_in->enable_underscanning, | |
+ .allow_vrr = monitor_config_in->allow_vrr, | |
.has_max_bpc = monitor_config_in->has_max_bpc, | |
.max_bpc = monitor_config_in->max_bpc | |
}; | |
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h | |
index bf45b2327..5d6ed80b1 100644 | |
--- a/src/backends/meta-monitor-config-manager.h | |
+++ b/src/backends/meta-monitor-config-manager.h | |
@@ -34,6 +34,7 @@ typedef struct _MetaMonitorConfig | |
MetaMonitorSpec *monitor_spec; | |
MetaMonitorModeSpec *mode_spec; | |
gboolean enable_underscanning; | |
+ gboolean allow_vrr; | |
gboolean has_max_bpc; | |
unsigned int max_bpc; | |
} MetaMonitorConfig; | |
diff --git a/src/backends/meta-monitor-config-store.c b/src/backends/meta-monitor-config-store.c | |
index 7650334ed..0d939734a 100644 | |
--- a/src/backends/meta-monitor-config-store.c | |
+++ b/src/backends/meta-monitor-config-store.c | |
@@ -167,6 +167,7 @@ typedef enum | |
STATE_MONITOR_MODE_RATE, | |
STATE_MONITOR_MODE_FLAG, | |
STATE_MONITOR_UNDERSCANNING, | |
+ STATE_MONITOR_VRR_ALLOWED, | |
STATE_MONITOR_MAXBPC, | |
STATE_DISABLED, | |
STATE_POLICY, | |
@@ -452,6 +453,10 @@ handle_start_element (GMarkupParseContext *context, | |
{ | |
parser->state = STATE_MONITOR_UNDERSCANNING; | |
} | |
+ else if (g_str_equal (element_name, "vrr-allowed")) | |
+ { | |
+ parser->state = STATE_MONITOR_VRR_ALLOWED; | |
+ } | |
else if (g_str_equal (element_name, "maxbpc")) | |
{ | |
parser->state = STATE_MONITOR_MAXBPC; | |
@@ -549,6 +554,13 @@ handle_start_element (GMarkupParseContext *context, | |
return; | |
} | |
+ case STATE_MONITOR_VRR_ALLOWED: | |
+ { | |
+ g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, | |
+ "Invalid element '%s' under vrr-allowed", element_name); | |
+ return; | |
+ } | |
+ | |
case STATE_MONITOR_MAXBPC: | |
{ | |
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, | |
@@ -830,6 +842,14 @@ handle_end_element (GMarkupParseContext *context, | |
return; | |
} | |
+ case STATE_MONITOR_VRR_ALLOWED: | |
+ { | |
+ g_assert (g_str_equal (element_name, "vrr-allowed")); | |
+ | |
+ parser->state = STATE_MONITOR; | |
+ return; | |
+ } | |
+ | |
case STATE_MONITOR_MAXBPC: | |
{ | |
g_assert (g_str_equal (element_name, "maxbpc")); | |
@@ -1329,6 +1349,14 @@ handle_text (GMarkupParseContext *context, | |
return; | |
} | |
+ case STATE_MONITOR_VRR_ALLOWED: | |
+ { | |
+ read_bool (text, text_len, | |
+ &parser->current_monitor_config->allow_vrr, | |
+ error); | |
+ return; | |
+ } | |
+ | |
case STATE_MONITOR_MAXBPC: | |
{ | |
int signed_max_bpc; | |
@@ -1527,6 +1555,8 @@ append_monitors (GString *buffer, | |
g_string_append (buffer, " </mode>\n"); | |
if (monitor_config->enable_underscanning) | |
g_string_append (buffer, " <underscanning>yes</underscanning>\n"); | |
+ if (monitor_config->allow_vrr) | |
+ g_string_append (buffer, " <vrr-allowed>yes</vrr-allowed>\n"); | |
if (monitor_config->has_max_bpc) | |
{ | |
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c | |
index bd02c55bb..259205167 100644 | |
--- a/src/backends/meta-monitor-manager.c | |
+++ b/src/backends/meta-monitor-manager.c | |
@@ -2111,6 +2111,15 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton, | |
g_variant_new_boolean (is_underscanning)); | |
} | |
+ if (meta_monitor_is_vrr_capable (monitor)) | |
+ { | |
+ gboolean vrr_allowed = meta_monitor_is_vrr_allowed (monitor); | |
+ | |
+ g_variant_builder_add (&monitor_properties_builder, "{sv}", | |
+ "is-vrr-allowed", | |
+ g_variant_new_boolean (vrr_allowed)); | |
+ } | |
+ | |
is_builtin = meta_monitor_is_laptop_panel (monitor); | |
g_variant_builder_add (&monitor_properties_builder, "{sv}", | |
"is-builtin", | |
@@ -2430,6 +2439,8 @@ create_monitor_config_from_variant (MetaMonitorManager *manager, | |
g_autoptr (GVariant) properties_variant = NULL; | |
gboolean enable_underscanning = FALSE; | |
gboolean set_underscanning = FALSE; | |
+ gboolean allow_vrr = FALSE; | |
+ gboolean set_allow_vrr = FALSE; | |
g_variant_get (monitor_config_variant, "(ss@a{sv})", | |
&connector, | |
@@ -2465,6 +2476,19 @@ create_monitor_config_from_variant (MetaMonitorManager *manager, | |
} | |
} | |
+ set_allow_vrr = | |
+ g_variant_lookup (properties_variant, "allow_vrr", "b", | |
+ &allow_vrr); | |
+ if (set_allow_vrr) | |
+ { | |
+ if (allow_vrr && !meta_monitor_is_vrr_capable (monitor)) | |
+ { | |
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, | |
+ "Variable refresh rate requested but unsupported"); | |
+ return NULL; | |
+ } | |
+ } | |
+ | |
monitor_spec = meta_monitor_spec_clone (meta_monitor_get_spec (monitor)); | |
monitor_mode_spec = g_new0 (MetaMonitorModeSpec, 1); | |
@@ -2474,7 +2498,8 @@ create_monitor_config_from_variant (MetaMonitorManager *manager, | |
*monitor_config = (MetaMonitorConfig) { | |
.monitor_spec = monitor_spec, | |
.mode_spec = monitor_mode_spec, | |
- .enable_underscanning = enable_underscanning | |
+ .enable_underscanning = enable_underscanning, | |
+ .allow_vrr = allow_vrr, | |
}; | |
return monitor_config; | |
diff --git a/src/tests/meta-monitor-test-utils.c b/src/tests/meta-monitor-test-utils.c | |
index 98ff445b4..a6ba6ae82 100644 | |
--- a/src/tests/meta-monitor-test-utils.c | |
+++ b/src/tests/meta-monitor-test-utils.c | |
@@ -393,6 +393,9 @@ meta_check_monitor_configuration (MetaContext *context, | |
g_assert_cmpint (expect->monitors[i].is_underscanning, | |
==, | |
meta_output_is_underscanning (output)); | |
+ g_assert_cmpint (expect->monitors[i].is_vrr_allowed, | |
+ ==, | |
+ meta_output_is_vrr_allowed (output)); | |
if (!meta_output_get_max_bpc (output, &output_max_bpc)) | |
output_max_bpc = 0; | |
@@ -796,6 +799,7 @@ meta_create_monitor_test_setup (MetaBackend *backend, | |
output_assignment = (MetaOutputAssignment) { | |
.is_underscanning = setup->outputs[i].is_underscanning, | |
+ .is_vrr_allowed = setup->outputs[i].is_vrr_allowed, | |
.has_max_bpc = !!setup->outputs[i].max_bpc, | |
.max_bpc = setup->outputs[i].max_bpc, | |
}; | |
diff --git a/src/tests/meta-monitor-test-utils.h b/src/tests/meta-monitor-test-utils.h | |
index 278a089fa..88573ad7d 100644 | |
--- a/src/tests/meta-monitor-test-utils.h | |
+++ b/src/tests/meta-monitor-test-utils.h | |
@@ -106,6 +106,7 @@ typedef struct _MonitorTestCaseOutput | |
float scale; | |
gboolean is_laptop_panel; | |
gboolean is_underscanning; | |
+ gboolean is_vrr_allowed; | |
unsigned int max_bpc; | |
const char *serial; | |
MetaMonitorTransform panel_orientation_transform; | |
@@ -161,6 +162,7 @@ typedef struct _MonitorTestCaseMonitor | |
int width_mm; | |
int height_mm; | |
gboolean is_underscanning; | |
+ gboolean is_vrr_allowed; | |
unsigned int max_bpc; | |
} MonitorTestCaseMonitor; | |
diff --git a/src/tests/monitor-store-unit-tests.c b/src/tests/monitor-store-unit-tests.c | |
index 7633f247d..fb7cbe50a 100644 | |
--- a/src/tests/monitor-store-unit-tests.c | |
+++ b/src/tests/monitor-store-unit-tests.c | |
@@ -48,6 +48,7 @@ typedef struct _MonitorStoreTestCaseMonitor | |
const char *serial; | |
MonitorStoreTestCaseMonitorMode mode; | |
gboolean is_underscanning; | |
+ gboolean is_vrr_allowed; | |
unsigned int max_bpc; | |
} MonitorStoreTestCaseMonitor; | |
@@ -197,6 +198,9 @@ check_monitor_store_configuration (MetaMonitorConfigStore *config_store, | |
g_assert_cmpint (monitor_config->enable_underscanning, | |
==, | |
test_monitor->is_underscanning); | |
+ g_assert_cmpint (monitor_config->allow_vrr, | |
+ ==, | |
+ test_monitor->is_vrr_allowed); | |
g_assert_cmpint (monitor_config->has_max_bpc, | |
==, | |
!!test_monitor->max_bpc); | |
@@ -453,6 +457,51 @@ meta_test_monitor_store_underscanning (void) | |
check_monitor_store_configurations (&expect); | |
} | |
+static void | |
+meta_test_monitor_store_vrr_allowed (void) | |
+{ | |
+ MonitorStoreTestExpect expect = { | |
+ .configurations = { | |
+ { | |
+ .logical_monitors = { | |
+ { | |
+ .layout = { | |
+ .x = 0, | |
+ .y = 0, | |
+ .width = 1024, | |
+ .height = 768 | |
+ }, | |
+ .scale = 1, | |
+ .is_primary = TRUE, | |
+ .is_presentation = FALSE, | |
+ .monitors = { | |
+ { | |
+ .connector = "DP-1", | |
+ .vendor = "MetaProduct's Inc.", | |
+ .product = "MetaMonitor", | |
+ .serial = "0x123456", | |
+ .is_vrr_allowed = TRUE, | |
+ .mode = { | |
+ .width = 1024, | |
+ .height = 768, | |
+ .refresh_rate = 60.000495910644531 | |
+ } | |
+ } | |
+ }, | |
+ .n_monitors = 1, | |
+ }, | |
+ }, | |
+ .n_logical_monitors = 1 | |
+ } | |
+ }, | |
+ .n_configurations = 1 | |
+ }; | |
+ | |
+ meta_set_custom_monitor_config (test_context, "vrr-allowed.xml"); | |
+ | |
+ check_monitor_store_configurations (&expect); | |
+} | |
+ | |
static void | |
meta_test_monitor_store_max_bpc (void) | |
{ | |
@@ -1047,6 +1096,8 @@ init_monitor_store_tests (void) | |
meta_test_monitor_store_primary); | |
g_test_add_func ("/backends/monitor-store/underscanning", | |
meta_test_monitor_store_underscanning); | |
+ g_test_add_func ("/backends/monitor-store/vrr-allowed", | |
+ meta_test_monitor_store_vrr_allowed); | |
g_test_add_func ("/backends/monitor-store/max-bpc", | |
meta_test_monitor_store_max_bpc); | |
g_test_add_func ("/backends/monitor-store/scale", | |
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c | |
index 99355f6fe..0dc5e06ea 100644 | |
--- a/src/tests/monitor-unit-tests.c | |
+++ b/src/tests/monitor-unit-tests.c | |
@@ -3254,6 +3254,100 @@ meta_test_monitor_underscanning_config (void) | |
check_monitor_test_clients_state (); | |
} | |
+static void | |
+meta_test_monitor_vrr_allowed_config (void) | |
+{ | |
+ MonitorTestCase test_case = { | |
+ .setup = { | |
+ .modes = { | |
+ { | |
+ .width = 1024, | |
+ .height = 768, | |
+ .refresh_rate = 60.0 | |
+ } | |
+ }, | |
+ .n_modes = 1, | |
+ .outputs = { | |
+ { | |
+ .crtc = 0, | |
+ .modes = { 0 }, | |
+ .n_modes = 1, | |
+ .preferred_mode = 0, | |
+ .possible_crtcs = { 0 }, | |
+ .n_possible_crtcs = 1, | |
+ .width_mm = 222, | |
+ .height_mm = 125, | |
+ .is_vrr_allowed = TRUE, | |
+ } | |
+ }, | |
+ .n_outputs = 1, | |
+ .crtcs = { | |
+ { | |
+ .current_mode = 0 | |
+ } | |
+ }, | |
+ .n_crtcs = 1 | |
+ }, | |
+ | |
+ .expect = { | |
+ .monitors = { | |
+ { | |
+ .outputs = { 0 }, | |
+ .n_outputs = 1, | |
+ .modes = { | |
+ { | |
+ .width = 1024, | |
+ .height = 768, | |
+ .refresh_rate = 60.0, | |
+ .crtc_modes = { | |
+ { | |
+ .output = 0, | |
+ .crtc_mode = 0 | |
+ } | |
+ } | |
+ } | |
+ }, | |
+ .n_modes = 1, | |
+ .current_mode = 0, | |
+ .width_mm = 222, | |
+ .height_mm = 125, | |
+ .is_vrr_allowed = TRUE, | |
+ } | |
+ }, | |
+ .n_monitors = 1, | |
+ .logical_monitors = { | |
+ { | |
+ .monitors = { 0 }, | |
+ .n_monitors = 1, | |
+ .layout = { .x = 0, .y = 0, .width = 1024, .height = 768 }, | |
+ .scale = 1 | |
+ } | |
+ }, | |
+ .n_logical_monitors = 1, | |
+ .primary_logical_monitor = 0, | |
+ .n_outputs = 1, | |
+ .crtcs = { | |
+ { | |
+ .current_mode = 0, | |
+ } | |
+ }, | |
+ .n_crtcs = 1, | |
+ .screen_width = 1024, | |
+ .screen_height = 768 | |
+ } | |
+ }; | |
+ MetaMonitorTestSetup *test_setup; | |
+ | |
+ test_setup = meta_create_monitor_test_setup (test_backend, | |
+ &test_case.setup, | |
+ MONITOR_TEST_FLAG_NO_STORED); | |
+ emulate_hotplug (test_setup); | |
+ META_TEST_LOG_CALL ("Checking monitor configuration", | |
+ meta_check_monitor_configuration (test_context, | |
+ &test_case.expect)); | |
+ check_monitor_test_clients_state (); | |
+} | |
+ | |
static void | |
meta_test_monitor_max_bpc_config (void) | |
{ | |
@@ -5839,6 +5933,102 @@ meta_test_monitor_custom_underscanning_config (void) | |
check_monitor_test_clients_state (); | |
} | |
+static void | |
+meta_test_monitor_custom_vrr_allowed_config (void) | |
+{ | |
+ MonitorTestCase test_case = { | |
+ .setup = { | |
+ .modes = { | |
+ { | |
+ .width = 1024, | |
+ .height = 768, | |
+ .refresh_rate = 60.000495910644531 | |
+ } | |
+ }, | |
+ .n_modes = 1, | |
+ .outputs = { | |
+ { | |
+ .crtc = 0, | |
+ .modes = { 0 }, | |
+ .n_modes = 1, | |
+ .preferred_mode = 0, | |
+ .possible_crtcs = { 0 }, | |
+ .n_possible_crtcs = 1, | |
+ .width_mm = 222, | |
+ .height_mm = 125 | |
+ }, | |
+ }, | |
+ .n_outputs = 1, | |
+ .crtcs = { | |
+ { | |
+ .current_mode = 0 | |
+ }, | |
+ }, | |
+ .n_crtcs = 1 | |
+ }, | |
+ | |
+ .expect = { | |
+ .monitors = { | |
+ { | |
+ .outputs = { 0 }, | |
+ .n_outputs = 1, | |
+ .modes = { | |
+ { | |
+ .width = 1024, | |
+ .height = 768, | |
+ .refresh_rate = 60.000495910644531, | |
+ .crtc_modes = { | |
+ { | |
+ .output = 0, | |
+ .crtc_mode = 0 | |
+ } | |
+ } | |
+ } | |
+ }, | |
+ .n_modes = 1, | |
+ .current_mode = 0, | |
+ .width_mm = 222, | |
+ .height_mm = 125, | |
+ .is_vrr_allowed = TRUE, | |
+ } | |
+ }, | |
+ .n_monitors = 1, | |
+ .logical_monitors = { | |
+ { | |
+ .monitors = { 0 }, | |
+ .n_monitors = 1, | |
+ .layout = { .x = 0, .y = 0, .width = 1024, .height = 768 }, | |
+ .scale = 1 | |
+ } | |
+ }, | |
+ .n_logical_monitors = 1, | |
+ .primary_logical_monitor = 0, | |
+ .n_outputs = 1, | |
+ .crtcs = { | |
+ { | |
+ .current_mode = 0, | |
+ } | |
+ }, | |
+ .n_crtcs = 1, | |
+ .n_tiled_monitors = 0, | |
+ .screen_width = 1024, | |
+ .screen_height = 768 | |
+ } | |
+ }; | |
+ MetaMonitorTestSetup *test_setup; | |
+ | |
+ test_setup = meta_create_monitor_test_setup (test_backend, | |
+ &test_case.setup, | |
+ MONITOR_TEST_FLAG_NONE); | |
+ meta_set_custom_monitor_config (test_context, "vrr-allowed.xml"); | |
+ emulate_hotplug (test_setup); | |
+ | |
+ META_TEST_LOG_CALL ("Checking monitor configuration", | |
+ meta_check_monitor_configuration (test_context, | |
+ &test_case.expect)); | |
+ check_monitor_test_clients_state (); | |
+} | |
+ | |
static void | |
meta_test_monitor_custom_scale_config (void) | |
{ | |
@@ -9624,6 +9814,8 @@ init_monitor_tests (void) | |
meta_test_monitor_no_outputs); | |
add_monitor_test ("/backends/monitor/underscanning-config", | |
meta_test_monitor_underscanning_config); | |
+ add_monitor_test ("/backends/monitor/vrr-allowed-config", | |
+ meta_test_monitor_vrr_allowed_config); | |
add_monitor_test ("/backends/monitor/max-bpc-config", | |
meta_test_monitor_max_bpc_config); | |
add_monitor_test ("/backends/monitor/preferred-non-first-mode", | |
@@ -9658,6 +9850,8 @@ init_monitor_tests (void) | |
meta_test_monitor_custom_primary_config); | |
add_monitor_test ("/backends/monitor/custom/underscanning-config", | |
meta_test_monitor_custom_underscanning_config); | |
+ add_monitor_test ("/backends/monitor/custom/vrr-allowed-config", | |
+ meta_test_monitor_custom_vrr_allowed_config); | |
add_monitor_test ("/backends/monitor/custom/scale-config", | |
meta_test_monitor_custom_scale_config); | |
add_monitor_test ("/backends/monitor/custom/fractional-scale-config", | |
-- | |
2.40.0 | |
From c7401d0b8adff50e5dc7f1705c3929d412eb0b8f Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:20:12 -0600 | |
Subject: [PATCH 15/16] 18 | |
--- | |
src/backends/meta-renderer-view.c | 27 +++++++++++++++++++ | |
src/backends/meta-renderer-view.h | 2 ++ | |
src/backends/native/meta-renderer-native.c | 1 + | |
.../x11/nested/meta-renderer-x11-nested.c | 1 + | |
4 files changed, 31 insertions(+) | |
diff --git a/src/backends/meta-renderer-view.c b/src/backends/meta-renderer-view.c | |
index b974fcbde..7b0796248 100644 | |
--- a/src/backends/meta-renderer-view.c | |
+++ b/src/backends/meta-renderer-view.c | |
@@ -33,6 +33,7 @@ | |
#include "backends/meta-renderer-view.h" | |
#include "backends/meta-crtc.h" | |
+#include "backends/meta-output.h" | |
#include "backends/meta-renderer.h" | |
#include "clutter/clutter-mutter.h" | |
#include "compositor/region-utils.h" | |
@@ -43,6 +44,7 @@ enum | |
PROP_TRANSFORM, | |
PROP_CRTC, | |
+ PROP_OUTPUT, | |
PROP_LAST | |
}; | |
@@ -54,6 +56,7 @@ typedef struct _MetaRendererViewPrivate | |
MetaMonitorTransform transform; | |
MetaCrtc *crtc; | |
+ MetaOutput *output; | |
} MetaRendererViewPrivate; | |
G_DEFINE_TYPE_WITH_PRIVATE (MetaRendererView, meta_renderer_view, | |
@@ -77,6 +80,15 @@ meta_renderer_view_get_crtc (MetaRendererView *view) | |
return priv->crtc; | |
} | |
+MetaOutput * | |
+meta_renderer_view_get_output (MetaRendererView *view) | |
+{ | |
+ MetaRendererViewPrivate *priv = | |
+ meta_renderer_view_get_instance_private (view); | |
+ | |
+ return priv->output; | |
+} | |
+ | |
static void | |
meta_renderer_view_get_offscreen_transformation_matrix (ClutterStageView *view, | |
graphene_matrix_t *matrix) | |
@@ -151,6 +163,9 @@ meta_renderer_view_get_property (GObject *object, | |
case PROP_CRTC: | |
g_value_set_object (value, priv->crtc); | |
break; | |
+ case PROP_OUTPUT: | |
+ g_value_set_object (value, priv->output); | |
+ break; | |
default: | |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | |
break; | |
@@ -175,6 +190,9 @@ meta_renderer_view_set_property (GObject *object, | |
case PROP_CRTC: | |
priv->crtc = g_value_get_object (value); | |
break; | |
+ case PROP_OUTPUT: | |
+ priv->output = g_value_get_object (value); | |
+ break; | |
default: | |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | |
break; | |
@@ -222,5 +240,14 @@ meta_renderer_view_class_init (MetaRendererViewClass *klass) | |
G_PARAM_CONSTRUCT_ONLY | | |
G_PARAM_STATIC_STRINGS); | |
+ obj_props[PROP_OUTPUT] = | |
+ g_param_spec_object ("output", | |
+ "MetaOutput", | |
+ "MetaOutput", | |
+ META_TYPE_OUTPUT, | |
+ G_PARAM_READWRITE | | |
+ G_PARAM_CONSTRUCT_ONLY | | |
+ G_PARAM_STATIC_STRINGS); | |
+ | |
g_object_class_install_properties (object_class, PROP_LAST, obj_props); | |
} | |
diff --git a/src/backends/meta-renderer-view.h b/src/backends/meta-renderer-view.h | |
index 7c4858af6..2cab08207 100644 | |
--- a/src/backends/meta-renderer-view.h | |
+++ b/src/backends/meta-renderer-view.h | |
@@ -38,4 +38,6 @@ MetaMonitorTransform meta_renderer_view_get_transform (MetaRendererView *view); | |
META_EXPORT_TEST | |
MetaCrtc *meta_renderer_view_get_crtc (MetaRendererView *view); | |
+MetaOutput *meta_renderer_view_get_output (MetaRendererView *view); | |
+ | |
#endif /* META_RENDERER_VIEW_H */ | |
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c | |
index e90c082e3..cbe2e84b7 100644 | |
--- a/src/backends/native/meta-renderer-native.c | |
+++ b/src/backends/native/meta-renderer-native.c | |
@@ -1421,6 +1421,7 @@ meta_renderer_native_create_view (MetaRenderer *renderer, | |
"stage", meta_backend_get_stage (backend), | |
"layout", &view_layout, | |
"crtc", crtc, | |
+ "output", output, | |
"scale", scale, | |
"framebuffer", framebuffer, | |
"offscreen", offscreen, | |
diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.c b/src/backends/x11/nested/meta-renderer-x11-nested.c | |
index 8f3745d3d..a1fc93429 100644 | |
--- a/src/backends/x11/nested/meta-renderer-x11-nested.c | |
+++ b/src/backends/x11/nested/meta-renderer-x11-nested.c | |
@@ -223,6 +223,7 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer, | |
"stage", meta_backend_get_stage (backend), | |
"layout", &view_layout, | |
"crtc", crtc, | |
+ "output", output, | |
"refresh-rate", mode_info->refresh_rate, | |
"framebuffer", COGL_FRAMEBUFFER (fake_onscreen), | |
"offscreen", COGL_FRAMEBUFFER (offscreen), | |
-- | |
2.40.0 | |
From ee547f5586ad3baa329006b9a4448cc558f1e3e3 Mon Sep 17 00:00:00 2001 | |
From: GloriousEggroll <[email protected]> | |
Date: Wed, 26 Apr 2023 01:20:39 -0600 | |
Subject: [PATCH 16/16] 19 | |
--- | |
.../native/meta-renderer-view-native.c | 27 ++++++++++++++++++- | |
1 file changed, 26 insertions(+), 1 deletion(-) | |
diff --git a/src/backends/native/meta-renderer-view-native.c b/src/backends/native/meta-renderer-view-native.c | |
index 0d7d279e5..fff9541c7 100644 | |
--- a/src/backends/native/meta-renderer-view-native.c | |
+++ b/src/backends/native/meta-renderer-view-native.c | |
@@ -26,6 +26,11 @@ | |
#include "backends/native/meta-frame-native.h" | |
+#include "backends/meta-output.h" | |
+#include "backends/native/meta-crtc-kms.h" | |
+#include "backends/native/meta-kms.h" | |
+#include "backends/native/meta-kms-device.h" | |
+#include "backends/native/meta-output-kms.h" | |
#include "clutter/clutter.h" | |
typedef enum _MetaFrameSyncMode | |
@@ -119,20 +124,24 @@ meta_renderer_view_native_set_frame_sync_actor (MetaRendererViewNative *view_nat | |
static void | |
meta_renderer_view_native_set_frame_sync (MetaRendererViewNative *view_native, | |
+ MetaOutput *output, | |
MetaFrameSyncMode sync_mode) | |
{ | |
ClutterFrameClock *frame_clock = | |
clutter_stage_view_get_frame_clock (CLUTTER_STAGE_VIEW (view_native)); | |
+ MetaOutputKms *output_kms = META_OUTPUT_KMS (output); | |
switch (sync_mode) | |
{ | |
case META_FRAME_SYNC_MODE_ENABLED: | |
clutter_frame_clock_set_mode (frame_clock, | |
CLUTTER_FRAME_CLOCK_MODE_VARIABLE); | |
+ meta_output_kms_set_vrr_mode (output_kms, TRUE); | |
break; | |
case META_FRAME_SYNC_MODE_DISABLED: | |
clutter_frame_clock_set_mode (frame_clock, | |
CLUTTER_FRAME_CLOCK_MODE_FIXED); | |
+ meta_output_kms_set_vrr_mode (output_kms, FALSE); | |
break; | |
case META_FRAME_SYNC_MODE_INIT: | |
g_assert_not_reached (); | |
@@ -144,12 +153,21 @@ meta_renderer_view_native_set_frame_sync (MetaRendererViewNative *view_native, | |
static MetaFrameSyncMode | |
meta_renderer_view_native_get_applicable_sync_mode (MetaRendererViewNative *view_native) | |
{ | |
- return META_FRAME_SYNC_MODE_DISABLED; | |
+ MetaRendererView *view = META_RENDERER_VIEW (view_native); | |
+ MetaOutput *output = meta_renderer_view_get_output (view); | |
+ | |
+ if (view_native->frame_sync_actor != NULL && | |
+ meta_output_is_vrr_allowed (output)) | |
+ return META_FRAME_SYNC_MODE_ENABLED; | |
+ else | |
+ return META_FRAME_SYNC_MODE_DISABLED; | |
} | |
void | |
meta_renderer_view_native_maybe_set_frame_sync (MetaRendererViewNative *view_native) | |
{ | |
+ MetaRendererView *view; | |
+ MetaOutput *output; | |
MetaFrameSyncMode applicable_sync_mode; | |
if (G_LIKELY (!view_native->frame_sync_mode_update_queued)) | |
@@ -157,12 +175,19 @@ meta_renderer_view_native_maybe_set_frame_sync (MetaRendererViewNative *view_nat | |
view_native->frame_sync_mode_update_queued = FALSE; | |
+ view = META_RENDERER_VIEW (view_native); | |
+ output = meta_renderer_view_get_output (view); | |
+ | |
+ if (!meta_output_is_vrr_capable (output)) | |
+ return; | |
+ | |
applicable_sync_mode = | |
meta_renderer_view_native_get_applicable_sync_mode (view_native); | |
if (applicable_sync_mode != view_native->frame_sync_mode) | |
{ | |
meta_renderer_view_native_set_frame_sync (view_native, | |
+ output, | |
applicable_sync_mode); | |
} | |
} | |
-- | |
2.40.0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment