commit 5231369
Michael Forney
·
2014-11-22 20:14:56 +0000 UTC
parent eaa62c1
Schedule a repaint upon compositor initialization Though intel seems to zero buffers upon creation, other GPUs don't, causing garbage before the first frame is drawn. Now, since next_buffer may uninitialized when we are repainting (for the first frame), don't use its damage region to accumulate the screen's damage. Fixes #17
1 files changed,
+12,
-13
+12,
-13
1@@ -169,7 +169,6 @@ static struct target * target_new(struct screen * screen)
2 wl_list_insert(&target->view->handlers, &target->view_handler.link);
3 target->current_buffer = NULL;
4 target->mask = screen_mask(screen);
5- target_swap_buffers(target);
6
7 target->screen_destroy_listener.notify = &handle_screen_destroy;
8 wl_signal_add(&screen->destroy_signal, &target->screen_destroy_listener);
9@@ -663,7 +662,7 @@ static void update_screen(struct screen * screen)
10 {
11 struct target * target;
12 const struct swc_rectangle * geometry = &screen->base.geometry;
13- pixman_region32_t damage;
14+ pixman_region32_t damage, * total_damage;
15
16 if (!(compositor.scheduled_updates & screen_mask(screen)))
17 return;
18@@ -676,22 +675,22 @@ static void update_screen(struct screen * screen)
19 geometry->x, geometry->y,
20 geometry->width, geometry->height);
21 pixman_region32_translate(&damage, -geometry->x, -geometry->y);
22- pixman_region32_union(&target->next_buffer->damage,
23- &target->next_buffer->damage, &damage);
24- pixman_region32_fini(&damage);
25+ total_damage = wld_surface_damage(target->surface, &damage);
26
27 /* Don't repaint the screen if it is waiting for a page flip. */
28 if (compositor.pending_flips & screen_mask(screen))
29+ {
30+ pixman_region32_fini(&damage);
31 return;
32+ }
33
34- pixman_region32_t * total_damage, base_damage;
35-
36- total_damage = wld_surface_damage(target->surface,
37- &target->next_buffer->damage);
38- pixman_region32_translate(total_damage, geometry->x, geometry->y);
39+ pixman_region32_t base_damage;
40+ pixman_region32_copy(&damage, total_damage);
41+ pixman_region32_translate(&damage, geometry->x, geometry->y);
42 pixman_region32_init(&base_damage);
43- pixman_region32_subtract(&base_damage, total_damage, &compositor.opaque);
44- renderer_repaint(target, total_damage, &base_damage, &compositor.views);
45+ pixman_region32_subtract(&base_damage, &damage, &compositor.opaque);
46+ renderer_repaint(target, &damage, &base_damage, &compositor.views);
47+ pixman_region32_fini(&damage);
48 pixman_region32_fini(&base_damage);
49
50 switch (target_swap_buffers(target))
51@@ -864,6 +863,7 @@ bool swc_compositor_initialize()
52
53 wl_list_for_each(screen, &swc.screens, link)
54 target_new(screen);
55+ schedule_updates(-1);
56
57 swc_add_binding(SWC_BINDING_KEY, SWC_MOD_CTRL | SWC_MOD_ALT,
58 XKB_KEY_BackSpace, &handle_terminate, NULL);
59@@ -876,7 +876,6 @@ bool swc_compositor_initialize()
60 &handle_switch_vt, NULL);
61 }
62
63-
64 return true;
65 }
66