From 93bd75591605395f0eeb22ac92cc170e4cc1c142 Mon Sep 17 00:00:00 2001 From: Henk Wiedig Date: Fri, 21 Feb 2025 20:50:11 +0100 Subject: [PATCH 1/2] prefer progressive mode --- src/drm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/drm.c b/src/drm.c index 109d7ad..2daa8be 100644 --- a/src/drm.c +++ b/src/drm.c @@ -445,7 +445,10 @@ struct modeset_output *modeset_output_create(int fd, drmModeRes *res, drmModeCon conn->modes[i].vdisplay == mode_height && conn->modes[i].vrefresh == mode_vrefresh ) { - fc = i; + if (fc < 0) + fc = i; + if (fc >= 0 && (conn->modes[i].flags & DRM_MODE_FLAG_INTERLACE) == 0) // prefer progressive modes + fc = i; } } if (fc < 0) { From 0278da50d70f4fdaf116a1406bfe21dd4593e35b Mon Sep 17 00:00:00 2001 From: Henk Wiedig Date: Fri, 21 Feb 2025 20:55:11 +0100 Subject: [PATCH 2/2] default to preferred mode --- src/drm.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/drm.c b/src/drm.c index 2daa8be..f06857b 100644 --- a/src/drm.c +++ b/src/drm.c @@ -436,6 +436,7 @@ struct modeset_output *modeset_output_create(int fd, drmModeRes *res, drmModeCon } int fc = 0; + int preferred_fc = -1; if (mode_width>0 && mode_height>0 && mode_vrefresh>0) { fc = -1; printf( "Available modes:\n"); @@ -449,12 +450,17 @@ struct modeset_output *modeset_output_create(int fd, drmModeRes *res, drmModeCon fc = i; if (fc >= 0 && (conn->modes[i].flags & DRM_MODE_FLAG_INTERLACE) == 0) // prefer progressive modes fc = i; + } else if (conn->modes[i].type & DRM_MODE_TYPE_PREFERRED) { + preferred_fc = i; } } - if (fc < 0) { + if (fc < 0 && preferred_fc < 0) { fprintf(stderr, "couldn't find a matching mode for %dx%d@%d\n", mode_width , mode_height , mode_vrefresh); goto out_error; - } + } else if (fc < 0 && preferred_fc >= 0) { + 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); + fc = preferred_fc; + } printf( "Using screen mode %dx%d@%d\n",conn->modes[fc].hdisplay, conn->modes[fc].vdisplay , conn->modes[fc].vrefresh ); } memcpy(&out->mode, &conn->modes[fc], sizeof(out->mode));