test_output: add blitting support
When opengl rendering is not available on the target device, we now fall back to software rendering. Instead of drawing a nice gradient we now draw a white screen to the target device to avoid heavy calculations. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
aada3038e1
commit
023fb41bb4
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* test_output - Test KMS/DRI output
|
* test_output - Test KMS/DRI output
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011 David Herrmann <dh.herrmann@googlemail.com>
|
* Copyright (c) 2011-2012 David Herrmann <dh.herrmann@googlemail.com>
|
||||||
* Copyright (c) 2011 University of Tuebingen
|
* Copyright (c) 2011 University of Tuebingen
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@ -64,6 +64,67 @@ float d_col[] = { 1, 1, 0, 1,
|
|||||||
0, 0, 1, 1,
|
0, 0, 1, 1,
|
||||||
0, 1, 1, 1 };
|
0, 1, 1, 1 };
|
||||||
|
|
||||||
|
static int blit_outputs(struct uterm_video *video)
|
||||||
|
{
|
||||||
|
struct uterm_display *iter;
|
||||||
|
int j, ret;
|
||||||
|
struct uterm_screen *screen;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
iter = uterm_video_get_displays(video);
|
||||||
|
for ( ; iter; iter = uterm_display_next(iter)) {
|
||||||
|
log_notice("Activating display %d %p...", j, iter);
|
||||||
|
ret = uterm_display_activate(iter, NULL);
|
||||||
|
if (ret)
|
||||||
|
log_err("Cannot activate display %d: %d", j, ret);
|
||||||
|
else
|
||||||
|
log_notice("Successfully activated display %d", j);
|
||||||
|
|
||||||
|
ret = uterm_display_set_dpms(iter, UTERM_DPMS_ON);
|
||||||
|
if (ret)
|
||||||
|
log_err("Cannot set DPMS to ON: %d", ret);
|
||||||
|
|
||||||
|
++j;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter = uterm_video_get_displays(video);
|
||||||
|
for ( ; iter; iter = uterm_display_next(iter)) {
|
||||||
|
if (uterm_display_get_state(iter) != UTERM_DISPLAY_ACTIVE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = uterm_screen_new_single(&screen, iter);
|
||||||
|
if (ret) {
|
||||||
|
log_err("Cannot create temp-screen object: %d", ret);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = uterm_screen_fill(screen, 0xff, 0xff, 0xff, 0, 0,
|
||||||
|
uterm_screen_width(screen),
|
||||||
|
uterm_screen_height(screen));
|
||||||
|
if (ret) {
|
||||||
|
log_err("cannot fill framebuffer");
|
||||||
|
uterm_screen_unref(screen);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = uterm_screen_swap(screen);
|
||||||
|
if (ret) {
|
||||||
|
log_err("Cannot swap screen: %d", ret);
|
||||||
|
uterm_screen_unref(screen);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_notice("Successfully set screen on display %p", iter);
|
||||||
|
uterm_screen_unref(screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_notice("Waiting 5 seconds...");
|
||||||
|
ev_eloop_run(eloop, 5000);
|
||||||
|
log_notice("Exiting...");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int set_outputs(struct uterm_video *video)
|
static int set_outputs(struct uterm_video *video)
|
||||||
{
|
{
|
||||||
struct uterm_display *iter;
|
struct uterm_display *iter;
|
||||||
@ -176,19 +237,35 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
struct uterm_video *video;
|
struct uterm_video *video;
|
||||||
int ret;
|
int ret;
|
||||||
|
unsigned int mode;
|
||||||
|
const char *node;
|
||||||
|
|
||||||
ret = test_prepare(argc, argv, &eloop);
|
ret = test_prepare(argc, argv, &eloop);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_fail;
|
goto err_fail;
|
||||||
|
|
||||||
log_notice("Creating video object...");
|
if (conf_global.use_fbdev) {
|
||||||
ret = uterm_video_new(&video, eloop, UTERM_VIDEO_DRM, "/dev/dri/card0");
|
mode = UTERM_VIDEO_FBDEV;
|
||||||
|
node = "/dev/fb0";
|
||||||
|
} else {
|
||||||
|
mode = UTERM_VIDEO_DRM;
|
||||||
|
node = "/dev/dri/card0";
|
||||||
|
}
|
||||||
|
|
||||||
|
log_notice("Creating video object using %s...", node);
|
||||||
|
|
||||||
|
ret = uterm_video_new(&video, eloop, mode, node);
|
||||||
|
if (ret) {
|
||||||
|
if (mode == UTERM_VIDEO_DRM) {
|
||||||
|
log_notice("cannot create drm device; trying dumb drm mode");
|
||||||
|
ret = uterm_video_new(&video, eloop,
|
||||||
|
UTERM_VIDEO_DUMB, node);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_exit;
|
goto err_exit;
|
||||||
|
} else {
|
||||||
ret = uterm_video_use(video);
|
goto err_exit;
|
||||||
if (ret)
|
}
|
||||||
goto err_unref;
|
}
|
||||||
|
|
||||||
log_notice("Wakeing up video object...");
|
log_notice("Wakeing up video object...");
|
||||||
ret = uterm_video_wake_up(video);
|
ret = uterm_video_wake_up(video);
|
||||||
@ -202,7 +279,12 @@ int main(int argc, char **argv)
|
|||||||
goto err_unref;
|
goto err_unref;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
ret = uterm_video_use(video);
|
||||||
|
if (ret)
|
||||||
|
ret = blit_outputs(video);
|
||||||
|
else
|
||||||
ret = set_outputs(video);
|
ret = set_outputs(video);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
log_err("Cannot set outputs: %d", ret);
|
log_err("Cannot set outputs: %d", ret);
|
||||||
goto err_unref;
|
goto err_unref;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user