static void listConnectorProperties(void) { int i; drmModeConnectorPtr c; for (i = 0; i < res->count_connectors; i++) { c = drmModeGetConnector(fd, res->connectors[i]); if (!c) { fprintf(stderr, "Could not get connector %u: %s\n", res->connectors[i], strerror(errno)); continue; } printf("Connector %u (%s-%u)\n", c->connector_id, connector_type_str(c->connector_type), c->connector_type_id); listObjectProperties(c->connector_id, DRM_MODE_OBJECT_CONNECTOR); drmModeFreeConnector(c); } }
int main(int argc, char **argv) { int fd; uint32_t handle[MAX_VMS], stride[MAX_VMS]; drmModeRes *resources; drmModeConnector *connector; drmModeEncoder *encoder; drmModeModeInfo *mode; int i; uint32_t fb_id[MAX_VMS], total_vms = 0, current_vm; struct drm_i915_gem_vgtfb create; fd = open("/dev/dri/card0", O_RDWR); drmSetMaster(fd); /* Find the first available connector with modes */ resources = drmModeGetResources(fd); if (!resources) { fprintf(stderr, "drmModeGetResources failed\n"); return -1; } for (i = 0; i < resources->count_connectors; i++) { connector = drmModeGetConnector(fd, resources->connectors[i]); if (connector == NULL) continue; if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) break; drmModeFreeConnector(connector); } if (i == resources->count_connectors) { fprintf(stderr, "No currently active connector found.\n"); return -1; } printf("Using connector: %s\n", connector_type_str(connector->connector_type)); for (i = 0; i < resources->count_encoders; i++) { encoder = drmModeGetEncoder(fd, resources->encoders[i]); if (encoder == NULL) continue; if (encoder->encoder_id == connector->encoder_id) break; drmModeFreeEncoder(encoder); } for (i = 0; i < connector->count_modes; i++) { mode = &connector->modes[i]; if (!strcmp(mode->name, "1680x1050")) break; } printf("Using mode: %s\n", mode->name); for (i = 0; i < (argc - 1) && i < MAX_VMS; i++) { int ret; create.vmid = atoi(argv[i+1]); printf("Requesting object for VM %d\n", create.vmid); if (ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_VGTFB, &create)) { printf("drmIoctl failed for domain %d. ret = %d\n", create.vmid, ret); continue; } handle[i] = create.handle; stride[i] = create.stride; /* Create a KMS framebuffer handle to set a mode with */ if (ret = drmModeAddFB(fd, mode->hdisplay, mode->vdisplay, 24, 32, stride[i], handle[i], &fb_id[i])) { printf("drmModeAddFB failed for handle %d. ret = %d\n", handle[i], ret); continue; } total_vms++; } drmDropMaster(fd); if (total_vms == 0) return -1; current_vm = 0; do { drmSetMaster(fd); drmModeSetCrtc(fd, encoder->crtc_id, fb_id[current_vm], 0, 0, &connector->connector_id, 1, mode); current_vm++; current_vm %= total_vms; drmDropMaster(fd); } while (getchar() != EOF); return 0; }