compositor-drm: preserve CRTC routing harder
If we are processing a connector that does not have an existing routing, it is possible we pick a CRTC that was previously routed to a connector we have not enabled yet. If that happens, the latter connector cannot preserve its routing. Check that no other connector we might enable later had this CRTC before. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Acked-by: Derek Foreman <derekf@osg.samsung.com> Reviewed-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
@@ -4788,7 +4788,9 @@ drm_output_pick_crtc(struct drm_output *output, drmModeRes *resources)
|
|||||||
unsigned j, n = 0;
|
unsigned j, n = 0;
|
||||||
uint32_t crtc_id;
|
uint32_t crtc_id;
|
||||||
int best_crtc_index = -1;
|
int best_crtc_index = -1;
|
||||||
|
int fallback_crtc_index = -1;
|
||||||
int i;
|
int i;
|
||||||
|
bool match;
|
||||||
|
|
||||||
backend = to_drm_backend(output->base.compositor);
|
backend = to_drm_backend(output->base.compositor);
|
||||||
|
|
||||||
@@ -4829,12 +4831,37 @@ drm_output_pick_crtc(struct drm_output *output, drmModeRes *resources)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
best_crtc_index = i;
|
/* Check if any other head had existing routing to this CRTC.
|
||||||
|
* If they did, this is not the best CRTC as it might be needed
|
||||||
|
* for another output we haven't enabled yet. */
|
||||||
|
match = false;
|
||||||
|
wl_list_for_each(base, &backend->compositor->head_list,
|
||||||
|
compositor_link) {
|
||||||
|
head = to_drm_head(base);
|
||||||
|
|
||||||
|
if (head->base.output == &output->base)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (weston_head_is_enabled(&head->base))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (head->inherited_crtc_id == crtc_id) {
|
||||||
|
match = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!match)
|
||||||
|
best_crtc_index = i;
|
||||||
|
|
||||||
|
fallback_crtc_index = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (best_crtc_index != -1)
|
if (best_crtc_index != -1)
|
||||||
return best_crtc_index;
|
return best_crtc_index;
|
||||||
|
|
||||||
|
if (fallback_crtc_index != -1)
|
||||||
|
return fallback_crtc_index;
|
||||||
|
|
||||||
/* Likely possible_crtcs was empty due to asking for clones,
|
/* Likely possible_crtcs was empty due to asking for clones,
|
||||||
* but since the DRM documentation says the kernel lies, let's
|
* but since the DRM documentation says the kernel lies, let's
|
||||||
* pick one crtc anyway. Trial and error is the only way to
|
* pick one crtc anyway. Trial and error is the only way to
|
||||||
|
|||||||
Reference in New Issue
Block a user