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>
This commit is contained in:
committed by
Kristian Høgsberg
parent
73d9395e68
commit
4b2558708b
@@ -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 = ¤t->base;
|
output->base.current_mode = ¤t->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);
|
||||||
|
|||||||
Reference in New Issue
Block a user