summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Justen <jordan.l.justen@intel.com>2014-02-07 11:04:26 -0800
committerBen Widawsky <benjamin.widawsky@intel.com>2014-10-31 23:50:57 -0700
commit641d4e2450ea374dd3db1622903d5e64122a972c (patch)
tree1e798db53ec3c7e136482d8ee7f8e0c8f566cfd5
parente4b36241288c81d2dfcab85a2c6533948807029f (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.txt8
-rw-r--r--tests/util/CMakeLists.txt4
-rw-r--r--tests/util/piglit-framework-gl/piglit_gbm_framework.c85
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
+}