}
static void
-drm_output_repaint(void *o)
+drm_output_repaint(void *o, const pepper_list_t *view_list, const pixman_region32_t *damage)
{
int ret;
drm_output_t *output = (drm_output_t *)o;
pepper_renderer_set_target(output->renderer, output->render_target);
- pepper_renderer_repaint_output(output->renderer, output->base);
+ pepper_renderer_repaint_output(output->renderer, output->base, view_list, damage);
update_back_buffer(output);
}
static void
-fbdev_output_repaint(void *o)
+fbdev_output_repaint(void *o, const pepper_list_t *view_list, const pixman_region32_t *damage)
{
fbdev_output_t *output = (fbdev_output_t *)o;
- pepper_renderer_repaint_output(output->renderer, output->base);
+ pepper_renderer_repaint_output(output->renderer, output->base, view_list, damage);
}
static void
}
wl_list_init(&compositor->layers);
- wl_list_init(&compositor->view_list);
- pixman_region32_init(&compositor->damage_region);
+ pepper_list_init(&compositor->view_list);
return &compositor->base;
{
PEPPER_ASSERT(!output->frame.pending);
- output->interface->repaint(output->data);
+ pepper_compositor_update_view_list(output->compositor);
+
+ output->interface->repaint(output->data, &output->compositor->view_list, &output->damage_region);
output->frame.pending = PEPPER_TRUE;
output->frame.scheduled = PEPPER_FALSE;
/* TODO: Send frame done to the callback objects of this output. */
+
+ /* Output has been repainted, so damage region is totally consumed. */
+ pixman_region32_clear(&output->damage_region);
}
PEPPER_API pepper_object_t *
struct wl_list layers;
struct wl_list output_list;
struct wl_list root_view_list;
-
struct wl_list event_hook_chain;
-
- struct wl_list view_list;
- pixman_region32_t damage_region;
+ pepper_list_t view_list;
};
struct pepper_output
pixman_region32_t opaque_region;
pixman_region32_t visible_region;
- struct wl_list view_list_link;
pepper_bool_t need_damage;
+
+ pepper_list_t compositor_link;
};
+void
+pepper_compositor_update_view_list(pepper_compositor_t *compositor);
+
struct pepper_layer
{
pepper_object_t base;
void (*get_mode)(void *output, int index, pepper_output_mode_t *mode);
pepper_bool_t (*set_mode)(void *output, const pepper_output_mode_t *mode);
- void (*repaint)(void *output);
+ void (*repaint)(void *output,
+ const pepper_list_t *view_list, const pixman_region32_t *damage);
+
void (*add_frame_listener)(void *output, struct wl_listener *listener);
};
else
view->container_list = &compositor->root_view_list;
+ view->compositor_link.item = (void *)view;
view_geometry_dirty(view);
+
return &view->base;
}
{
pepper_view_t *child;
- wl_list_insert(&view->compositor->view_list, &view->view_list_link);
+ pepper_list_insert(&view->compositor->view_list, &view->compositor_link);
wl_list_for_each(child, &view->child_list, parent_link)
view_list_add(child);
pixman_region32_t visible;
pixman_region32_t opaque;
pixman_region32_t surface_damage;
+ pepper_list_t *l;
pixman_region32_init(&visible);
pixman_region32_init(&opaque);
pixman_region32_init(&surface_damage);
/* Make compositor's view list empty. */
- wl_list_init(&compositor->view_list);
+ pepper_list_init(&compositor->view_list);
/* Build z-ordered view list by traversing the view tree in depth-first order. */
wl_list_for_each(view, &compositor->root_view_list, parent_link)
view_list_add(view);
/* Update views from front to back. */
- wl_list_for_each_reverse(view, &compositor->view_list, view_list_link)
+ PEPPER_LIST_FOR_EACH_REVERSE(&compositor->view_list, l)
{
+ view = l->item;
view_update_geometry(view);
/* Update visible region. */
static void
gl_renderer_repaint_output(pepper_renderer_t *renderer, pepper_object_t *out,
- const pixman_region32_t *output_damage)
+ const pepper_list_t *list, const pixman_region32_t *damage)
{
gl_renderer_t *gr = (gl_renderer_t *)renderer;
void (*repaint_output)(pepper_renderer_t *renderer,
pepper_object_t *output,
- const pixman_region32_t *output_damage);
+ const pepper_list_t *view_list,
+ const pixman_region32_t *damage);
};
#endif /* PEPPER_RENDER_INTERNAL_H */
pepper_renderer_flush_surface_damage(pepper_renderer_t *renderer, pepper_object_t *surface);
PEPPER_API void
-pepper_renderer_repaint_output(pepper_renderer_t *renderer, pepper_object_t *output);
+pepper_renderer_repaint_output(pepper_renderer_t *renderer, pepper_object_t *output,
+ const pepper_list_t *view_list, const pixman_region32_t *damage);
PEPPER_API pepper_bool_t
pepper_renderer_read_pixels(pepper_renderer_t *renderer, int x, int y, int w, int h,
static void
pixman_renderer_repaint_output(pepper_renderer_t *renderer, pepper_object_t *output,
- const pixman_region32_t *output_damage)
+ const pepper_list_t *view_list, const pixman_region32_t *damage)
{
pixman_image_t *dst = ((pixman_render_target_t *)renderer->target)->image;
- if (dst && pixman_region32_not_empty((pixman_region32_t*)output_damage))
+ if (dst && pixman_region32_not_empty((pixman_region32_t*)damage))
{
pixman_fill(pixman_image_get_data(dst),
pixman_image_get_stride(dst) / sizeof(uint32_t),
}
PEPPER_API void
-pepper_renderer_repaint_output(pepper_renderer_t *renderer, pepper_object_t *output)
+pepper_renderer_repaint_output(pepper_renderer_t *renderer, pepper_object_t *output,
+ const pepper_list_t *view_list, const pixman_region32_t *damage)
{
- /* FIXME */
- /* add output_damage parameter at pepper_renderer_repaint_ouput() later */
- pixman_region32_t output_damage;
- pixman_region32_init(&output_damage);
-
- renderer->repaint_output(renderer, output, &output_damage);
-
- pixman_region32_fini(&output_damage);
+ renderer->repaint_output(renderer, output, view_list, damage);
}
PEPPER_API pepper_bool_t
};
static void
-wayland_output_repaint(void *o)
+wayland_output_repaint(void *o, const pepper_list_t *view_list, const pixman_region32_t *damage)
{
wayland_output_t *output = o;
struct wl_callback *callback;
if (output->render_pre)
output->render_pre(output);
- /* TODO: Pass rendering data to the renderer. maybe view list? or scene graph data? */
- pepper_renderer_repaint_output(output->renderer, output->base);
+ pepper_renderer_repaint_output(output->renderer, output->base, view_list, damage);
if (output->render_post)
output->render_post(output);
}
static void
-x11_output_repaint(void *o)
+x11_output_repaint(void *o, const pepper_list_t *view_list, const pixman_region32_t *damage)
{
x11_output_t *output = o;
pepper_renderer_set_target(output->renderer, output->target);
- pepper_renderer_repaint_output(output->renderer, output->base);
+ pepper_renderer_repaint_output(output->renderer, output->base, view_list, damage);
if (output->renderer == output->connection->pixman_renderer)
{