compositor-drm: consider the best mode of the mode_list as an option

This patch fixes an issue where Weston using the DRM backend, cannot start
the display. This happens in the following context:
- no video mode is set before weston starts (eg no "/dev/fb" set up)
- weston is not configured with any default video mode (nothing from
  weston.ini nor command line)
- the DRM driver provides with a list of supported modes, but none of them
  is marked as PREFERRED (which is not a usual case, but it happens)
In that case, according to the current implementation, the DRM compositor
fails to set a video mode.
This fix lets the DRM compositor selects a video mode (the best one of the
list, which is the first) from the ones provided by the driver.

Signed-off-by: Fabien Dessenne <fabien.dessenne@st.com>
dev
Fabien DESSENNE 11 years ago committed by Kristian Høgsberg
parent 73d9395e68
commit 4b2558708b
  1. 6
      src/compositor-drm.c

@ -1857,7 +1857,7 @@ create_output_for_connector(struct drm_compositor *ec,
int x, int y, struct udev_device *drm_device) int x, int y, struct udev_device *drm_device)
{ {
struct drm_output *output; struct drm_output *output;
struct drm_mode *drm_mode, *next, *preferred, *current, *configured; struct drm_mode *drm_mode, *next, *preferred, *current, *configured, *best;
struct weston_mode *m; struct weston_mode *m;
struct weston_config_section *section; struct weston_config_section *section;
drmModeEncoder *encoder; drmModeEncoder *encoder;
@ -1960,6 +1960,7 @@ create_output_for_connector(struct drm_compositor *ec,
preferred = NULL; preferred = NULL;
current = NULL; current = NULL;
configured = NULL; configured = NULL;
best = NULL;
wl_list_for_each_reverse(drm_mode, &output->base.mode_list, base.link) { wl_list_for_each_reverse(drm_mode, &output->base.mode_list, base.link) {
if (config == OUTPUT_CONFIG_MODE && if (config == OUTPUT_CONFIG_MODE &&
@ -1970,6 +1971,7 @@ create_output_for_connector(struct drm_compositor *ec,
current = drm_mode; current = drm_mode;
if (drm_mode->base.flags & WL_OUTPUT_MODE_PREFERRED) if (drm_mode->base.flags & WL_OUTPUT_MODE_PREFERRED)
preferred = drm_mode; preferred = drm_mode;
best = drm_mode;
} }
if (config == OUTPUT_CONFIG_MODELINE) { if (config == OUTPUT_CONFIG_MODELINE) {
@ -1995,6 +1997,8 @@ create_output_for_connector(struct drm_compositor *ec,
output->base.current_mode = &preferred->base; output->base.current_mode = &preferred->base;
else if (current) else if (current)
output->base.current_mode = &current->base; output->base.current_mode = &current->base;
else if (best)
output->base.current_mode = &best->base;
if (output->base.current_mode == NULL) { if (output->base.current_mode == NULL) {
weston_log("no available modes for %s\n", output->base.name); weston_log("no available modes for %s\n", output->base.name);

Loading…
Cancel
Save