Make connector option actually work
authorKristian Høgsberg <krh@redhat.com>
Mon, 21 Sep 2009 19:10:24 +0000 (15:10 -0400)
committerKristian Høgsberg <krh@redhat.com>
Mon, 21 Sep 2009 19:10:24 +0000 (15:10 -0400)
wayland-system-compositor.c

index ab8eb76..45dad32 100644 (file)
@@ -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;