crtc/kms: Dynamically assign primary and cursor planes

When there are a set of primary planes, and a set of CRTCs, where each
plane can be used on multiple CRTCs, we need to make sure that when we
mode set and page flip, each CRTC gets assigned an individual plane that
isn't used with any other CRTC.

Do this during the monitor resource assignments that sets up later to be
applied configurations of the mode setting objects, but with the new
hooks into the backend, so that we don't need to teach the monitor
config manager about planes.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2398
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3428>
This commit is contained in:
Jonas Ådahl
2023-11-28 22:06:33 +01:00
committed by Marge Bot
parent 48145a91f9
commit cc7bca073b
5 changed files with 167 additions and 24 deletions

View File

@ -1122,23 +1122,27 @@ meta_renderer_native_queue_modes_reset (MetaRendererNative *renderer_native)
MetaOnscreenNative *onscreen_native =
META_ONSCREEN_NATIVE (framebuffer);
MetaCrtc *crtc;
MetaCrtcKms *crtc_kms;
MetaKmsCrtc *kms_crtc;
MetaKmsPlane *kms_plane;
MtkRectangle view_layout;
float view_scale;
MetaKmsCrtcLayout crtc_layout;
renderer_native->pending_mode_set_views =
g_list_prepend (renderer_native->pending_mode_set_views,
stage_view);
meta_onscreen_native_invalidate (onscreen_native);
crtc = meta_onscreen_native_get_crtc (onscreen_native);
kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (crtc));
crtc_kms = META_CRTC_KMS (crtc);
kms_plane = meta_crtc_kms_get_assigned_cursor_plane (crtc_kms);
if (!kms_plane)
continue;
kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
clutter_stage_view_get_layout (stage_view, &view_layout);
view_scale = clutter_stage_view_get_scale (stage_view);
crtc_layout = (MetaKmsCrtcLayout) {
.crtc = kms_crtc,
.cursor_plane = kms_plane,
.layout = GRAPHENE_RECT_INIT (view_layout.x,
view_layout.y,
view_layout.width,
@ -1146,6 +1150,11 @@ meta_renderer_native_queue_modes_reset (MetaRendererNative *renderer_native)
.scale = view_scale,
};
g_array_append_val (crtc_layouts, crtc_layout);
meta_onscreen_native_invalidate (onscreen_native);
renderer_native->pending_mode_set_views =
g_list_prepend (renderer_native->pending_mode_set_views,
stage_view);
}
}
renderer_native->pending_mode_set = TRUE;