kms: Post pending updates per device

Instead of a "post all pending updates", pass an update specific to a
single device. This gets rid of the awkward "combine feedback" function,
and makes it possible to queue updates to a multiple devices without
always posting them together.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>
This commit is contained in:
Jonas Ådahl
2020-10-02 10:38:57 +02:00
committed by Marge Bot
parent 5ba2d79076
commit 2df6327367
5 changed files with 124 additions and 119 deletions

View File

@ -544,7 +544,6 @@ update_hw_cursor (MetaCursorRendererNative *native,
GList *l;
graphene_rect_t rect;
gboolean painted = FALSE;
g_autoptr (MetaKmsFeedback) feedback = NULL;
if (cursor_sprite)
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
@ -589,23 +588,36 @@ update_hw_cursor (MetaCursorRendererNative *native,
painted = painted || data.out_painted;
}
feedback = meta_kms_post_pending_updates_sync (kms);
if (meta_kms_feedback_get_result (feedback) != META_KMS_FEEDBACK_PASSED)
for (l = meta_kms_get_devices (kms); l; l = l->next)
{
for (l = meta_kms_feedback_get_failed_planes (feedback); l; l = l->next)
MetaKmsDevice *kms_device = l->data;
MetaKmsUpdate *kms_update;
g_autoptr (MetaKmsFeedback) feedback = NULL;
kms_update = meta_kms_get_pending_update (kms, kms_device);
if (!kms_update)
continue;
feedback = meta_kms_post_pending_update_sync (kms, kms_device);
if (meta_kms_feedback_get_result (feedback) != META_KMS_FEEDBACK_PASSED)
{
MetaKmsPlaneFeedback *plane_feedback = l->data;
GList *k;
if (!g_error_matches (plane_feedback->error,
G_IO_ERROR,
G_IO_ERROR_PERMISSION_DENIED))
for (k = meta_kms_feedback_get_failed_planes (feedback); k; k = k->next)
{
disable_hw_cursor_for_crtc (plane_feedback->crtc,
plane_feedback->error);
}
}
MetaKmsPlaneFeedback *plane_feedback = k->data;
priv->has_hw_cursor = FALSE;
if (!g_error_matches (plane_feedback->error,
G_IO_ERROR,
G_IO_ERROR_PERMISSION_DENIED))
{
disable_hw_cursor_for_crtc (plane_feedback->crtc,
plane_feedback->error);
}
}
priv->has_hw_cursor = FALSE;
}
}
priv->hw_state_invalidated = FALSE;