From 4555fc8a543caed15250a038e979bb24cee03a6c Mon Sep 17 00:00:00 2001 From: emersion Date: Mon, 26 Mar 2018 15:31:08 -0400 Subject: Fix damage tracking for rotated surfaces It was broken because the damage extents were rotated about its own center, not about the center of the surface. This adds a new wlr_region_rotated_bounds that rotates regions. This allows us to have only one code path (for both non-rotated views and rotated views) and optimizes rendering for rotated views. --- include/wlr/types/wlr_box.h | 2 +- include/wlr/util/region.h | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/wlr/types/wlr_box.h b/include/wlr/types/wlr_box.h index fc86f0ac..0e586a18 100644 --- a/include/wlr/types/wlr_box.h +++ b/include/wlr/types/wlr_box.h @@ -27,7 +27,7 @@ void wlr_box_transform(const struct wlr_box *box, struct wlr_box *dest); /** - * Creates the smallest box that contains a rotated box. + * Creates the smallest box that contains the box rotated about its center. */ void wlr_box_rotated_bounds(const struct wlr_box *box, float rotation, struct wlr_box *dest); diff --git a/include/wlr/util/region.h b/include/wlr/util/region.h index 7883af97..c0fe6063 100644 --- a/include/wlr/util/region.h +++ b/include/wlr/util/region.h @@ -26,4 +26,11 @@ void wlr_region_transform(pixman_region32_t *dst, pixman_region32_t *src, void wlr_region_expand(pixman_region32_t *dst, pixman_region32_t *src, int distance); +/* + * Builds the smallest possible region that contains the region rotated about + * the point (ox, oy). + */ +void wlr_region_rotated_bounds(pixman_region32_t *dst, pixman_region32_t *src, + float rotation, int ox, int oy); + #endif -- cgit v1.2.3 From 140bc1947623f2e3a89e3b22e18db4eba2ffce4d Mon Sep 17 00:00:00 2001 From: emersion Date: Mon, 26 Mar 2018 17:34:46 -0400 Subject: rootston: add -D flag to enable damage tracking debugging --- include/rootston/config.h | 2 ++ rootston/config.c | 9 +++++++-- rootston/output.c | 5 +++-- 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/rootston/config.h b/include/rootston/config.h index 9926d9c2..0a67ac1e 100644 --- a/include/rootston/config.h +++ b/include/rootston/config.h @@ -66,8 +66,10 @@ struct roots_config { struct wl_list bindings; struct wl_list keyboards; struct wl_list cursors; + char *config_path; char *startup_cmd; + bool debug_damage_tracking; }; /** diff --git a/rootston/config.c b/rootston/config.c index e63efc0b..0883f6d4 100644 --- a/rootston/config.c +++ b/rootston/config.c @@ -25,7 +25,9 @@ static void usage(const char *name, int ret) { " (default: rootston.ini).\n" " See `rootston.ini.example` for config\n" " file documentation.\n" - " -E Command that will be ran at startup.\n" , name); + " -E Command that will be ran at startup.\n" + " -D Enable damage tracking debugging.\n", + name); exit(ret); } @@ -394,7 +396,7 @@ struct roots_config *roots_config_create_from_args(int argc, char *argv[]) { wl_list_init(&config->bindings); int c; - while ((c = getopt(argc, argv, "C:E:h")) != -1) { + while ((c = getopt(argc, argv, "C:E:hD")) != -1) { switch (c) { case 'C': config->config_path = strdup(optarg); @@ -402,6 +404,9 @@ struct roots_config *roots_config_create_from_args(int argc, char *argv[]) { case 'E': config->startup_cmd = strdup(optarg); break; + case 'D': + config->debug_damage_tracking = true; + break; case 'h': case '?': usage(argv[0], c != 'h'); diff --git a/rootston/output.c b/rootston/output.c index c4e5cc7c..7de85ffb 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -486,8 +486,9 @@ static void render_output(struct roots_output *output) { goto renderer_end; } - // Uncomment this line to debug damage tracking - //wlr_renderer_clear(renderer, (float[]){1, 1, 0, 0}); + if (server->config->debug_damage_tracking) { + wlr_renderer_clear(renderer, (float[]){1, 1, 0, 0}); + } int nrects; pixman_box32_t *rects = pixman_region32_rectangles(&damage, &nrects); -- cgit v1.2.3