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.

Signed-off-by: Jordan Justen <[email protected]>
---
 CMakeLists.txt                                     |  8 ++
 tests/util/CMakeLists.txt                          |  4 +
 .../piglit-framework-gl/piglit_gbm_framework.c     | 85 ++++++++++++++++++++++
 3 files changed, 97 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index bef9c35..71a40ba 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -318,6 +318,14 @@ if(PIGLIT_HAS_POSIX_CLOCK_MONOTONIC)
        add_definitions(-DPIGLIT_HAS_POSIX_CLOCK_MONOTONIC)
 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 27c8888..c661f44 100644
--- a/tests/util/CMakeLists.txt
+++ b/tests/util/CMakeLists.txt
@@ -4,6 +4,10 @@ if(PIGLIT_HAS_POSIX_CLOCK_MONOTONIC AND HAVE_LIBRT)
     link_libraries(rt)
 endif()
 
+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 859a7c9..f30edf1 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
+}
-- 
1.9.rc1

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to