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