1*4882a593SmuzhiyunFrom 7e43521bb942516f810dde29745ba9f8360708e0 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Wed, 21 Oct 2020 15:27:38 +0800 4*4882a593SmuzhiyunSubject: [PATCH 33/79] backend-drm: Support setting interlaced mode 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunTested with: 7*4882a593Smuzhiyunecho "output:HDMI-A-1:mode=1920x1080i" > /tmp/.weston_drm.conf 8*4882a593Smuzhiyun> Output HDMI-A-1 changed to 1920x1080i@60 for mode(1920x1080i) 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 11*4882a593Smuzhiyun--- 12*4882a593Smuzhiyun libweston/backend-drm/drm.c | 4 ++-- 13*4882a593Smuzhiyun libweston/backend-drm/modes.c | 24 ++++++++++++++---------- 14*4882a593Smuzhiyun 2 files changed, 16 insertions(+), 12 deletions(-) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c 17*4882a593Smuzhiyunindex e829d77..3667b8d 100644 18*4882a593Smuzhiyun--- a/libweston/backend-drm/drm.c 19*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm.c 20*4882a593Smuzhiyun@@ -3575,9 +3575,9 @@ drm_output_modeset(struct drm_output *output, const char *modeline) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun mode = to_drm_mode(output->base.current_mode); 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun- weston_log("Output %s changed to %dx%d@%d for mode(%s)\n", 25*4882a593Smuzhiyun+ weston_log("Output %s changed to %s@%d for mode(%s)\n", 26*4882a593Smuzhiyun output->base.name, 27*4882a593Smuzhiyun- mode->mode_info.hdisplay, mode->mode_info.vdisplay, 28*4882a593Smuzhiyun+ mode->mode_info.name, 29*4882a593Smuzhiyun mode->mode_info.vrefresh, 30*4882a593Smuzhiyun modeline); 31*4882a593Smuzhiyun 32*4882a593Smuzhiyundiff --git a/libweston/backend-drm/modes.c b/libweston/backend-drm/modes.c 33*4882a593Smuzhiyunindex ff7421d..25f61b8 100644 34*4882a593Smuzhiyun--- a/libweston/backend-drm/modes.c 35*4882a593Smuzhiyun+++ b/libweston/backend-drm/modes.c 36*4882a593Smuzhiyun@@ -450,9 +450,8 @@ drm_output_print_modes(struct drm_output *output) 37*4882a593Smuzhiyun dm = to_drm_mode(m); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun aspect_ratio = aspect_ratio_to_string(m->aspect_ratio); 40*4882a593Smuzhiyun- weston_log_continue(STAMP_SPACE "%dx%d@%.1f%s%s%s, %.1f MHz\n", 41*4882a593Smuzhiyun- dm->mode_info.hdisplay, 42*4882a593Smuzhiyun- dm->mode_info.vdisplay, 43*4882a593Smuzhiyun+ weston_log_continue(STAMP_SPACE "%s@%.1f%s%s%s, %.1f MHz\n", 44*4882a593Smuzhiyun+ dm->mode_info.name, 45*4882a593Smuzhiyun m->refresh / 1000.0, 46*4882a593Smuzhiyun aspect_ratio, 47*4882a593Smuzhiyun m->flags & WL_OUTPUT_MODE_PREFERRED ? 48*4882a593Smuzhiyun@@ -495,11 +494,14 @@ drm_output_choose_mode(struct drm_output *output, 49*4882a593Smuzhiyun enum weston_mode_aspect_ratio target_aspect = WESTON_MODE_PIC_AR_NONE; 50*4882a593Smuzhiyun struct drm_backend *b; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun+#define WESTON_MODE_NAME(mode) \ 53*4882a593Smuzhiyun+ to_drm_mode(mode)->mode_info.name 54*4882a593Smuzhiyun+ 55*4882a593Smuzhiyun b = to_drm_backend(output->base.compositor); 56*4882a593Smuzhiyun target_aspect = target_mode->aspect_ratio; 57*4882a593Smuzhiyun src_aspect = output->base.current_mode->aspect_ratio; 58*4882a593Smuzhiyun- if (output->base.current_mode->width == target_mode->width && 59*4882a593Smuzhiyun- output->base.current_mode->height == target_mode->height && 60*4882a593Smuzhiyun+ if (!strcmp(WESTON_MODE_NAME(output->base.current_mode), 61*4882a593Smuzhiyun+ WESTON_MODE_NAME(target_mode)) && 62*4882a593Smuzhiyun (output->base.current_mode->refresh == target_mode->refresh || 63*4882a593Smuzhiyun target_mode->refresh == 0)) { 64*4882a593Smuzhiyun if (!b->aspect_ratio_supported || src_aspect == target_aspect) 65*4882a593Smuzhiyun@@ -509,8 +511,8 @@ drm_output_choose_mode(struct drm_output *output, 66*4882a593Smuzhiyun wl_list_for_each(mode, &output->base.mode_list, base.link) { 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun src_aspect = mode->base.aspect_ratio; 69*4882a593Smuzhiyun- if (mode->mode_info.hdisplay == target_mode->width && 70*4882a593Smuzhiyun- mode->mode_info.vdisplay == target_mode->height) { 71*4882a593Smuzhiyun+ if (!strcmp(mode->mode_info.name, 72*4882a593Smuzhiyun+ WESTON_MODE_NAME(target_mode))) { 73*4882a593Smuzhiyun if (mode->base.refresh == target_mode->refresh || 74*4882a593Smuzhiyun target_mode->refresh == 0) { 75*4882a593Smuzhiyun if (!b->aspect_ratio_supported || 76*4882a593Smuzhiyun@@ -584,6 +586,7 @@ drm_output_choose_initial_mode(struct drm_backend *backend, 77*4882a593Smuzhiyun struct drm_mode *best = NULL; 78*4882a593Smuzhiyun struct drm_mode *drm_mode; 79*4882a593Smuzhiyun drmModeModeInfo drm_modeline; 80*4882a593Smuzhiyun+ char name[16] = {0}; 81*4882a593Smuzhiyun int32_t width = 0; 82*4882a593Smuzhiyun int32_t height = 0; 83*4882a593Smuzhiyun uint32_t refresh = 0; 84*4882a593Smuzhiyun@@ -593,7 +596,9 @@ drm_output_choose_initial_mode(struct drm_backend *backend, 85*4882a593Smuzhiyun int n; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun if (mode == WESTON_DRM_BACKEND_OUTPUT_PREFERRED && modeline) { 88*4882a593Smuzhiyun- n = sscanf(modeline, "%dx%d@%d %u:%u", &width, &height, 89*4882a593Smuzhiyun+ sscanf(modeline, "%12[^@pP]", name); 90*4882a593Smuzhiyun+ 91*4882a593Smuzhiyun+ n = sscanf(modeline, "%dx%d%*[^0-9]%d %u:%u", &width, &height, 92*4882a593Smuzhiyun &refresh, &aspect_width, &aspect_height); 93*4882a593Smuzhiyun if (backend->aspect_ratio_supported && n == 5) { 94*4882a593Smuzhiyun if (aspect_width == 4 && aspect_height == 3) 95*4882a593Smuzhiyun@@ -623,8 +628,7 @@ drm_output_choose_initial_mode(struct drm_backend *backend, 96*4882a593Smuzhiyun } 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun wl_list_for_each_reverse(drm_mode, &output->base.mode_list, base.link) { 99*4882a593Smuzhiyun- if (width == drm_mode->mode_info.hdisplay && 100*4882a593Smuzhiyun- height == drm_mode->mode_info.vdisplay && 101*4882a593Smuzhiyun+ if (!strcmp(name, drm_mode->mode_info.name) && 102*4882a593Smuzhiyun (refresh == 0 || refresh == drm_mode->mode_info.vrefresh)) { 103*4882a593Smuzhiyun if (!backend->aspect_ratio_supported || 104*4882a593Smuzhiyun aspect_ratio == drm_mode->base.aspect_ratio) 105*4882a593Smuzhiyun-- 106*4882a593Smuzhiyun2.20.1 107*4882a593Smuzhiyun 108