Skip to content

Commit d0377ac

Browse files
authored
improve mode selection (#51)
* prefer progressive mode * default to preferred mode
1 parent 72ba2b1 commit d0377ac

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

src/drm.c

+12-3
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ struct modeset_output *modeset_output_create(int fd, drmModeRes *res, drmModeCon
436436
}
437437

438438
int fc = 0;
439+
int preferred_fc = -1;
439440
if (mode_width>0 && mode_height>0 && mode_vrefresh>0) {
440441
fc = -1;
441442
printf( "Available modes:\n");
@@ -445,13 +446,21 @@ struct modeset_output *modeset_output_create(int fd, drmModeRes *res, drmModeCon
445446
conn->modes[i].vdisplay == mode_height &&
446447
conn->modes[i].vrefresh == mode_vrefresh
447448
) {
448-
fc = i;
449+
if (fc < 0)
450+
fc = i;
451+
if (fc >= 0 && (conn->modes[i].flags & DRM_MODE_FLAG_INTERLACE) == 0) // prefer progressive modes
452+
fc = i;
453+
} else if (conn->modes[i].type & DRM_MODE_TYPE_PREFERRED) {
454+
preferred_fc = i;
449455
}
450456
}
451-
if (fc < 0) {
457+
if (fc < 0 && preferred_fc < 0) {
452458
fprintf(stderr, "couldn't find a matching mode for %dx%d@%d\n", mode_width , mode_height , mode_vrefresh);
453459
goto out_error;
454-
}
460+
} else if (fc < 0 && preferred_fc >= 0) {
461+
fprintf(stderr, "couldn't find a matching mode, useing preferred mode %dx%d@%d\n", conn->modes[preferred_fc].hdisplay, conn->modes[preferred_fc].vdisplay , conn->modes[preferred_fc].vrefresh);
462+
fc = preferred_fc;
463+
}
455464
printf( "Using screen mode %dx%d@%d\n",conn->modes[fc].hdisplay, conn->modes[fc].vdisplay , conn->modes[fc].vrefresh );
456465
}
457466
memcpy(&out->mode, &conn->modes[fc], sizeof(out->mode));

0 commit comments

Comments
 (0)