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.

> +     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.

--Ken

Attachment: signature.asc
Description: OpenPGP digital signature

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

Reply via email to