On Thu, 2017-07-20 at 09:24 +0200, Daniel Vetter wrote: > On Wed, Jul 19, 2017 at 04:46:07PM +0300, Paul Kocialkowski wrote: > > This introduces a common FrameDumpPath configuration field, as well > > as > > helper functions in dedicated igt_frame for writing cairo surfaces > > to png files. > > > > Signed-off-by: Paul Kocialkowski <paul.kocialkowski@xxxxxxxxxxxxxxx> > > --- > > lib/Makefile.sources | 2 + > > lib/igt.h | 1 + > > lib/igt_core.c | 12 +++++ > > lib/igt_core.h | 2 +- > > lib/igt_frame.c | 137 > > +++++++++++++++++++++++++++++++++++++++++++++++++++ > > lib/igt_frame.h | 43 ++++++++++++++++ > > Please make sure you pull the new docs into the docs build too. And > while > doing that, please review for other stuff added in the past year and > include that too. And please build the docs and check the result. I've just sent out a patch for that, thanks for pointing it out! Cheers, Paul > Thanks, Daniel > > > 6 files changed, 196 insertions(+), 1 deletion(-) > > create mode 100644 lib/igt_frame.c > > create mode 100644 lib/igt_frame.h > > > > diff --git a/lib/Makefile.sources b/lib/Makefile.sources > > index 53fdb54c..c2e58809 100644 > > --- a/lib/Makefile.sources > > +++ b/lib/Makefile.sources > > @@ -83,6 +83,8 @@ lib_source_list = \ > > uwildmat/uwildmat.c \ > > igt_kmod.c \ > > igt_kmod.h \ > > + igt_frame.c \ > > + igt_frame.h \ > > $(NULL) > > > > .PHONY: version.h.tmp > > diff --git a/lib/igt.h b/lib/igt.h > > index a069deb3..d16a4991 100644 > > --- a/lib/igt.h > > +++ b/lib/igt.h > > @@ -34,6 +34,7 @@ > > #include "igt_draw.h" > > #include "igt_dummyload.h" > > #include "igt_fb.h" > > +#include "igt_frame.h" > > #include "igt_gt.h" > > #include "igt_kms.h" > > #include "igt_pm.h" > > diff --git a/lib/igt_core.c b/lib/igt_core.c > > index 1ba79361..5a3b00e8 100644 > > --- a/lib/igt_core.c > > +++ b/lib/igt_core.c > > @@ -235,6 +235,10 @@ > > * An example configuration follows: > > * > > * |[<!-- language="plain" --> > > + * # The common configuration secton follows. > > + * [Common] > > + * FrameDumpPath=/tmp # The path to dump frames that fail > > comparison checks > > + * > > * # The following section is used for configuring the > > Device Under Test. > > * # It is not mandatory and allows overriding default > > values. > > * [DUT] > > @@ -290,6 +294,7 @@ static struct { > > static pthread_mutex_t log_buffer_mutex = > > PTHREAD_MUTEX_INITIALIZER; > > > > GKeyFile *igt_key_file; > > +char *frame_dump_path; > > > > const char *igt_test_name(void) > > { > > @@ -621,6 +626,13 @@ static int config_parse(void) > > if (!igt_key_file) > > return 0; > > > > + frame_dump_path = getenv("IGT_FRAME_DUMP_PATH"); > > + > > + if (!frame_dump_path) > > + frame_dump_path = > > g_key_file_get_string(igt_key_file, "Common", > > + "FrameDumpP > > ath", > > + &error); > > + > > rc = g_key_file_get_integer(igt_key_file, "DUT", > > "SuspendResumeDelay", > > &error); > > if (error && error->code == G_KEY_FILE_ERROR_INVALID_VALUE) > > diff --git a/lib/igt_core.h b/lib/igt_core.h > > index 0739ca83..1619a9d6 100644 > > --- a/lib/igt_core.h > > +++ b/lib/igt_core.h > > @@ -50,7 +50,7 @@ > > extern const char* __igt_test_description __attribute__((weak)); > > extern bool __igt_plain_output; > > extern GKeyFile *igt_key_file; > > - > > +extern char *frame_dump_path; > > > > /** > > * IGT_TEST_DESCRIPTION: > > diff --git a/lib/igt_frame.c b/lib/igt_frame.c > > new file mode 100644 > > index 00000000..dfafe53d > > --- /dev/null > > +++ b/lib/igt_frame.c > > @@ -0,0 +1,137 @@ > > +/* > > + * Copyright © 2017 Intel Corporation > > + * > > + * Permission is hereby granted, free of charge, to any person > > obtaining a > > + * copy of this software and associated documentation files (the > > "Software"), > > + * to deal in the Software without restriction, including without > > limitation > > + * the rights to use, copy, modify, merge, publish, distribute, > > sublicense, > > + * and/or sell copies of the Software, and to permit persons to > > whom the > > + * Software is furnished to do so, subject to the following > > conditions: > > + * > > + * The above copyright notice and this permission notice (including > > the next > > + * paragraph) shall be included in all copies or substantial > > portions of the > > + * Software. > > + * > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > > EXPRESS OR > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > > MERCHANTABILITY, > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO > > EVENT SHALL > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, > > DAMAGES OR OTHER > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > > ARISING > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > > OTHER DEALINGS > > + * IN THE SOFTWARE. > > + * > > + * Authors: > > + * Paul Kocialkowski <paul.kocialkowski@xxxxxxxxxxxxxxx> > > + */ > > + > > +#include "config.h" > > + > > +#include <fcntl.h> > > +#include <pixman.h> > > +#include <cairo.h> > > + > > +#include "igt.h" > > + > > +/** > > + * SECTION:igt_frame > > + * @short_description: Library for frame-related tests > > + * @title: Frame > > + * @include: igt_frame.h > > + * > > + * This library contains helpers for frame-related tests. This > > includes common > > + * frame dumping as well as frame comparison helpers. > > + */ > > + > > +/** > > + * igt_frame_dump_is_enabled: > > + * > > + * Get whether frame dumping is enabled. > > + * > > + * Returns: A boolean indicating whether frame dumping is enabled > > + */ > > +bool igt_frame_dump_is_enabled(void) > > +{ > > + return frame_dump_path != NULL; > > +} > > + > > +static void igt_write_frame_to_png(cairo_surface_t *surface, int > > fd, > > + const char *qualifier, const > > char *suffix) > > +{ > > + char path[PATH_MAX]; > > + const char *test_name; > > + const char *subtest_name; > > + cairo_status_t status; > > + int index; > > + > > + test_name = igt_test_name(); > > + subtest_name = igt_subtest_name(); > > + > > + if (suffix) > > + snprintf(path, PATH_MAX, "%s/frame-%s-%s-%s- > > %s.png", > > + frame_dump_path, test_name, subtest_name, > > qualifier, > > + suffix); > > + else > > + snprintf(path, PATH_MAX, "%s/frame-%s-%s-%s.png", > > + frame_dump_path, test_name, subtest_name, > > qualifier); > > + > > + igt_debug("Dumping %s frame to %s...\n", qualifier, path); > > + > > + status = cairo_surface_write_to_png(surface, path); > > + > > + igt_assert_eq(status, CAIRO_STATUS_SUCCESS); > > + > > + index = strlen(path); > > + > > + if (fd >= 0 && index < (PATH_MAX - 1)) { > > + path[index++] = '\n'; > > + path[index] = '\0'; > > + > > + write(fd, path, strlen(path)); > > + } > > +} > > + > > +/** > > + * igt_write_compared_frames_to_png: > > + * @reference: The reference cairo surface > > + * @capture: The captured cairo surface > > + * @reference_suffix: The suffix to give to the reference png file > > + * @capture_suffix: The suffix to give to the capture png file > > + * > > + * Write previously compared frames to png files. > > + */ > > +void igt_write_compared_frames_to_png(cairo_surface_t *reference, > > + cairo_surface_t *capture, > > + const char *reference_suffix, > > + const char *capture_suffix) > > +{ > > + char *id; > > + const char *test_name; > > + const char *subtest_name; > > + char path[PATH_MAX]; > > + int fd = -1; > > + > > + if (!igt_frame_dump_is_enabled()) > > + return; > > + > > + id = getenv("IGT_FRAME_DUMP_ID"); > > + > > + test_name = igt_test_name(); > > + subtest_name = igt_subtest_name(); > > + > > + if (id) > > + snprintf(path, PATH_MAX, "%s/frame-%s-%s-%s.txt", > > + frame_dump_path, test_name, subtest_name, > > id); > > + else > > + snprintf(path, PATH_MAX, "%s/frame-%s-%s.txt", > > + frame_dump_path, test_name, subtest_name); > > + > > + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); > > + igt_assert(fd >= 0); > > + > > + igt_debug("Writing dump report to %s...\n", path); > > + > > + igt_write_frame_to_png(reference, fd, "reference", > > reference_suffix); > > + igt_write_frame_to_png(capture, fd, "capture", > > capture_suffix); > > + > > + close(fd); > > +} > > diff --git a/lib/igt_frame.h b/lib/igt_frame.h > > new file mode 100644 > > index 00000000..ec6a1643 > > --- /dev/null > > +++ b/lib/igt_frame.h > > @@ -0,0 +1,43 @@ > > +/* > > + * Copyright © 2017 Intel Corporation > > + * > > + * Permission is hereby granted, free of charge, to any person > > obtaining a > > + * copy of this software and associated documentation files (the > > "Software"), > > + * to deal in the Software without restriction, including without > > limitation > > + * the rights to use, copy, modify, merge, publish, distribute, > > sublicense, > > + * and/or sell copies of the Software, and to permit persons to > > whom the > > + * Software is furnished to do so, subject to the following > > conditions: > > + * > > + * The above copyright notice and this permission notice (including > > the next > > + * paragraph) shall be included in all copies or substantial > > portions of the > > + * Software. > > + * > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > > EXPRESS OR > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > > MERCHANTABILITY, > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO > > EVENT SHALL > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, > > DAMAGES OR OTHER > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > > ARISING > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > > OTHER DEALINGS > > + * IN THE SOFTWARE. > > + * > > + * Authors: > > + * Paul Kocialkowski <paul.kocialkowski@xxxxxxxxxxxxxxx> > > + */ > > + > > +#ifndef IGT_FRAME_H > > +#define IGT_FRAME_H > > + > > +#ifdef HAVE_CONFIG_H > > +#include "config.h" > > +#endif > > + > > +#include "igt.h" > > +#include <stdbool.h> > > + > > +bool igt_frame_dump_is_enabled(void); > > +void igt_write_compared_frames_to_png(cairo_surface_t *reference, > > + cairo_surface_t *capture, > > + const char *reference_suffix, > > + const char *capture_suffix); > > + > > +#endif > > -- > > 2.13.2 > > > > _______________________________________________ > > Intel-gfx mailing list > > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > > https://lists.freedesktop.org/mailman/listinfo/intel-gfx > > -- Paul Kocialkowski <paul.kocialkowski@xxxxxxxxxxxxxxx> Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo, Finland _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx