Skip to content

Instantly share code, notes, and snippets.

@GloriousEggroll
Last active April 26, 2023 08:13
Show Gist options
  • Save GloriousEggroll/e73ca01ad337816ac89d741e68efa888 to your computer and use it in GitHub Desktop.
Save GloriousEggroll/e73ca01ad337816ac89d741e68efa888 to your computer and use it in GitHub Desktop.
gnome-mutter-44-vrr
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>
From d56389bda253c4ff2f6fbe0a600498687b39d528 Mon Sep 17 00:00:00 2001
From: GloriousEggroll <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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 <gloriouseggroll@gmail.com>
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