swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

commit 52313691e75738d7895c1c08ae2b97b80c93dd2a
parent eaa62c1dadbffae5a4c31760f804fa91a1b37f4c
Author: Michael Forney <mforney@mforney.org>
Date:   Sat, 22 Nov 2014 20:14:56 +0000

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

Diffstat:
Mlibswc/compositor.c | 25++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/libswc/compositor.c b/libswc/compositor.c @@ -169,7 +169,6 @@ static struct target * target_new(struct screen * screen) wl_list_insert(&target->view->handlers, &target->view_handler.link); target->current_buffer = NULL; target->mask = screen_mask(screen); - target_swap_buffers(target); target->screen_destroy_listener.notify = &handle_screen_destroy; wl_signal_add(&screen->destroy_signal, &target->screen_destroy_listener); @@ -663,7 +662,7 @@ static void update_screen(struct screen * screen) { struct target * target; const struct swc_rectangle * geometry = &screen->base.geometry; - pixman_region32_t damage; + pixman_region32_t damage, * total_damage; if (!(compositor.scheduled_updates & screen_mask(screen))) return; @@ -676,22 +675,22 @@ static void update_screen(struct screen * screen) geometry->x, geometry->y, geometry->width, geometry->height); pixman_region32_translate(&damage, -geometry->x, -geometry->y); - pixman_region32_union(&target->next_buffer->damage, - &target->next_buffer->damage, &damage); - pixman_region32_fini(&damage); + total_damage = wld_surface_damage(target->surface, &damage); /* Don't repaint the screen if it is waiting for a page flip. */ if (compositor.pending_flips & screen_mask(screen)) + { + pixman_region32_fini(&damage); return; + } - pixman_region32_t * total_damage, base_damage; - - total_damage = wld_surface_damage(target->surface, - &target->next_buffer->damage); - pixman_region32_translate(total_damage, geometry->x, geometry->y); + pixman_region32_t base_damage; + pixman_region32_copy(&damage, total_damage); + pixman_region32_translate(&damage, geometry->x, geometry->y); pixman_region32_init(&base_damage); - pixman_region32_subtract(&base_damage, total_damage, &compositor.opaque); - renderer_repaint(target, total_damage, &base_damage, &compositor.views); + pixman_region32_subtract(&base_damage, &damage, &compositor.opaque); + renderer_repaint(target, &damage, &base_damage, &compositor.views); + pixman_region32_fini(&damage); pixman_region32_fini(&base_damage); switch (target_swap_buffers(target)) @@ -864,6 +863,7 @@ bool swc_compositor_initialize() wl_list_for_each(screen, &swc.screens, link) target_new(screen); + schedule_updates(-1); swc_add_binding(SWC_BINDING_KEY, SWC_MOD_CTRL | SWC_MOD_ALT, XKB_KEY_BackSpace, &handle_terminate, NULL); @@ -876,7 +876,6 @@ bool swc_compositor_initialize() &handle_switch_vt, NULL); } - return true; }