diff options
author | Jordan Justen <jordan.l.justen@intel.com> | 2014-02-07 11:04:26 -0800 |
---|---|---|
committer | Ben Widawsky <benjamin.widawsky@intel.com> | 2014-10-31 23:50:57 -0700 |
commit | 641d4e2450ea374dd3db1622903d5e64122a972c (patch) | |
tree | 1e798db53ec3c7e136482d8ee7f8e0c8f566cfd5 | |
parent | e4b36241288c81d2dfcab85a2c6533948807029f (diff) |
gbm: use libcaca to display results in non-auto modecaca
If GBM is enabled, attempt to locate libcaca too.
If the test was not run with -auto, then use libcaca
to draw a text version of the test's results to the
console.
v2 (Ben): Rebase
Per Ken's comment the libcaca API may change at v1.0, but it's still not
there are 8 months. I propose we push this, and worry about libcaca
breakage later.
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> (v1)
Acked-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: Kristian Høgsberg <krh@bitplanet.net>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
-rw-r--r-- | CMakeLists.txt | 8 | ||||
-rw-r--r-- | tests/util/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tests/util/piglit-framework-gl/piglit_gbm_framework.c | 85 |
3 files changed, 97 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index c6c48bcb3..4c187e30b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -350,6 +350,14 @@ if(PIGLIT_HAS_POSIX_TIMER_NOTIFY_THREAD) add_definitions(-DPIGLIT_HAS_POSIX_TIMER_NOTIFY_THREAD) endif() +if(GBM_FOUND) +FIND_LIBRARY(HAVE_LIBCACA NAMES caca) +if(HAVE_LIBCACA) + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} caca) + add_definitions(-DPIGLIT_HAS_LIBCACA) +endif(HAVE_LIBCACA) +endif(GBM_FOUND) + if(PIGLIT_USE_WAFFLE AND ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") pkg_check_modules(EGL egl) endif() diff --git a/tests/util/CMakeLists.txt b/tests/util/CMakeLists.txt index d8a72dfa6..98eedd081 100644 --- a/tests/util/CMakeLists.txt +++ b/tests/util/CMakeLists.txt @@ -11,6 +11,10 @@ set_source_files_properties( PROPERTIES GENERATED 1 ) +if(HAVE_LIBCACA) + link_libraries(caca) +endif() + set(UTIL_INCLUDES ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/tests/util/piglit-framework-gl/piglit_gbm_framework.c b/tests/util/piglit-framework-gl/piglit_gbm_framework.c index 3ea2a167b..de80b0d59 100644 --- a/tests/util/piglit-framework-gl/piglit_gbm_framework.c +++ b/tests/util/piglit-framework-gl/piglit_gbm_framework.c @@ -29,6 +29,9 @@ #include "piglit_gbm_framework.h" static void +piglit_gbm_console_display(void); + +static void enter_event_loop(struct piglit_winsys_framework *winsys_fw) { const struct piglit_gl_test_config *test_config = winsys_fw->wfl_fw.gl_fw.test_config; @@ -41,6 +44,8 @@ enter_event_loop(struct piglit_winsys_framework *winsys_fw) if (piglit_automatic) piglit_report_result(result); + piglit_gbm_console_display(); + /* gbm has no input, so we exit immediately, as if the user * had pressed escape. */ @@ -90,3 +95,83 @@ fail: destroy(gl_fw); return NULL; } + +#ifdef PIGLIT_HAS_LIBCACA +#include <caca.h> +#endif + +static void +piglit_gbm_console_display(void) +{ +#ifdef PIGLIT_HAS_LIBCACA + caca_canvas_t *canvas; + caca_dither_t *dither; + void *export; + uint32_t *pixels; + size_t export_size; + int width = 40, height = 20; + int i; + + canvas = caca_create_canvas(width, height); + if (!canvas) { + printf("Failed to get canvas for gbm console display!\n"); + return; + } + + caca_set_color_ansi(canvas, CACA_DEFAULT, CACA_TRANSPARENT); + + dither = caca_create_dither(32, piglit_width, piglit_height, + 4 * piglit_width, + 0x000000ff, 0x0000ff00, + 0x00ff0000, 0xff000000); + if (!dither) { + caca_free_canvas(canvas); + printf("Failed to get dither object for gbm console display!\n"); + return; + } + + /* Note: we allocate memory for 1 extra row */ + pixels = malloc(4 * piglit_width * (piglit_height + 1)); + + while (!piglit_check_gl_error(GL_NO_ERROR)) { + /* Clear any OpenGL errors */ + } + glBindFramebuffer(GL_READ_FRAMEBUFFER, piglit_winsys_fbo); + glReadPixels(0, 0, piglit_width, piglit_height, + GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) pixels); + if (!piglit_check_gl_error(GL_NO_ERROR)) { + caca_free_dither(dither); + caca_free_canvas(canvas); + printf("Error reading pixels for gbm console display!\n"); + return; + } + + /* Swap the image's pixels vertically using the extra + * row of pixels that we allocated as swap space. + */ + for (i = 0; i < (piglit_height / 2); i++) { + memcpy(&pixels[piglit_width * piglit_height], + &pixels[piglit_width * i], + 4 * piglit_width); + memcpy(&pixels[piglit_width * i], + &pixels[piglit_width * (piglit_height - i)], + 4 * piglit_width); + memcpy(&pixels[piglit_width * (piglit_height - i)], + &pixels[piglit_width * piglit_height], + 4 * piglit_width); + } + + caca_dither_bitmap(canvas, 0, 0, width, height, dither, pixels); + caca_free_dither(dither); + free(pixels); + + export = caca_export_canvas_to_memory(canvas, "ansi", &export_size); + caca_free_canvas(canvas); + if (!export) { + printf("Failed to export image for gbm console display!\n"); + } else { + fwrite(export, export_size, 1, stdout); + free(export); + } +#endif +} |