summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2009-09-21 15:10:24 -0400
committerKristian Høgsberg <krh@redhat.com>2009-09-21 15:10:24 -0400
commite000d8cd23a63b6d42b4055179da68b67764c963 (patch)
treeba473228f085b1728bfec0397c42d9aee6f05821
parent9ae561d5bd081598ff120c490cc31d7a29d84a09 (diff)
downloadwayland-e000d8cd23a63b6d42b4055179da68b67764c963.tar.gz
wayland-e000d8cd23a63b6d42b4055179da68b67764c963.tar.xz
wayland-e000d8cd23a63b6d42b4055179da68b67764c963.zip
Make connector option actually work
-rw-r--r--wayland-system-compositor.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/wayland-system-compositor.c b/wayland-system-compositor.c
index ab8eb76..45dad32 100644
--- a/wayland-system-compositor.c
+++ b/wayland-system-compositor.c
@@ -1176,6 +1176,16 @@ init_egl(struct wlsc_compositor *ec, struct udev_device *device)
return 0;
}
+static drmModeModeInfo builtin_1024x768 = {
+ 63500, /* clock */
+ 1024, 1072, 1176, 1328, 0,
+ 768, 771, 775, 798, 0,
+ 59920,
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC,
+ 0,
+ "1024x768"
+};
+
static int
create_output(struct wlsc_compositor *ec, struct udev_device *device)
{
@@ -1209,7 +1219,6 @@ create_output(struct wlsc_compositor *ec, struct udev_device *device)
continue;
if (connector->connection == DRM_MODE_CONNECTED &&
- connector->count_modes > 0 &&
(option_connector == 0 ||
connector->connector_id == option_connector))
break;
@@ -1222,22 +1231,28 @@ create_output(struct wlsc_compositor *ec, struct udev_device *device)
return -1;
}
- mode = &connector->modes[0];
-
- for (i = 0; i < resources->count_encoders; i++) {
- encoder = drmModeGetEncoder(fd, resources->encoders[i]);
+ if (connector->count_modes > 0)
+ mode = &connector->modes[0];
+ else
+ mode = &builtin_1024x768;
- if (encoder == NULL)
- continue;
+ encoder = drmModeGetEncoder(fd, connector->encoders[0]);
+ if (encoder == NULL) {
+ fprintf(stderr, "No encoder for connector.\n");
+ return -1;
+ }
- if (encoder->encoder_id == connector->encoder_id)
+ for (i = 0; i < resources->count_crtcs; i++) {
+ if (encoder->possible_crtcs & (1 << i))
break;
-
- drmModeFreeEncoder(encoder);
+ }
+ if (i == resources->count_crtcs) {
+ fprintf(stderr, "No usable crtc for encoder.\n");
+ return -1;
}
output->compositor = ec;
- output->crtc_id = encoder->crtc_id;
+ output->crtc_id = resources->crtcs[i];
output->connector_id = connector->connector_id;
output->mode = mode;
output->x = 0;
@@ -1245,6 +1260,12 @@ create_output(struct wlsc_compositor *ec, struct udev_device *device)
output->width = mode->hdisplay;
output->height = mode->vdisplay;
+ printf("using crtc %d, connector %d and encoder %d, mode %s\n",
+ output->crtc_id,
+ output->connector_id,
+ encoder->encoder_id,
+ mode->name);
+
output->surface = eglCreateSurface(ec->display,
ec->config,
output->width,
@@ -1268,9 +1289,9 @@ create_output(struct wlsc_compositor *ec, struct udev_device *device)
}
output->current = 0;
- ret = drmModeSetCrtc(fd, encoder->crtc_id,
+ ret = drmModeSetCrtc(fd, output->crtc_id,
output->fb_id[output->current ^ 1], 0, 0,
- &connector->connector_id, 1, mode);
+ &output->connector_id, 1, mode);
if (ret) {
fprintf(stderr, "failed to set mode: %m\n");
return -1;