[Piglit] [PATCH] gbm: use libcaca to display results in non-auto mode
Kristian Høgsberg
krh at bitplanet.net
Sat Feb 8 07:04:56 CET 2014
On Fri, Feb 7, 2014 at 4:38 PM, Kenneth Graunke <kenneth at whitecape.org> 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 <jordan.l.justen at intel.com>
>
> 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 <kenneth at whitecape.org>
>
> 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. Maybe put one in the commit
message?
Kristian
>
> --Ken
>
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
>
More information about the Piglit
mailing list