pixman-renderer: Add repaint debugging feature
Add 'R' as a debug shortcut that highlights repainted regions.
This commit is contained in:
committed by
Kristian Høgsberg
parent
edc51c0f9c
commit
8792ef12b6
+52
-10
@@ -28,6 +28,8 @@
|
|||||||
|
|
||||||
#include "pixman-renderer.h"
|
#include "pixman-renderer.h"
|
||||||
|
|
||||||
|
#include <linux/input.h>
|
||||||
|
|
||||||
struct pixman_output_state {
|
struct pixman_output_state {
|
||||||
pixman_image_t *hw_buffer;
|
pixman_image_t *hw_buffer;
|
||||||
};
|
};
|
||||||
@@ -39,6 +41,8 @@ struct pixman_surface_state {
|
|||||||
|
|
||||||
struct pixman_renderer {
|
struct pixman_renderer {
|
||||||
struct weston_renderer base;
|
struct weston_renderer base;
|
||||||
|
int repaint_debug;
|
||||||
|
pixman_image_t *debug_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct pixman_output_state *
|
static inline struct pixman_output_state *
|
||||||
@@ -103,6 +107,8 @@ repaint_region(struct weston_surface *es, struct weston_output *output,
|
|||||||
pixman_region32_t *region, pixman_region32_t *surf_region,
|
pixman_region32_t *region, pixman_region32_t *surf_region,
|
||||||
pixman_op_t pixman_op)
|
pixman_op_t pixman_op)
|
||||||
{
|
{
|
||||||
|
struct pixman_renderer *pr =
|
||||||
|
(struct pixman_renderer *) output->compositor->renderer;
|
||||||
struct pixman_surface_state *ps = get_surface_state(es);
|
struct pixman_surface_state *ps = get_surface_state(es);
|
||||||
struct pixman_output_state *po = get_output_state(output);
|
struct pixman_output_state *po = get_output_state(output);
|
||||||
pixman_region32_t final_region;
|
pixman_region32_t final_region;
|
||||||
@@ -140,6 +146,19 @@ repaint_region(struct weston_surface *es, struct weston_output *output,
|
|||||||
rects[i].x1, rects[i].y1, /* dest_x, dest_y */
|
rects[i].x1, rects[i].y1, /* dest_x, dest_y */
|
||||||
rects[i].x2 - rects[i].x1, /* width */
|
rects[i].x2 - rects[i].x1, /* width */
|
||||||
rects[i].y2 - rects[i].y1 /* height */);
|
rects[i].y2 - rects[i].y1 /* height */);
|
||||||
|
|
||||||
|
if (!pr->repaint_debug)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pixman_image_composite32(PIXMAN_OP_OVER,
|
||||||
|
pr->debug_color, /* src */
|
||||||
|
NULL /* mask */,
|
||||||
|
po->hw_buffer, /* dest */
|
||||||
|
src_x, src_y, /* src_x, src_y */
|
||||||
|
0, 0, /* mask_x, mask_y */
|
||||||
|
rects[i].x1, rects[i].y1, /* dest_x, dest_y */
|
||||||
|
rects[i].x2 - rects[i].x1, /* width */
|
||||||
|
rects[i].y2 - rects[i].y1 /* height */);
|
||||||
}
|
}
|
||||||
pixman_region32_fini(&final_region);
|
pixman_region32_fini(&final_region);
|
||||||
}
|
}
|
||||||
@@ -319,25 +338,48 @@ pixman_renderer_destroy(struct weston_compositor *ec)
|
|||||||
ec->renderer = NULL;
|
ec->renderer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
debug_binding(struct wl_seat *seat, uint32_t time, uint32_t key,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
struct weston_compositor *ec = data;
|
||||||
|
struct pixman_renderer *pr = (struct pixman_renderer *) ec->renderer;
|
||||||
|
|
||||||
|
pr->repaint_debug ^= 1;
|
||||||
|
|
||||||
|
if (pr->repaint_debug) {
|
||||||
|
pixman_color_t red = {
|
||||||
|
0x3fff, 0x0000, 0x0000, 0x3fff
|
||||||
|
};
|
||||||
|
|
||||||
|
pr->debug_color = pixman_image_create_solid_fill(&red);
|
||||||
|
} else {
|
||||||
|
pixman_image_unref(pr->debug_color);
|
||||||
|
weston_compositor_damage_all(ec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WL_EXPORT int
|
WL_EXPORT int
|
||||||
pixman_renderer_init(struct weston_compositor *ec)
|
pixman_renderer_init(struct weston_compositor *ec)
|
||||||
{
|
{
|
||||||
struct weston_renderer *renderer;
|
struct pixman_renderer *renderer;
|
||||||
|
|
||||||
renderer = malloc(sizeof *renderer);
|
renderer = malloc(sizeof *renderer);
|
||||||
if (renderer == NULL)
|
if (renderer == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
renderer->read_pixels = pixman_renderer_read_pixels;
|
renderer->base.read_pixels = pixman_renderer_read_pixels;
|
||||||
renderer->repaint_output = pixman_renderer_repaint_output;
|
renderer->base.repaint_output = pixman_renderer_repaint_output;
|
||||||
renderer->flush_damage = pixman_renderer_flush_damage;
|
renderer->base.flush_damage = pixman_renderer_flush_damage;
|
||||||
renderer->attach = pixman_renderer_attach;
|
renderer->base.attach = pixman_renderer_attach;
|
||||||
renderer->create_surface = pixman_renderer_create_surface;
|
renderer->base.create_surface = pixman_renderer_create_surface;
|
||||||
renderer->surface_set_color = pixman_renderer_surface_set_color;
|
renderer->base.surface_set_color = pixman_renderer_surface_set_color;
|
||||||
renderer->destroy_surface = pixman_renderer_destroy_surface;
|
renderer->base.destroy_surface = pixman_renderer_destroy_surface;
|
||||||
renderer->destroy = pixman_renderer_destroy;
|
renderer->base.destroy = pixman_renderer_destroy;
|
||||||
ec->renderer = renderer;
|
ec->renderer = &renderer->base;
|
||||||
|
|
||||||
|
weston_compositor_add_debug_binding(ec, KEY_R,
|
||||||
|
debug_binding, ec);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user