[Piglit] [PATCH] gbm: use libcaca to display results in non-auto mode

Jordan Justen jordan.l.justen at intel.com
Fri Feb 7 20:04:26 CET 2014


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 <jordan.l.justen at intel.com>
---
 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



More information about the Piglit mailing list