kms: Don't enter power saving via updates

The way device backends implement power saving differ, and power saving
needs to contain nothing incompatible in the same update. Make it
impossible to e.g. mode set, page flip, etc while entering power save by
not using MetaKmsUpdate's at all for this.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2159>
This commit is contained in:
Jonas Ådahl 2021-06-28 10:11:31 +02:00 committed by Marge Bot
parent 3472ff50ce
commit 2d7a8c3ce9
15 changed files with 165 additions and 133 deletions

View File

@ -43,6 +43,8 @@ const char * meta_kms_connector_get_prop_name (MetaKmsConnector *connector,
MetaKmsUpdateChanges meta_kms_connector_update_state (MetaKmsConnector *connector, MetaKmsUpdateChanges meta_kms_connector_update_state (MetaKmsConnector *connector,
drmModeRes *drm_resources); drmModeRes *drm_resources);
void meta_kms_connector_disable (MetaKmsConnector *connector);
void meta_kms_connector_predict_state (MetaKmsConnector *connector, void meta_kms_connector_predict_state (MetaKmsConnector *connector,
MetaKmsUpdate *update); MetaKmsUpdate *update);

View File

@ -753,6 +753,18 @@ meta_kms_connector_update_state (MetaKmsConnector *connector,
return changes; return changes;
} }
void
meta_kms_connector_disable (MetaKmsConnector *connector)
{
MetaKmsConnectorState *current_state;
current_state = connector->current_state;
if (!current_state)
return;
current_state->current_crtc_id = 0;
}
void void
meta_kms_connector_predict_state (MetaKmsConnector *connector, meta_kms_connector_predict_state (MetaKmsConnector *connector,
MetaKmsUpdate *update) MetaKmsUpdate *update)
@ -766,9 +778,6 @@ meta_kms_connector_predict_state (MetaKmsConnector *connector,
if (!current_state) if (!current_state)
return; return;
if (meta_kms_update_is_power_save (update))
current_state->current_crtc_id = 0;
mode_sets = meta_kms_update_get_mode_sets (update); mode_sets = meta_kms_update_get_mode_sets (update);
for (l = mode_sets; l; l = l->next) for (l = mode_sets; l; l = l->next)
{ {

View File

@ -40,6 +40,8 @@ MetaKmsCrtc * meta_kms_crtc_new (MetaKmsImplDevice *impl_device,
MetaKmsUpdateChanges meta_kms_crtc_update_state (MetaKmsCrtc *crtc); MetaKmsUpdateChanges meta_kms_crtc_update_state (MetaKmsCrtc *crtc);
void meta_kms_crtc_disable (MetaKmsCrtc *crtc);
void meta_kms_crtc_predict_state (MetaKmsCrtc *crtc, void meta_kms_crtc_predict_state (MetaKmsCrtc *crtc,
MetaKmsUpdate *update); MetaKmsUpdate *update);

View File

@ -277,6 +277,15 @@ out:
return changes; return changes;
} }
void
meta_kms_crtc_disable (MetaKmsCrtc *crtc)
{
crtc->current_state.is_active = FALSE;
crtc->current_state.rect = (MetaRectangle) { 0 };
crtc->current_state.is_drm_mode_valid = FALSE;
crtc->current_state.drm_mode = (drmModeModeInfo) { 0 };
}
void void
meta_kms_crtc_predict_state (MetaKmsCrtc *crtc, meta_kms_crtc_predict_state (MetaKmsCrtc *crtc,
MetaKmsUpdate *update) MetaKmsUpdate *update)
@ -285,14 +294,6 @@ meta_kms_crtc_predict_state (MetaKmsCrtc *crtc,
GList *crtc_gammas; GList *crtc_gammas;
GList *l; GList *l;
if (meta_kms_update_is_power_save (update))
{
crtc->current_state.is_active = FALSE;
crtc->current_state.rect = (MetaRectangle) { 0 };
crtc->current_state.is_drm_mode_valid = FALSE;
crtc->current_state.drm_mode = (drmModeModeInfo) { 0 };
}
mode_sets = meta_kms_update_get_mode_sets (update); mode_sets = meta_kms_update_get_mode_sets (update);
for (l = mode_sets; l; l = l->next) for (l = mode_sets; l; l = l->next)
{ {

View File

@ -231,6 +231,28 @@ meta_kms_device_get_fallback_modes (MetaKmsDevice *device)
return device->fallback_modes; return device->fallback_modes;
} }
static gpointer
disable_device_in_impl (MetaKmsImpl *impl,
gpointer user_data,
GError **error)
{
MetaKmsImplDevice *impl_device = user_data;
meta_kms_impl_device_disable (impl_device);
return GINT_TO_POINTER (TRUE);
}
void
meta_kms_device_disable (MetaKmsDevice *device)
{
meta_assert_not_in_kms_impl (device->kms);
meta_kms_run_impl_task_sync (device->kms, disable_device_in_impl,
device->impl_device,
NULL);
}
MetaKmsUpdateChanges MetaKmsUpdateChanges
meta_kms_device_update_states_in_impl (MetaKmsDevice *device, meta_kms_device_update_states_in_impl (MetaKmsDevice *device,
uint32_t crtc_id, uint32_t crtc_id,

View File

@ -77,6 +77,9 @@ MetaKmsFeedback * meta_kms_device_process_update_sync (MetaKmsDevice *device
MetaKmsUpdate *update, MetaKmsUpdate *update,
MetaKmsUpdateFlag flags); MetaKmsUpdateFlag flags);
META_EXPORT_TEST
void meta_kms_device_disable (MetaKmsDevice *device);
MetaKmsDevice * meta_kms_device_new (MetaKms *kms, MetaKmsDevice * meta_kms_device_new (MetaKms *kms,
const char *path, const char *path,
MetaKmsDeviceFlag flags, MetaKmsDeviceFlag flags,

View File

@ -904,21 +904,6 @@ disable_planes_and_connectors (MetaKmsImplDevice *impl_device,
return TRUE; return TRUE;
} }
static gboolean
process_power_save (MetaKmsImplDevice *impl_device,
drmModeAtomicReq *req,
GError **error)
{
if (!disable_connectors (impl_device, req, error))
return FALSE;
if (!disable_planes (impl_device, req, error))
return FALSE;
if (!disable_crtcs (impl_device, req, error))
return FALSE;
return TRUE;
}
static MetaKmsFeedback * static MetaKmsFeedback *
meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device, meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update, MetaKmsUpdate *update,
@ -953,19 +938,6 @@ meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device,
goto err; goto err;
} }
if (meta_kms_update_is_power_save (update))
{
meta_topic (META_DEBUG_KMS,
"[atomic] Entering power save mode for %s",
meta_kms_impl_device_get_path (impl_device));
if (!process_power_save (impl_device, req, &error))
goto err;
commit_flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
goto commit;
}
if (!process_entries (impl_device, if (!process_entries (impl_device,
update, update,
req, req,
@ -1017,7 +989,6 @@ meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device,
if (flags & META_KMS_UPDATE_FLAG_TEST_ONLY) if (flags & META_KMS_UPDATE_FLAG_TEST_ONLY)
commit_flags |= DRM_MODE_ATOMIC_TEST_ONLY; commit_flags |= DRM_MODE_ATOMIC_TEST_ONLY;
commit:
meta_topic (META_DEBUG_KMS, meta_topic (META_DEBUG_KMS,
"[atomic] Committing update %" G_GUINT64_FORMAT ", flags: %s", "[atomic] Committing update %" G_GUINT64_FORMAT ", flags: %s",
meta_kms_update_get_sequence_number (update), meta_kms_update_get_sequence_number (update),
@ -1066,6 +1037,53 @@ err:
return meta_kms_feedback_new_failed (failed_planes, error); return meta_kms_feedback_new_failed (failed_planes, error);
} }
static void
meta_kms_impl_device_atomic_disable (MetaKmsImplDevice *impl_device)
{
g_autoptr (GError) error = NULL;
drmModeAtomicReq *req;
int fd;
int ret;
meta_topic (META_DEBUG_KMS, "[atomic] Disabling '%s'",
meta_kms_impl_device_get_path (impl_device));
req = drmModeAtomicAlloc ();
if (!req)
{
g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Failed to create atomic transaction request: %s",
g_strerror (errno));
goto err;
}
if (!disable_connectors (impl_device, req, &error))
goto err;
if (!disable_planes (impl_device, req, &error))
goto err;
if (!disable_crtcs (impl_device, req, &error))
goto err;
meta_topic (META_DEBUG_KMS, "[atomic] Committing disable-device transaction");
fd = meta_kms_impl_device_get_fd (impl_device);
ret = drmModeAtomicCommit (fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, impl_device);
drmModeAtomicFree (req);
if (ret < 0)
{
g_set_error (&error, G_IO_ERROR, g_io_error_from_errno (-ret),
"drmModeAtomicCommit: %s", g_strerror (-ret));
goto err;
}
return;
err:
g_warning ("[atomic] Failed to disable device '%s': %s",
meta_kms_impl_device_get_path (impl_device),
error->message);
}
static void static void
meta_kms_impl_device_atomic_handle_page_flip_callback (MetaKmsImplDevice *impl_device, meta_kms_impl_device_atomic_handle_page_flip_callback (MetaKmsImplDevice *impl_device,
MetaKmsPageFlipData *page_flip_data) MetaKmsPageFlipData *page_flip_data)
@ -1246,6 +1264,8 @@ meta_kms_impl_device_atomic_class_init (MetaKmsImplDeviceAtomicClass *klass)
meta_kms_impl_device_atomic_setup_drm_event_context; meta_kms_impl_device_atomic_setup_drm_event_context;
impl_device_class->process_update = impl_device_class->process_update =
meta_kms_impl_device_atomic_process_update; meta_kms_impl_device_atomic_process_update;
impl_device_class->disable =
meta_kms_impl_device_atomic_disable;
impl_device_class->handle_page_flip_callback = impl_device_class->handle_page_flip_callback =
meta_kms_impl_device_atomic_handle_page_flip_callback; meta_kms_impl_device_atomic_handle_page_flip_callback;
impl_device_class->discard_pending_page_flips = impl_device_class->discard_pending_page_flips =

View File

@ -180,32 +180,6 @@ set_connector_property (MetaKmsImplDevice *impl_device,
return TRUE; return TRUE;
} }
static gboolean
process_power_save (MetaKmsImplDevice *impl_device,
GError **error)
{
GList *l;
for (l = meta_kms_impl_device_peek_connectors (impl_device); l; l = l->next)
{
MetaKmsConnector *connector = l->data;
meta_topic (META_DEBUG_KMS,
"[simple] Setting DPMS of connector %u (%s) to OFF",
meta_kms_connector_get_id (connector),
meta_kms_impl_device_get_path (impl_device));
if (!set_connector_property (impl_device,
connector,
META_KMS_CONNECTOR_PROP_DPMS,
DRM_MODE_DPMS_OFF,
error))
return FALSE;
}
return TRUE;
}
static gboolean static gboolean
process_connector_update (MetaKmsImplDevice *impl_device, process_connector_update (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update, MetaKmsUpdate *update,
@ -1508,13 +1482,6 @@ meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device,
if (flags & META_KMS_UPDATE_FLAG_TEST_ONLY) if (flags & META_KMS_UPDATE_FLAG_TEST_ONLY)
return perform_update_test (impl_device, update); return perform_update_test (impl_device, update);
if (meta_kms_update_is_power_save (update))
{
if (!process_power_save (impl_device, &error))
goto err;
goto out;
}
if (!process_entries (impl_device, if (!process_entries (impl_device,
update, update,
meta_kms_update_get_mode_sets (update), meta_kms_update_get_mode_sets (update),
@ -1543,13 +1510,54 @@ meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device,
&error)) &error))
goto err; goto err;
out:
return meta_kms_feedback_new_passed (failed_planes); return meta_kms_feedback_new_passed (failed_planes);
err: err:
return meta_kms_feedback_new_failed (failed_planes, error); return meta_kms_feedback_new_failed (failed_planes, error);
} }
static gboolean
set_dpms_to_off (MetaKmsImplDevice *impl_device,
GError **error)
{
GList *l;
for (l = meta_kms_impl_device_peek_connectors (impl_device); l; l = l->next)
{
MetaKmsConnector *connector = l->data;
meta_topic (META_DEBUG_KMS,
"[simple] Setting DPMS of connector %u (%s) to OFF",
meta_kms_connector_get_id (connector),
meta_kms_impl_device_get_path (impl_device));
if (!set_connector_property (impl_device,
connector,
META_KMS_CONNECTOR_PROP_DPMS,
DRM_MODE_DPMS_OFF,
error))
return FALSE;
}
return TRUE;
}
static void
meta_kms_impl_device_simple_disable (MetaKmsImplDevice *impl_device)
{
g_autoptr (GError) error = NULL;
meta_topic (META_DEBUG_KMS, "[simple] Disabling '%s'",
meta_kms_impl_device_get_path (impl_device));
if (!set_dpms_to_off (impl_device, &error))
{
g_warning ("Failed to set DPMS to off on device '%s': %s",
meta_kms_impl_device_get_path (impl_device),
error->message);
}
}
static void static void
flush_postponed_page_flip_datas (MetaKmsImplDeviceSimple *impl_device_simple) flush_postponed_page_flip_datas (MetaKmsImplDeviceSimple *impl_device_simple)
{ {
@ -1778,6 +1786,8 @@ meta_kms_impl_device_simple_class_init (MetaKmsImplDeviceSimpleClass *klass)
meta_kms_impl_device_simple_setup_drm_event_context; meta_kms_impl_device_simple_setup_drm_event_context;
impl_device_class->process_update = impl_device_class->process_update =
meta_kms_impl_device_simple_process_update; meta_kms_impl_device_simple_process_update;
impl_device_class->disable =
meta_kms_impl_device_simple_disable;
impl_device_class->handle_page_flip_callback = impl_device_class->handle_page_flip_callback =
meta_kms_impl_device_simple_handle_page_flip_callback; meta_kms_impl_device_simple_handle_page_flip_callback;
impl_device_class->discard_pending_page_flips = impl_device_class->discard_pending_page_flips =

View File

@ -823,6 +823,23 @@ meta_kms_impl_device_process_update (MetaKmsImplDevice *impl_device,
return feedback; return feedback;
} }
void
meta_kms_impl_device_disable (MetaKmsImplDevice *impl_device)
{
MetaKmsImplDevicePrivate *priv =
meta_kms_impl_device_get_instance_private (impl_device);
MetaKmsImplDeviceClass *klass = META_KMS_IMPL_DEVICE_GET_CLASS (impl_device);
if (!priv->device_file)
return;
meta_kms_impl_device_hold_fd (impl_device);
klass->disable (impl_device);
g_list_foreach (priv->crtcs, (GFunc) meta_kms_crtc_disable, NULL);
g_list_foreach (priv->connectors, (GFunc) meta_kms_connector_disable, NULL);
meta_kms_impl_device_unhold_fd (impl_device);
}
void void
meta_kms_impl_device_handle_page_flip_callback (MetaKmsImplDevice *impl_device, meta_kms_impl_device_handle_page_flip_callback (MetaKmsImplDevice *impl_device,
MetaKmsPageFlipData *page_flip_data) MetaKmsPageFlipData *page_flip_data)

View File

@ -75,6 +75,7 @@ struct _MetaKmsImplDeviceClass
MetaKmsFeedback * (* process_update) (MetaKmsImplDevice *impl_device, MetaKmsFeedback * (* process_update) (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update, MetaKmsUpdate *update,
MetaKmsUpdateFlag flags); MetaKmsUpdateFlag flags);
void (* disable) (MetaKmsImplDevice *impl_device);
void (* handle_page_flip_callback) (MetaKmsImplDevice *impl_device, void (* handle_page_flip_callback) (MetaKmsImplDevice *impl_device,
MetaKmsPageFlipData *page_flip_data); MetaKmsPageFlipData *page_flip_data);
void (* discard_pending_page_flips) (MetaKmsImplDevice *impl_device); void (* discard_pending_page_flips) (MetaKmsImplDevice *impl_device);
@ -124,6 +125,8 @@ const char * meta_kms_impl_device_get_path (MetaKmsImplDevice *impl_device);
gboolean meta_kms_impl_device_dispatch (MetaKmsImplDevice *impl_device, gboolean meta_kms_impl_device_dispatch (MetaKmsImplDevice *impl_device,
GError **error); GError **error);
void meta_kms_impl_device_disable (MetaKmsImplDevice *impl_device);
drmModePropertyPtr meta_kms_impl_device_find_property (MetaKmsImplDevice *impl_device, drmModePropertyPtr meta_kms_impl_device_find_property (MetaKmsImplDevice *impl_device,
drmModeObjectProperties *props, drmModeObjectProperties *props,
const char *prop_name, const char *prop_name,

View File

@ -160,9 +160,6 @@ GList * meta_kms_update_get_connector_updates (MetaKmsUpdate *update);
META_EXPORT_TEST META_EXPORT_TEST
GList * meta_kms_update_get_crtc_gammas (MetaKmsUpdate *update); GList * meta_kms_update_get_crtc_gammas (MetaKmsUpdate *update);
META_EXPORT_TEST
gboolean meta_kms_update_is_power_save (MetaKmsUpdate *update);
MetaKmsCustomPageFlip * meta_kms_update_take_custom_page_flip_func (MetaKmsUpdate *update); MetaKmsCustomPageFlip * meta_kms_update_take_custom_page_flip_func (MetaKmsUpdate *update);
void meta_kms_update_drop_plane_assignment (MetaKmsUpdate *update, void meta_kms_update_drop_plane_assignment (MetaKmsUpdate *update,

View File

@ -35,8 +35,6 @@ struct _MetaKmsUpdate
gboolean is_locked; gboolean is_locked;
uint64_t sequence_number; uint64_t sequence_number;
gboolean power_save;
GList *mode_sets; GList *mode_sets;
GList *plane_assignments; GList *plane_assignments;
GList *connector_updates; GList *connector_updates;
@ -214,7 +212,6 @@ meta_kms_update_assign_plane (MetaKmsUpdate *update,
g_assert (!meta_kms_update_is_locked (update)); g_assert (!meta_kms_update_is_locked (update));
g_assert (meta_kms_crtc_get_device (crtc) == update->device); g_assert (meta_kms_crtc_get_device (crtc) == update->device);
g_assert (!update->power_save);
g_assert (meta_kms_plane_get_device (plane) == update->device); g_assert (meta_kms_plane_get_device (plane) == update->device);
g_assert (meta_kms_plane_get_plane_type (plane) != g_assert (meta_kms_plane_get_plane_type (plane) !=
META_KMS_PLANE_TYPE_PRIMARY || META_KMS_PLANE_TYPE_PRIMARY ||
@ -253,7 +250,6 @@ meta_kms_update_unassign_plane (MetaKmsUpdate *update,
g_assert (!meta_kms_update_is_locked (update)); g_assert (!meta_kms_update_is_locked (update));
g_assert (meta_kms_crtc_get_device (crtc) == update->device); g_assert (meta_kms_crtc_get_device (crtc) == update->device);
g_assert (meta_kms_plane_get_device (plane) == update->device); g_assert (meta_kms_plane_get_device (plane) == update->device);
g_assert (!update->power_save);
plane_assignment = g_new0 (MetaKmsPlaneAssignment, 1); plane_assignment = g_new0 (MetaKmsPlaneAssignment, 1);
*plane_assignment = (MetaKmsPlaneAssignment) { *plane_assignment = (MetaKmsPlaneAssignment) {
@ -279,7 +275,6 @@ meta_kms_update_mode_set (MetaKmsUpdate *update,
g_assert (!meta_kms_update_is_locked (update)); g_assert (!meta_kms_update_is_locked (update));
g_assert (meta_kms_crtc_get_device (crtc) == update->device); g_assert (meta_kms_crtc_get_device (crtc) == update->device);
g_assert (!update->power_save);
mode_set = g_new0 (MetaKmsModeSet, 1); mode_set = g_new0 (MetaKmsModeSet, 1);
*mode_set = (MetaKmsModeSet) { *mode_set = (MetaKmsModeSet) {
@ -325,7 +320,6 @@ meta_kms_update_set_underscanning (MetaKmsUpdate *update,
g_assert (!meta_kms_update_is_locked (update)); g_assert (!meta_kms_update_is_locked (update));
g_assert (meta_kms_connector_get_device (connector) == update->device); g_assert (meta_kms_connector_get_device (connector) == update->device);
g_assert (!update->power_save);
connector_update = ensure_connector_update (update, connector); connector_update = ensure_connector_update (update, connector);
connector_update->underscanning.has_update = TRUE; connector_update->underscanning.has_update = TRUE;
@ -342,7 +336,6 @@ meta_kms_update_unset_underscanning (MetaKmsUpdate *update,
g_assert (!meta_kms_update_is_locked (update)); g_assert (!meta_kms_update_is_locked (update));
g_assert (meta_kms_connector_get_device (connector) == update->device); g_assert (meta_kms_connector_get_device (connector) == update->device);
g_assert (!update->power_save);
connector_update = ensure_connector_update (update, connector); connector_update = ensure_connector_update (update, connector);
connector_update->underscanning.has_update = TRUE; connector_update->underscanning.has_update = TRUE;
@ -357,25 +350,12 @@ meta_kms_update_set_privacy_screen (MetaKmsUpdate *update,
MetaKmsConnectorUpdate *connector_update; MetaKmsConnectorUpdate *connector_update;
g_assert (meta_kms_connector_get_device (connector) == update->device); g_assert (meta_kms_connector_get_device (connector) == update->device);
g_assert (!update->power_save);
connector_update = ensure_connector_update (update, connector); connector_update = ensure_connector_update (update, connector);
connector_update->privacy_screen.has_update = TRUE; connector_update->privacy_screen.has_update = TRUE;
connector_update->privacy_screen.is_enabled = enabled; connector_update->privacy_screen.is_enabled = enabled;
} }
void
meta_kms_update_set_power_save (MetaKmsUpdate *update)
{
g_assert (!meta_kms_update_is_locked (update));
g_assert (!update->mode_sets);
g_assert (!update->plane_assignments);
g_assert (!update->connector_updates);
g_assert (!update->crtc_gammas);
update->power_save = TRUE;
}
void void
meta_kms_crtc_gamma_free (MetaKmsCrtcGamma *gamma) meta_kms_crtc_gamma_free (MetaKmsCrtcGamma *gamma)
{ {
@ -418,7 +398,6 @@ meta_kms_update_set_crtc_gamma (MetaKmsUpdate *update,
g_assert (!meta_kms_update_is_locked (update)); g_assert (!meta_kms_update_is_locked (update));
g_assert (meta_kms_crtc_get_device (crtc) == update->device); g_assert (meta_kms_crtc_get_device (crtc) == update->device);
g_assert (!update->power_save);
gamma = meta_kms_crtc_gamma_new (crtc, size, red, green, blue); gamma = meta_kms_crtc_gamma_new (crtc, size, red, green, blue);
@ -481,7 +460,6 @@ meta_kms_update_set_custom_page_flip (MetaKmsUpdate *update,
MetaKmsCustomPageFlip *custom_page_flip; MetaKmsCustomPageFlip *custom_page_flip;
g_assert (!meta_kms_update_is_locked (update)); g_assert (!meta_kms_update_is_locked (update));
g_assert (!update->power_save);
custom_page_flip = g_new0 (MetaKmsCustomPageFlip, 1); custom_page_flip = g_new0 (MetaKmsCustomPageFlip, 1);
custom_page_flip->func = func; custom_page_flip->func = func;
@ -663,12 +641,6 @@ meta_kms_update_get_crtc_gammas (MetaKmsUpdate *update)
return update->crtc_gammas; return update->crtc_gammas;
} }
gboolean
meta_kms_update_is_power_save (MetaKmsUpdate *update)
{
return update->power_save;
}
void void
meta_kms_update_lock (MetaKmsUpdate *update) meta_kms_update_lock (MetaKmsUpdate *update)
{ {

View File

@ -52,8 +52,6 @@
#include "backends/native/meta-crtc-kms.h" #include "backends/native/meta-crtc-kms.h"
#include "backends/native/meta-gpu-kms.h" #include "backends/native/meta-gpu-kms.h"
#include "backends/native/meta-kms-device.h" #include "backends/native/meta-kms-device.h"
#include "backends/native/meta-kms-types.h"
#include "backends/native/meta-kms-update.h"
#include "backends/native/meta-kms.h" #include "backends/native/meta-kms.h"
#include "backends/native/meta-launcher.h" #include "backends/native/meta-launcher.h"
#include "backends/native/meta-output-kms.h" #include "backends/native/meta-output-kms.h"
@ -150,8 +148,6 @@ meta_monitor_manager_native_set_power_save_mode (MetaMonitorManager *manager,
MetaPowerSave mode) MetaPowerSave mode)
{ {
MetaBackend *backend = meta_monitor_manager_get_backend (manager); MetaBackend *backend = meta_monitor_manager_get_backend (manager);
MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
MetaKms *kms = meta_backend_native_get_kms (backend_native);
GList *l; GList *l;
for (l = meta_backend_get_gpus (backend); l; l = l->next) for (l = meta_backend_get_gpus (backend); l; l = l->next)
@ -172,24 +168,7 @@ meta_monitor_manager_native_set_power_save_mode (MetaMonitorManager *manager,
case META_POWER_SAVE_SUSPEND: case META_POWER_SAVE_SUSPEND:
case META_POWER_SAVE_OFF: case META_POWER_SAVE_OFF:
{ {
MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms); meta_kms_device_disable (meta_gpu_kms_get_kms_device (gpu_kms));
MetaKmsUpdate *kms_update;
MetaKmsUpdateFlag flags;
g_autoptr (MetaKmsFeedback) kms_feedback = NULL;
kms_update = meta_kms_ensure_pending_update (kms, kms_device);
meta_kms_update_set_power_save (kms_update);
flags = META_KMS_UPDATE_FLAG_NONE;
kms_feedback = meta_kms_post_pending_update_sync (kms,
kms_device,
flags);
if (meta_kms_feedback_get_result (kms_feedback) !=
META_KMS_FEEDBACK_PASSED)
{
g_warning ("Failed to enter power saving mode: %s",
meta_kms_feedback_get_error (kms_feedback)->message);
}
break; break;
} }
} }

View File

@ -369,11 +369,7 @@ meta_test_kms_device_power_save (void)
* Enable power saving mode. * Enable power saving mode.
*/ */
update = meta_kms_update_new (device); meta_kms_device_disable (device);
meta_kms_update_set_power_save (update);
meta_kms_device_process_update_sync (device, update,
META_KMS_UPDATE_FLAG_NONE);
meta_kms_update_free (update);
g_assert_false (meta_kms_crtc_is_active (crtc)); g_assert_false (meta_kms_crtc_is_active (crtc));
crtc_state = meta_kms_crtc_get_current_state (crtc); crtc_state = meta_kms_crtc_get_current_state (crtc);

View File

@ -44,7 +44,6 @@ meta_test_kms_update_sanity (void)
update = meta_kms_update_new (device); update = meta_kms_update_new (device);
g_assert (meta_kms_update_get_device (update) == device); g_assert (meta_kms_update_get_device (update) == device);
g_assert_false (meta_kms_update_is_locked (update)); g_assert_false (meta_kms_update_is_locked (update));
g_assert_false (meta_kms_update_is_power_save (update));
g_assert_null (meta_kms_update_get_primary_plane_assignment (update, crtc)); g_assert_null (meta_kms_update_get_primary_plane_assignment (update, crtc));
g_assert_null (meta_kms_update_get_plane_assignments (update)); g_assert_null (meta_kms_update_get_plane_assignments (update));
g_assert_null (meta_kms_update_get_mode_sets (update)); g_assert_null (meta_kms_update_get_mode_sets (update));