diff --git a/kmscube.c b/kmscube.c
index 5a18c322ad2dc5818c2825e779f8915105a525d8..6bfa86a0f1d7b6cd30a7f10ada3f414814b398af 100644 (file)
--- a/kmscube.c
+++ b/kmscube.c
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;
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)
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;