On Fri, Feb 7, 2014 at 10:04 PM, Kristian Høgsberg <[email protected]> wrote: > On Fri, Feb 7, 2014 at 4:38 PM, Kenneth Graunke <[email protected]> wrote: >> On 02/07/2014 11:04 AM, Jordan Justen wrote: >>> 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]> >> >> Oh man! It's like the Fedora Hot Dog(*) all over again...your only >> options are [YES] or [HELL YES] :D >> >> (*) https://fedoraproject.org/wiki/Features/Hot_Dog >> >> Acked-by: Kenneth Graunke <[email protected]> >> >> It looks like libcaca is changing API from 0.9 to 1.0, so this will >> probably need (simple) updates in the future. >> >> Some comments below. >> >>> --- >>> 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) >> >> This line doesn't seem necessary... >> >>> + 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); >> >> I'm not sure if gbm will ever create a non-RGBA8888 visual, but this >> would need tweaking. Maybe replace 4 with a "components" variable or >> such...? Would reduce the number of magic constants a bit. > > The native visual ID of the EGL config is the gbm format code. You > can use this to verify that you get the exact pixel format you're > expecting. > >>> + 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 */ >>> + } >> >> You could do: >> piglit_reset_gl_error(); >> >>> + 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); >>> + } >> >> I think with caca 1.0 you could just do: >> >> cucul_flop(canvas); >> >> and avoid this code, as well as the extra line. >> >>> + >>> + 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 >>> +} >> >> Jordan, you rock. > > I think this is cool and all, there's just a shocking lack of > "screenshots" in this discussion.
Pics or it doesn't exist? :) Attached is output from PIGLIT_PLATFORM=gbm bin/depthstencil-render-miplevels 128 ds=z24_s8 > Maybe put one in the commit > message? But, a commit message can't have color! How could I handle having such a low fidelity representation of the output? ;) -Jordan
<<attachment: piglit+gbm+libcaca.png>>
_______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
