mirror of
https://github.com/X11Libre/xf86-video-amdgpu.git
synced 2026-03-24 01:24:31 +00:00
Don't bail from drmmode_set_desired_modes immediately
If we fail to find or set the mode for a CRTC, keep trying for the remaining CRTCs, and only return FALSE if we failed for all CRTCs that should be on. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Acked-by: Harry Wentland <harry.wentland@amd.com>
This commit is contained in:
committed by
Michel Dänzer
parent
37c7260bde
commit
f5ac5f385f
@@ -2523,6 +2523,7 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
|
||||
{
|
||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn);
|
||||
unsigned num_desired = 0, num_on = 0;
|
||||
int c;
|
||||
|
||||
for (c = 0; c < config->num_crtc; c++) {
|
||||
@@ -2557,6 +2558,8 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
|
||||
if (!output)
|
||||
continue;
|
||||
|
||||
num_desired++;
|
||||
|
||||
/* Mark that we'll need to re-set the mode for sure */
|
||||
memset(&crtc->mode, 0, sizeof(crtc->mode));
|
||||
if (!crtc->desiredMode.CrtcHDisplay) {
|
||||
@@ -2564,8 +2567,11 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
|
||||
pScrn->
|
||||
currentMode);
|
||||
|
||||
if (!mode)
|
||||
return FALSE;
|
||||
if (!mode) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"Failed to find mode for CRTC %d\n", c);
|
||||
continue;
|
||||
}
|
||||
crtc->desiredMode = *mode;
|
||||
crtc->desiredRotation = RR_Rotate_0;
|
||||
crtc->desiredX = 0;
|
||||
@@ -2573,20 +2579,30 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
|
||||
}
|
||||
|
||||
if (set_hw) {
|
||||
if (!crtc->funcs->set_mode_major(crtc, &crtc->desiredMode,
|
||||
crtc->desiredRotation,
|
||||
crtc->desiredX,
|
||||
crtc->desiredY))
|
||||
return FALSE;
|
||||
if (crtc->funcs->set_mode_major(crtc, &crtc->desiredMode,
|
||||
crtc->desiredRotation,
|
||||
crtc->desiredX,
|
||||
crtc->desiredY)) {
|
||||
num_on++;
|
||||
} else {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"Failed to set mode on CRTC %d\n", c);
|
||||
}
|
||||
} else {
|
||||
crtc->mode = crtc->desiredMode;
|
||||
crtc->rotation = crtc->desiredRotation;
|
||||
crtc->x = crtc->desiredX;
|
||||
crtc->y = crtc->desiredY;
|
||||
if (!drmmode_handle_transform(crtc))
|
||||
return FALSE;
|
||||
if (drmmode_handle_transform(crtc))
|
||||
num_on++;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_on == 0 && num_desired > 0) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to enable any CRTC\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user