mirror of
https://github.com/brl/mutter.git
synced 2025-02-11 10:54:09 +00:00
renderer/native: Don't queue mode set on hotplug power-save on
We need to trigger a mode set when power-save changes to 'on' if it's purely about power saving, but when they arrive as part of a hotplug event, we'll handle all that later, in the monitors-changed handling, that contains the new configuration. This avoids a crash that happens due to the mode set being queued on now disabled connectors. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2985 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3233>
This commit is contained in:
parent
efbb8df611
commit
b20d7a5cc4
@ -2022,7 +2022,8 @@ on_power_save_mode_changed (MetaMonitorManager *monitor_manager,
|
|||||||
MetaPowerSave power_save_mode;
|
MetaPowerSave power_save_mode;
|
||||||
|
|
||||||
power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager);
|
power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager);
|
||||||
if (power_save_mode == META_POWER_SAVE_ON)
|
if (power_save_mode == META_POWER_SAVE_ON &&
|
||||||
|
reason == META_POWER_SAVE_CHANGE_REASON_MODE_CHANGE)
|
||||||
meta_renderer_native_queue_modes_reset (renderer_native);
|
meta_renderer_native_queue_modes_reset (renderer_native);
|
||||||
else
|
else
|
||||||
meta_kms_discard_pending_page_flips (kms);
|
meta_kms_discard_pending_page_flips (kms);
|
||||||
|
@ -56,6 +56,12 @@ on_presented (ClutterStage *stage,
|
|||||||
*state = PRESENTED;
|
*state = PRESENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_true_cb (gboolean *done)
|
||||||
|
{
|
||||||
|
*done = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_test_reload (void)
|
meta_test_reload (void)
|
||||||
{
|
{
|
||||||
@ -324,6 +330,101 @@ meta_test_switch_config (void)
|
|||||||
g_signal_handler_disconnect (monitor_manager, monitors_changed_handler_id);
|
g_signal_handler_disconnect (monitor_manager, monitors_changed_handler_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_power_save_mode_via_dbus (MetaPowerSave power_save)
|
||||||
|
{
|
||||||
|
g_autoptr (GDBusProxy) proxy = NULL;
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
|
GVariant *parameters;
|
||||||
|
|
||||||
|
proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||||
|
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||||
|
NULL,
|
||||||
|
"org.gnome.Mutter.DisplayConfig",
|
||||||
|
"/org/gnome/Mutter/DisplayConfig",
|
||||||
|
"org.freedesktop.DBus.Properties",
|
||||||
|
NULL,
|
||||||
|
&error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
|
||||||
|
parameters = g_variant_new ("(ssv)",
|
||||||
|
"org.gnome.Mutter.DisplayConfig",
|
||||||
|
"PowerSaveMode",
|
||||||
|
g_variant_new_int32 (power_save));
|
||||||
|
g_dbus_proxy_call (proxy,
|
||||||
|
"Set",
|
||||||
|
parameters,
|
||||||
|
G_DBUS_CALL_FLAGS_NO_AUTO_START,
|
||||||
|
G_MAXINT,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
emulate_hotplug (void)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = meta_context_get_backend (test_context);
|
||||||
|
MetaUdev *udev = meta_backend_native_get_udev (META_BACKEND_NATIVE (backend));
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
|
g_autolist (GObject) udev_devices = NULL;
|
||||||
|
GUdevDevice *udev_device;
|
||||||
|
|
||||||
|
udev_devices = meta_udev_list_drm_devices (udev, &error);
|
||||||
|
g_assert_cmpuint (g_list_length (udev_devices), ==, 1);
|
||||||
|
udev_device = g_list_first (udev_devices)->data;
|
||||||
|
g_signal_emit_by_name (udev, "hotplug", udev_device);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_test_power_save_implicit_on (void)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = meta_context_get_backend (test_context);
|
||||||
|
MetaMonitorManager *monitor_manager =
|
||||||
|
meta_backend_get_monitor_manager (backend);
|
||||||
|
GList *logical_monitors;
|
||||||
|
gulong power_save_handler_id;
|
||||||
|
gulong monitors_changed_handler_id;
|
||||||
|
gboolean power_save_mode_changed;
|
||||||
|
gboolean monitors_changed;
|
||||||
|
|
||||||
|
logical_monitors =
|
||||||
|
meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||||
|
g_assert_cmpuint (g_list_length (logical_monitors), ==, 1);
|
||||||
|
|
||||||
|
meta_wait_for_paint (test_context);
|
||||||
|
|
||||||
|
power_save_handler_id =
|
||||||
|
g_signal_connect_swapped (monitor_manager, "power-save-mode-changed",
|
||||||
|
G_CALLBACK (set_true_cb), &power_save_mode_changed);
|
||||||
|
|
||||||
|
set_power_save_mode_via_dbus (META_POWER_SAVE_OFF);
|
||||||
|
|
||||||
|
power_save_mode_changed = FALSE;
|
||||||
|
while (!power_save_mode_changed)
|
||||||
|
g_main_context_iteration (NULL, TRUE);
|
||||||
|
|
||||||
|
power_save_mode_changed = FALSE;
|
||||||
|
monitors_changed = FALSE;
|
||||||
|
|
||||||
|
monitors_changed_handler_id =
|
||||||
|
g_signal_connect_swapped (monitor_manager, "monitors-changed",
|
||||||
|
G_CALLBACK (set_true_cb), &monitors_changed);
|
||||||
|
|
||||||
|
drm_mock_set_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR,
|
||||||
|
disconnect_connector_filter, NULL);
|
||||||
|
emulate_hotplug ();
|
||||||
|
|
||||||
|
while (!power_save_mode_changed || !monitors_changed)
|
||||||
|
g_main_context_iteration (NULL, TRUE);
|
||||||
|
|
||||||
|
g_signal_handler_disconnect (monitor_manager, power_save_handler_id);
|
||||||
|
g_signal_handler_disconnect (monitor_manager, monitors_changed_handler_id);
|
||||||
|
|
||||||
|
drm_mock_unset_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR);
|
||||||
|
emulate_hotplug ();
|
||||||
|
logical_monitors =
|
||||||
|
meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||||
|
g_assert_cmpuint (g_list_length (logical_monitors), ==, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_tests (void)
|
init_tests (void)
|
||||||
{
|
{
|
||||||
@ -333,6 +434,8 @@ init_tests (void)
|
|||||||
meta_test_disconnect_connect);
|
meta_test_disconnect_connect);
|
||||||
g_test_add_func ("/hotplug/switch-config",
|
g_test_add_func ("/hotplug/switch-config",
|
||||||
meta_test_switch_config);
|
meta_test_switch_config);
|
||||||
|
g_test_add_func ("/hotplug/power-save-implicit-off",
|
||||||
|
meta_test_power_save_implicit_on);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user