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:
@ -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;
|
||||
|
Reference in New Issue
Block a user