From 1c1d4f32c8fa1964e6f9738994d8767996d15646 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 19:13:38 +0000 Subject: [PATCH 01/11] gsk: Test big glyphs These are big, but still fit in the glyph cache. Therefore, the test succeeds. --- testsuite/gsk/compare/big-glyph.node | 5 +++++ testsuite/gsk/compare/big-glyph.png | Bin 0 -> 26595 bytes testsuite/gsk/meson.build | 1 + 3 files changed, 6 insertions(+) create mode 100644 testsuite/gsk/compare/big-glyph.node create mode 100644 testsuite/gsk/compare/big-glyph.png diff --git a/testsuite/gsk/compare/big-glyph.node b/testsuite/gsk/compare/big-glyph.node new file mode 100644 index 0000000000..6f73993160 --- /dev/null +++ b/testsuite/gsk/compare/big-glyph.node @@ -0,0 +1,5 @@ +text { + font:"Cantarell 500"; + glyphs:"ABC"; + offset: 0 0; +} \ No newline at end of file diff --git a/testsuite/gsk/compare/big-glyph.png b/testsuite/gsk/compare/big-glyph.png new file mode 100644 index 0000000000000000000000000000000000000000..d029bf21b9673d726aa6962469b09dda85bcf4ac GIT binary patch literal 26595 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 a=BM?(`S)--4S=`y0O{K$i;DAJasLOBck{#m literal 0 HcmV?d00001 diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index 5981f131d2..370d865a6b 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -18,6 +18,7 @@ node_parser = executable( ) compare_render_tests = [ + 'big-glyph', 'blend-normal', 'blend-difference', 'clip-coordinates-3d', From a64dfb1dfcff195b5aa2c17819b15cb1471bafbf Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 19:42:14 +0000 Subject: [PATCH 02/11] gl: Make the glyph cache survive big glyphs Create an extra atlas of just the right size for each huge glyph. Not pretty, but works. --- gsk/gl/gskglglyphcache.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c index 208ca28e87..d540d76c1e 100644 --- a/gsk/gl/gskglglyphcache.c +++ b/gsk/gl/gskglglyphcache.c @@ -33,13 +33,15 @@ static void glyph_cache_key_free (gpointer v); static void glyph_cache_value_free (gpointer v); static GskGLGlyphAtlas * -create_atlas (GskGLGlyphCache *cache) +create_atlas (GskGLGlyphCache *cache, + int width, + int height) { GskGLGlyphAtlas *atlas; atlas = g_new0 (GskGLGlyphAtlas, 1); - atlas->width = ATLAS_SIZE; - atlas->height = ATLAS_SIZE; + atlas->width = MAX (width, ATLAS_SIZE); + atlas->height = MAX (height, ATLAS_SIZE); atlas->y0 = 1; atlas->y = 1; atlas->x = 1; @@ -70,7 +72,6 @@ gsk_gl_glyph_cache_init (GskGLGlyphCache *self, self->hash_table = g_hash_table_new_full (glyph_cache_hash, glyph_cache_equal, glyph_cache_key_free, glyph_cache_value_free); self->atlases = g_ptr_array_new_with_free_func (free_atlas); - g_ptr_array_add (self->atlases, create_atlas (self)); self->renderer = renderer; self->gl_driver = gl_driver; @@ -167,7 +168,7 @@ add_to_cache (GskGLGlyphCache *cache, if (i == cache->atlases->len) { - atlas = create_atlas (cache); + atlas = create_atlas (cache, width + 2, height + 2); g_ptr_array_add (cache->atlases, atlas); } @@ -223,7 +224,7 @@ render_glyph (const GskGLGlyphAtlas *atlas, /* TODO: Give glyphs that large their own texture in the proper size. Don't * put them in the atlas at all. */ - if (surface_width > ATLAS_SIZE || surface_height > ATLAS_SIZE) + if (surface_width > atlas->width || surface_height > atlas->height) return FALSE; surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, surface_width, surface_height); From c7387a8e7fb3a385d6f21ac0deebf081e37e8ae0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 19:14:34 +0000 Subject: [PATCH 03/11] gsk: Test huge glyphs These don't fit in the glyph cache. --- testsuite/gsk/compare/huge-glyph.node | 5 +++++ testsuite/gsk/compare/huge-glyph.png | Bin 0 -> 46122 bytes testsuite/gsk/meson.build | 1 + 3 files changed, 6 insertions(+) create mode 100644 testsuite/gsk/compare/huge-glyph.node create mode 100644 testsuite/gsk/compare/huge-glyph.png diff --git a/testsuite/gsk/compare/huge-glyph.node b/testsuite/gsk/compare/huge-glyph.node new file mode 100644 index 0000000000..59650eb620 --- /dev/null +++ b/testsuite/gsk/compare/huge-glyph.node @@ -0,0 +1,5 @@ +text { + font:"Cantarell 800"; + glyphs:"ABC"; + offset: 0 0; +} \ No newline at end of file diff --git a/testsuite/gsk/compare/huge-glyph.png b/testsuite/gsk/compare/huge-glyph.png new file mode 100644 index 0000000000000000000000000000000000000000..0af4e1d7fc5b681f595d463a13d68a345b131614 GIT binary patch literal 46122 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 Mvxig7Ve*Cl02mXMPyhe` literal 0 HcmV?d00001 diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index 370d865a6b..a3563f11b4 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -46,6 +46,7 @@ compare_render_tests = [ 'empty-text', 'empty-texture', 'empty-transform', + 'huge-glyph', 'opacity_clip', 'outset_shadow_offset_both', 'outset_shadow_offset_x', From fd4182f5c5485d55dd3960a484a7471fe9407aca Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 20:52:26 +0000 Subject: [PATCH 04/11] gl: Log creation of glyph caches Now that they can be of different sizes, this is somewhat interesting. --- gsk/gl/gskglglyphcache.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c index d540d76c1e..37e468eb0e 100644 --- a/gsk/gl/gskglglyphcache.c +++ b/gsk/gl/gskglglyphcache.c @@ -33,7 +33,7 @@ static void glyph_cache_key_free (gpointer v); static void glyph_cache_value_free (gpointer v); static GskGLGlyphAtlas * -create_atlas (GskGLGlyphCache *cache, +create_atlas (GskGLGlyphCache *self, int width, int height) { @@ -47,6 +47,8 @@ create_atlas (GskGLGlyphCache *cache, atlas->x = 1; atlas->image = NULL; + GSK_RENDERER_NOTE(self->renderer, GLYPH_CACHE, g_message ("Create atlas %d x %d", atlas->width, atlas->height)); + return atlas; } From ad2a1c92ce68a2a9aa04c26ebd6658a3ea79b0b2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 20:53:07 +0000 Subject: [PATCH 05/11] gl: Improve glyph cache logging Use g_message to be consistent, and make the message fit a line. --- gsk/gl/gskglglyphcache.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c index 37e468eb0e..ed0aeb479c 100644 --- a/gsk/gl/gskglglyphcache.c +++ b/gsk/gl/gskglglyphcache.c @@ -190,11 +190,10 @@ add_to_cache (GskGLGlyphCache *cache, #ifdef G_ENABLE_DEBUG if (GSK_RENDERER_DEBUG_CHECK (cache->renderer, GLYPH_CACHE)) { - g_print ("Glyph cache:\n"); for (i = 0; i < cache->atlases->len; i++) { atlas = g_ptr_array_index (cache->atlases, i); - g_print ("\tGskGLGlyphAtlas %d (%dx%d): %.2g%% old pixels, filled to %d, %d / %d\n", + g_message ("atlas %d (%dx%d): %.2g%% old pixels, filled to %d, %d / %d", i, atlas->width, atlas->height, 100.0 * (double)atlas->old_pixels / (double)(atlas->width * atlas->height), atlas->x, atlas->y0, atlas->y); From 0a09b8dca70b0187a4ea2c22a08804162ca5b1a0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 22:21:05 +0000 Subject: [PATCH 06/11] gl: Improve cache dropping code There was a TODO here to avoid iterating the glyphs multiple times, so avoid that. And actually log the number of glyphs that was dropped. --- gsk/gl/gskglglyphcache.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c index ed0aeb479c..6e81b1b793 100644 --- a/gsk/gl/gskglglyphcache.c +++ b/gsk/gl/gskglglyphcache.c @@ -381,7 +381,7 @@ gsk_gl_glyph_cache_begin_frame (GskGLGlyphCache *self) GHashTableIter iter; GlyphCacheKey *key; GskGLCachedGlyph *value; - guint dropped = 0; + GHashTable *removed = g_hash_table_new (g_direct_hash, g_direct_equal); self->timestamp++; @@ -421,18 +421,29 @@ gsk_gl_glyph_cache_begin_frame (GskGLGlyphCache *self) atlas->image->texture_id = 0; } - /* Remove all glyphs that point to this atlas */ - g_hash_table_iter_init (&iter, self->hash_table); - while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value)) - { - if (value->atlas == atlas) - g_hash_table_iter_remove (&iter); - } - /* TODO: The above loop inside this other loop could be slow... */ + g_hash_table_add (removed, atlas); g_ptr_array_remove_index (self->atlases, i); - } + } } - GSK_RENDERER_NOTE(self->renderer, GLYPH_CACHE, g_message ("Dropped %d glyphs", dropped)); + if (g_hash_table_size (removed) > 0) + { + guint dropped = 0; + + /* Remove all glyphs whose atlas was removed */ + g_hash_table_iter_init (&iter, self->hash_table); + while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value)) + { + if (g_hash_table_contains (removed, value->atlas)) + { + g_hash_table_iter_remove (&iter); + dropped++; + } + } + + GSK_RENDERER_NOTE(self->renderer, GLYPH_CACHE, if (dropped > 0) g_message ("Dropped %d glyphs", dropped)); + } + + g_hash_table_unref (removed); } From 3059d76b4ced4dc7dd52d7d20d5406308d8923ca Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 22:22:17 +0000 Subject: [PATCH 07/11] Add code to dump out the glyph caches --- gsk/gl/gskglglyphcache.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c index 6e81b1b793..8f80ac6552 100644 --- a/gsk/gl/gskglglyphcache.c +++ b/gsk/gl/gskglglyphcache.c @@ -446,4 +446,20 @@ gsk_gl_glyph_cache_begin_frame (GskGLGlyphCache *self) } g_hash_table_unref (removed); + +#if 0 + for (i = 0; i < self->atlases->len; i++) + { + GskGLGlyphAtlas *atlas = g_ptr_array_index (self->atlases, i); + + if (atlas->image) + { + char *filename; + + filename = g_strdup_printf ("glyphatlas%d-%ld.png", i, self->timestamp); + gsk_gl_image_write_to_png (atlas->image, self->gl_driver, filename); + g_free (filename); + } + } +#endif } From e0803f039fe44ef3d09f1d701142800c071abea4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 20:55:34 +0000 Subject: [PATCH 08/11] gl: Fix glyph cache aging The logic here seems faulty. We want to keep a timestamp that tells us when the glyph was last used, so always update the timestamp. And whenever we use a glyph, it turns 'young' again, so remove it from the old pixels accounting. The (MAX_AGE, MAX_AGE+CHECK_INTERVAL) interval is only relevant to prevent us from turning a cached glyph old more than once, and that is already taken care of. --- gsk/gl/gskglglyphcache.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c index 8f80ac6552..eb2628fb86 100644 --- a/gsk/gl/gskglglyphcache.c +++ b/gsk/gl/gskglglyphcache.c @@ -308,15 +308,15 @@ gsk_gl_glyph_cache_lookup (GskGLGlyphCache *cache, { const guint age = cache->timestamp - value->timestamp; - if (MAX_AGE <= age && age < MAX_AGE + CHECK_INTERVAL) + if (MAX_AGE <= age) { GskGLGlyphAtlas *atlas = value->atlas; if (atlas) atlas->old_pixels -= value->draw_width * value->draw_height; - - value->timestamp = cache->timestamp; } + + value->timestamp = cache->timestamp; } if (create && value == NULL) From e0bf301d341196fb80dd0f0f5ef804fc7c95056c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 3 Jun 2019 00:40:43 +0000 Subject: [PATCH 09/11] gsk tests: Add an --output option This will be used to save artifacts in ci. --- testsuite/gsk/compare-render.c | 62 ++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/testsuite/gsk/compare-render.c b/testsuite/gsk/compare-render.c index b12f2459e3..d15416c88a 100644 --- a/testsuite/gsk/compare-render.c +++ b/testsuite/gsk/compare-render.c @@ -4,6 +4,46 @@ #include #include "reftest-compare.h" +static char *arg_output_dir = NULL; + +static const char * +get_output_dir (void) +{ + static const char *output_dir = NULL; + GError *error = NULL; + + if (output_dir) + return output_dir; + + if (arg_output_dir) + { + GFile *file = g_file_new_for_commandline_arg (arg_output_dir); + output_dir = g_file_get_path (file); + g_object_unref (file); + } + else + { + output_dir = g_get_tmp_dir (); + } + + if (!g_file_test (output_dir, G_FILE_TEST_EXISTS)) + { + GFile *file; + + file = g_file_new_for_path (output_dir); + if (!g_file_make_directory_with_parents (file, NULL, &error)) + { + g_error ("Failed to create output dir: %s", error->message); + g_error_free (error); + return NULL; + } + + g_object_unref (file); + } + + return output_dir; +} + char * file_replace_extension (const char *old_file, const char *old_ext, @@ -30,7 +70,7 @@ get_output_file (const char *file, char *result, *base; char *name; - dir = g_get_tmp_dir (); + dir = get_output_dir (); base = g_path_get_basename (file); name = file_replace_extension (base, orig_ext, new_ext); @@ -67,8 +107,14 @@ deserialize_error_func (const GtkCssSection *section, free (section_str); } +static const GOptionEntry options[] = { + { "output", 0, 0, G_OPTION_ARG_FILENAME, &arg_output_dir, + "Directory to save image files to", "DIR" }, + { NULL } +}; + /* - * Arguments: + * Non-option arguments: * 1) .node file to compare * 2) .png file to compare the rendered .node file to */ @@ -85,6 +131,18 @@ main (int argc, char **argv) const char *node_file; const char *png_file; gboolean success = TRUE; + GError *error = NULL; + GOptionContext *context; + + context = g_option_context_new ("- run GSK node tests"); + g_option_context_add_main_entries (context, options, NULL); + g_option_context_set_ignore_unknown_options (context, TRUE); + + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_error ("Option parsing failed: %s\n", error->message); + return 1; + } g_assert (argc == 3); From 3788e1dea74286948fa8fd92c18a9dc46d736978 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 3 Jun 2019 00:51:09 +0000 Subject: [PATCH 10/11] testsuite: Pass --output for gsk tests We want to keep the output from ci runs. So we now write the .out.png and .diff.png files to build/testsuite/gsk/compare/$RENDERER. --- testsuite/gsk/meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index a3563f11b4..fd3118af49 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -71,7 +71,8 @@ foreach renderer : renderers foreach test : compare_render_tests if (renderer[1] == '' or not test.contains(renderer[1])) test(renderer[0] + ' ' + test, compare_render, - args: [join_paths(meson.current_source_dir(), 'compare', test + '.node'), + args: ['--output', join_paths(meson.current_build_dir(), 'compare', renderer[0]), + join_paths(meson.current_source_dir(), 'compare', test + '.node'), join_paths(meson.current_source_dir(), 'compare', test + '.png')], env: [ 'GIO_USE_VOLUME_MONITOR=unix', 'GSETTINGS_BACKEND=memory', From 92994bac6c73b01cc4ba2ffa9eb88bad5c7ef334 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 3 Jun 2019 01:06:31 +0000 Subject: [PATCH 11/11] Save gsk output from ci --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5a17726696..cf08e699a7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,6 +28,7 @@ fedora-x86_64: - "${CI_PROJECT_DIR}/_build/report.xml" - "${CI_PROJECT_DIR}/_build/report.html" - "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*.png" + - "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*.png" cache: key: "$CI_JOB_NAME" <<: *cache-paths