aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drminfo.c40
-rw-r--r--drmtest.c45
-rw-r--r--fbtest.c26
-rw-r--r--render.c30
4 files changed, 91 insertions, 50 deletions
diff --git a/drminfo.c b/drminfo.c
index b295b64..e7d6979 100644
--- a/drminfo.c
+++ b/drminfo.c
@@ -307,19 +307,34 @@ static void drm_info_planes(int fd, bool print_modifiers, bool print_properties)
}
}
-static void drm_info_fmts(int fd)
+static void drm_info_fmts(int fd, bool listonly)
{
+ bool first = true;
int i;
drm_plane_init(fd);
- fprintf(stdout, "framebuffer formats\n");
- drm_print_format_hdr(stdout, 4, true);
- for (i = 0; i < fmtcnt; i++) {
- if (!drm_probe_format_fb(fd, &fmts[i]))
- continue;
- drm_print_format(stdout, &fmts[i], 4, true);
+ if (listonly) {
+ for (i = 0; i < fmtcnt; i++) {
+ if (!drm_probe_format_fb(fd, &fmts[i]))
+ continue;
+ if (!drm_probe_format_primary(&fmts[i]))
+ continue;
+ if (!fmts[i].pixman)
+ continue;
+ fprintf(stdout, "%s%s", first ? "" : " ", fmts[i].name);
+ first = false;
+ }
+ fprintf(stdout, "\n");
+ } else {
+ fprintf(stdout, "framebuffer formats\n");
+ drm_print_format_hdr(stdout, 4, true);
+ for (i = 0; i < fmtcnt; i++) {
+ if (!drm_probe_format_fb(fd, &fmts[i]))
+ continue;
+ drm_print_format(stdout, &fmts[i], 4, true);
+ }
+ fprintf(stdout, "\n");
}
- fprintf(stdout, "\n");
}
static int drm_open(int devnr)
@@ -386,6 +401,7 @@ static void usage(FILE *fp)
" -p print supported planes\n"
" -P print supported planes, with modifiers\n"
" -f print supported formats\n"
+ " -F print testable (drmtest) formats\n"
" -r list properties\n"
" -l list all known formats\n"
"\n");
@@ -401,10 +417,11 @@ int main(int argc, char **argv)
bool modifiers = false;
bool properties = false;
bool format = false;
+ bool listonly = false;
char *columns;
for (;;) {
- c = getopt(argc, argv, "hlaAmopPfrc:");
+ c = getopt(argc, argv, "hlaAmopPfFrc:");
if (c == -1)
break;
switch (c) {
@@ -438,6 +455,9 @@ int main(int argc, char **argv)
case 'r':
properties = true;
break;
+ case 'F':
+ /* fall through */
+ listonly = true;
case 'f':
format = true;
break;
@@ -469,6 +489,6 @@ int main(int argc, char **argv)
if (plane)
drm_info_planes(fd, modifiers, properties);
if (format)
- drm_info_fmts(fd);
+ drm_info_fmts(fd, listonly);
return 0;
}
diff --git a/drmtest.c b/drmtest.c
index 4d72fb7..c25fcde 100644
--- a/drmtest.c
+++ b/drmtest.c
@@ -43,40 +43,39 @@ static cairo_surface_t *image;
/* ------------------------------------------------------------------ */
-static void drm_draw(void)
+static void drm_draw(bool autotest)
{
char name[64];
char info1[80], info2[80], info3[80];
cairo_t *cr;
- snprintf(info1, sizeof(info1), "drm driver: %s, v%d.%d.%d (%s)",
- version->name, version->version_major, version->version_minor,
- version->version_patchlevel, version->desc);
-
- drm_conn_name(conn, name, sizeof(name));
- snprintf(info2, sizeof(info2), "%dx%d, output %.10s, %.10s mode",
- mode->hdisplay, mode->vdisplay, name,
- pxcs && pxfb ? "pixman" : "cairo");
+ snprintf(info1, sizeof(info1), "mode: %dx%d",
+ mode->hdisplay, mode->vdisplay);
if (fmt->fourcc) {
- snprintf(info3, sizeof(info3),
- "dumb drm buffer, bpp %d, fourcc %c%c%c%c (ADDFB2)",
+ snprintf(info2, sizeof(info2),
+ "bpp %d, fourcc %c%c%c%c (ADDFB2)",
fmt->bpp,
(fmt->fourcc >> 0) & 0xff,
(fmt->fourcc >> 8) & 0xff,
(fmt->fourcc >> 16) & 0xff,
(fmt->fourcc >> 24) & 0xff);
} else {
- snprintf(info3, sizeof(info3),
- "dumb drm buffer, bpp %d, depth %d (legacy ADDFB)",
+ snprintf(info2, sizeof(info2),
+ "bpp %d, depth %d (legacy ADDFB)",
fmt->bpp, fmt->depth);
}
+ drm_conn_name(conn, name, sizeof(name));
+ snprintf(info3, sizeof(info3), "drm driver: %s, output %.10s",
+ version->name, name);
+
cr = cairo_create(cs);
if (image) {
render_image(cr, mode->hdisplay, mode->vdisplay, image);
} else {
- render_test(cr, mode->hdisplay, mode->vdisplay, info1, info2, info3);
+ render_test(cr, mode->hdisplay, mode->vdisplay, info1, info2,
+ autotest ? NULL : info3);
}
cairo_destroy(cr);
@@ -168,9 +167,9 @@ static void drm_init_dumb_fb(bool use_pixman)
}
}
-static void drm_draw_dumb_fb(void)
+static void drm_draw_dumb_fb(bool autotest)
{
- drm_draw();
+ drm_draw(autotest);
drmModeDirtyFB(fd, fb_id, 0, 0);
}
@@ -202,17 +201,21 @@ int main(int argc, char **argv)
char *format = NULL;
char *modename = NULL;
char buf[32];
+ bool autotest = false;
bool pixman = false;
int c,i;
for (;;) {
- c = getopt(argc, argv, "hpc:s:o:i:f:m:");
+ c = getopt(argc, argv, "hpac:s:o:i:f:m:");
if (c == -1)
break;
switch (c) {
case 'p':
pixman = true;
break;
+ case 'a':
+ autotest = true;
+ break;
case 'c':
card = atoi(optarg);
break;
@@ -290,16 +293,18 @@ int main(int argc, char **argv)
if (fmt->cairo == CAIRO_FORMAT_INVALID) {
if (fmt->pixman) {
- fprintf(stderr, "format not supported by cairo, enabling pixman mode\n");
+ fprintf(stderr, "format %s not supported by cairo, enabling pixman mode\n",
+ fmt->name);
pixman = true;
} else {
- fprintf(stderr, "format not supported by cairo or pixman\n");
+ fprintf(stderr, "format %s not supported by cairo or pixman\n",
+ fmt->name);
exit(1);
}
}
drm_init_dumb_fb(pixman);
- drm_draw_dumb_fb();
+ drm_draw_dumb_fb(autotest);
drm_show_fb();
tty_raw();
diff --git a/fbtest.c b/fbtest.c
index 172c7d4..24ebdff 100644
--- a/fbtest.c
+++ b/fbtest.c
@@ -28,23 +28,28 @@ static cairo_surface_t *image;
/* ------------------------------------------------------------------ */
-static void fb_draw(void)
+static void fb_draw(bool autotest)
{
char info1[80];
char info2[80];
char info3[80];
cairo_t *cr;
- snprintf(info1, sizeof(info1), "fb driver: %s", fb_fix.id);
- snprintf(info2, sizeof(info2), "%dx%d", fb_var.xres, fb_var.yres);
- snprintf(info3, sizeof(info3), "fbdev, %d bpp",
- fb_var.bits_per_pixel);
+ snprintf(info1, sizeof(info1), "mode: %dx%d", fb_var.xres, fb_var.yres);
+ snprintf(info2, sizeof(info2), "%d bpp, rgba %d,%d,%d,%d",
+ fb_var.bits_per_pixel,
+ fb_var.red.length,
+ fb_var.green.length,
+ fb_var.blue.length,
+ fb_var.transp.length);
+ snprintf(info3, sizeof(info3), "fb driver: %s", fb_fix.id);
cr = cairo_create(cs);
if (image) {
render_image(cr, fb_var.xres, fb_var.yres, image);
} else {
- render_test(cr, fb_var.xres, fb_var.yres, info1, info2, info3);
+ render_test(cr, fb_var.xres, fb_var.yres, info1, info2,
+ autotest ? NULL : info3);
}
cairo_destroy(cr);
}
@@ -59,6 +64,7 @@ static void usage(FILE *fp)
"\n"
"options:\n"
" -h print this\n"
+ " -a autotest mode (don't print hardware info)\n"
" -f <nr> pick framebuffer\n"
" -s <secs> set sleep time (default: 60)\n"
" -i <file> load and display image <file>\n"
@@ -69,14 +75,18 @@ int main(int argc, char **argv)
{
int framebuffer = 0;
int secs = 60;
+ bool autotest = false;
char buf[32];
int c;
for (;;) {
- c = getopt(argc, argv, "hs:i:f:");
+ c = getopt(argc, argv, "has:i:f:");
if (c == -1)
break;
switch (c) {
+ case 'a':
+ autotest = true;
+ break;
case 'f':
framebuffer = atoi(optarg);
break;
@@ -101,7 +111,7 @@ int main(int argc, char **argv)
fb_var.xres,
fb_var.yres,
fb_fix.line_length);
- fb_draw();
+ fb_draw(autotest);
tty_raw();
kbd_wait(secs);
diff --git a/render.c b/render.c
index 3437946..60b1155 100644
--- a/render.c
+++ b/render.c
@@ -12,6 +12,7 @@ static void render_color_bar(cairo_t *cr, int x, int y, int w, int h,
{
cairo_font_extents_t ext;
cairo_pattern_t *gr;
+ int lines;
gr = cairo_pattern_create_linear(x, y+h/2, w, y+h/2);
cairo_pattern_add_color_stop_rgb(gr, 0, 0, 0, 0);
@@ -21,25 +22,30 @@ static void render_color_bar(cairo_t *cr, int x, int y, int w, int h,
cairo_fill(cr);
cairo_pattern_destroy(gr);
+ cairo_set_source_rgb(cr, r, g, b);
cairo_select_font_face(cr, "Liberation Mono",
CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);
+
+ lines = 1;
if (l2) {
cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_set_font_size(cr, (h - 2*pad) / 3);
- cairo_font_extents(cr, &ext);
- cairo_move_to(cr, x + pad, y + pad + ext.ascent);
- cairo_show_text(cr, l1);
+ lines++;
+ if (l3)
+ lines++;
+ }
+
+ cairo_set_font_size(cr, (h - 2*pad) / lines);
+ cairo_font_extents(cr, &ext);
+ cairo_move_to(cr, x + pad, y + pad + ext.ascent);
+ cairo_show_text(cr, l1);
+ if (l2) {
cairo_move_to(cr, x + pad, y + pad + ext.ascent + ext.height);
cairo_show_text(cr, l2);
- cairo_move_to(cr, x + pad, y + pad + ext.ascent + ext.height * 2);
- cairo_show_text(cr, l3);
- } else {
- cairo_set_source_rgb(cr, r, g, b);
- cairo_set_font_size(cr, h - 2*pad);
- cairo_font_extents(cr, &ext);
- cairo_move_to(cr, x + pad, y + pad + ext.ascent);
- cairo_show_text(cr, l1);
+ if (l3) {
+ cairo_move_to(cr, x + pad, y + pad + ext.ascent + ext.height * 2);
+ cairo_show_text(cr, l3);
+ }
}
}