aboutsummaryrefslogtreecommitdiffstats
path: root/drmtest.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2017-09-11 08:17:23 +0200
committerGerd Hoffmann <kraxel@redhat.com>2017-09-11 08:18:49 +0200
commitf66b284016cb81f2aa1f3207654f83395692cd36 (patch)
tree8a2abef5cc57d9a84f9815c1de89d641317d0a57 /drmtest.c
parent3bab7065a0195367bd8cf75c37a16f98723c7826 (diff)
downloaddrminfo-f66b284016cb81f2aa1f3207654f83395692cd36.tar.gz
mode switching
Diffstat (limited to 'drmtest.c')
-rw-r--r--drmtest.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/drmtest.c b/drmtest.c
index 2e9216a..34b0956 100644
--- a/drmtest.c
+++ b/drmtest.c
@@ -63,11 +63,13 @@ cairo_surface_t *image;
/* ------------------------------------------------------------------ */
-static void drm_init_dev(int devnr, const char *output, bool need_dumb)
+static void drm_init_dev(int devnr, const char *output,
+ const char *modename, bool need_dumb)
{
drmModeRes *res;
char dev[64];
char name[64];
+ char m[64];
int i, rc;
uint64_t has_dumb;
@@ -143,7 +145,23 @@ static void drm_init_dev(int devnr, const char *output, bool need_dumb)
fprintf(stderr, "no usable connector found\n");
exit(1);
}
- mode = &conn->modes[0];
+
+ if (modename) {
+ for (i = 0; i < conn->count_modes; i++) {
+ snprintf(m, sizeof(m), "%dx%d",
+ conn->modes[i].hdisplay,
+ conn->modes[i].vdisplay);
+ if (strcmp(m, modename) == 0) {
+ fprintf(stderr, "Using mode %s\n", modename);
+ mode = &conn->modes[i];
+ break;
+ }
+ }
+ }
+ if (!mode) {
+ mode = &conn->modes[0];
+ }
+
enc = drmModeGetEncoder(fd, conn->encoder_id);
if (enc == NULL) {
fprintf(stderr, "drmModeGetEncoder() failed\n");
@@ -169,7 +187,7 @@ static void drm_show_fb(void)
rc = drmModeSetCrtc(fd, enc->crtc_id, fb_id, 0, 0,
&conn->connector_id, 1,
- &conn->modes[0]);
+ mode);
if (rc < 0) {
fprintf(stderr, "drmModeSetCrtc() failed\n");
exit (1);
@@ -451,6 +469,7 @@ static void usage(FILE *fp)
" -s <secs> set sleep time\n"
" -i <file> load and display image <file>\n"
" -f <fmt> pick framebuffer format\n"
+ " -m <mode> pick video mode format\n"
" -g openngl mode\n"
#if 0
" -d debug mode (opengl)\n"
@@ -465,11 +484,12 @@ int main(int argc, char **argv)
bool gl = false;
char *output = NULL;
char *format = NULL;
+ char *modename = NULL;
char buf[32];
int c,i;
for (;;) {
- c = getopt(argc, argv, "hgdc:s:o:i:f:");
+ c = getopt(argc, argv, "hgdc:s:o:i:f:m:");
if (c == -1)
break;
switch (c) {
@@ -488,6 +508,9 @@ int main(int argc, char **argv)
case 'f':
format = optarg;
break;
+ case 'm':
+ modename = optarg;
+ break;
case 'g':
gl = true;
break;
@@ -526,12 +549,12 @@ int main(int argc, char **argv)
}
if (gl) {
- drm_init_dev(card, output, true);
+ drm_init_dev(card, output, modename, true);
drm_init_egl();
drm_draw_egl();
drm_make_egl_fb();
} else {
- drm_init_dev(card, output, false);
+ drm_init_dev(card, output, modename, false);
drm_init_dumb_fb();
drm_draw_dumb_fb();
}