]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/kmscube.git/blobdiff - kmscube.c
kmscube.c: init_drm(): select the current CRTC display mode is valid
[glsdk/kmscube.git] / kmscube.c
index 5a18c322ad2dc5818c2825e779f8915105a525d8..6bfa86a0f1d7b6cd30a7f10ada3f414814b398af 100644 (file)
--- a/kmscube.c
+++ b/kmscube.c
@@ -84,11 +84,13 @@ struct drm_fb {
 static int init_drm(void)
 {
        static const char *modules[] = {
-                       "omapdrm", "i915", "radeon", "nouveau", "vmwgfx", "exynos"
+                       "omapdrm", "tilcdc", "i915", "radeon", "nouveau", "vmwgfx", "exynos"
        };
        drmModeRes *resources;
        drmModeConnector *connector = NULL;
        drmModeEncoder *encoder = NULL;
+       drmModeCrtc *crtc = NULL;
+
        int i, j;
        uint32_t maxRes, curRes;
 
@@ -119,10 +121,8 @@ static int init_drm(void)
        for (i = 0; i < resources->count_connectors; i++) {
                connector = drmModeGetConnector(drm.fd, resources->connectors[i]);
                if (connector->connection == DRM_MODE_CONNECTED) {
-                       /* choose the first supported mode */
-                       drm.mode[drm.ndisp] = &connector->modes[0];
-                       drm.connector_id[drm.ndisp] = connector->connector_id;
 
+                       /* find the matched encoders */
                        for (j=0; j<resources->count_encoders; j++) {
                                encoder = drmModeGetEncoder(drm.fd, resources->encoders[j]);
                                if (encoder->encoder_id == connector->encoder_id)
@@ -137,6 +137,35 @@ static int init_drm(void)
                                return -1;
                        }
 
+                       /* choose the current or first supported mode */
+                       crtc = drmModeGetCrtc(drm.fd, encoder->crtc_id);
+                       for (j = 0; j < connector->count_modes; j++)
+                       {
+                               if (crtc->mode_valid)
+                               {
+                                       if ((connector->modes[j].hdisplay == crtc->width) &&
+                                       (connector->modes[j].vdisplay == crtc->height))
+                                       {
+                                               drm.mode[drm.ndisp] = &connector->modes[j];
+                                               break;
+                                       }
+                               }
+                               else
+                               {
+                                       if ((connector->modes[j].hdisplay == crtc->x) &&
+                                          (connector->modes[j].vdisplay == crtc->y))
+                                       {
+                                               drm.mode[drm.ndisp] = &connector->modes[j];
+                                               break;
+                                       }
+                               }
+                       }
+
+                       if(j >= connector->count_modes)
+                               drm.mode[drm.ndisp] = &connector->modes[0];
+
+                       drm.connector_id[drm.ndisp] = connector->connector_id;
+
                        drm.encoder[drm.ndisp]  = (uint32_t) encoder;
                        drm.crtc_id[drm.ndisp] = encoder->crtc_id;
                        drm.connectors[drm.ndisp] = connector;