pepper: Now view list and damage is passed to the repaint function.
authorTaekyun Kim <tkq.kim@samsung.com>
Tue, 23 Jun 2015 06:20:37 +0000 (15:20 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Tue, 7 Jul 2015 06:56:51 +0000 (15:56 +0900)
Damage region and view list is required to do repaint. Now they are passed as
arguments in the repaint interface function.

Change-Id: Ib69a6322ad0e21bc273aa3f16eefee15ecb0720b

14 files changed:
drm/src/drm-output.c
fbdev/src/fbdev-output.c
pepper/src/compositor.c
pepper/src/output.c
pepper/src/pepper-internal.h
pepper/src/pepper.h
pepper/src/view.c
render/src/gl-renderer.c
render/src/pepper-render-internal.h
render/src/pepper-render.h
render/src/pixman-renderer.c
render/src/renderer.c
wayland/src/wayland-output.c
x11/src/x11-output.c

index 8b8b16d..e6c96be 100644 (file)
@@ -249,13 +249,13 @@ update_back_buffer(drm_output_t *output)
 }
 
 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);
 
index 934da45..66fa74f 100644 (file)
@@ -160,10 +160,10 @@ fbdev_output_set_mode(void *o, const pepper_output_mode_t *mode)
 }
 
 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
index 6c7750a..b58bedd 100644 (file)
@@ -102,8 +102,7 @@ pepper_compositor_create(const char *socket_name)
     }
 
     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;
 
index c4e942c..1029245 100644 (file)
@@ -167,11 +167,16 @@ pepper_output_repaint(pepper_output_t *output)
 {
     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 *
index 71e39ec..2077c7a 100644 (file)
@@ -91,11 +91,8 @@ struct pepper_compositor
     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
@@ -344,10 +341,14 @@ struct pepper_view
 
     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;
index 30a0662..52ef249 100644 (file)
@@ -96,7 +96,9 @@ struct pepper_output_interface
     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);
 };
 
index fd85b1a..5c981a7 100644 (file)
@@ -96,7 +96,9 @@ pepper_compositor_add_view(pepper_object_t *comp,
     else
         view->container_list = &compositor->root_view_list;
 
+    view->compositor_link.item = (void *)view;
     view_geometry_dirty(view);
+
     return &view->base;
 }
 
@@ -572,7 +574,7 @@ view_list_add(pepper_view_t *view)
 {
     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);
@@ -585,21 +587,23 @@ pepper_compositor_update_view_list(pepper_compositor_t *compositor)
     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. */
index 2894783..996d151 100644 (file)
@@ -488,7 +488,7 @@ gl_renderer_read_pixels(pepper_renderer_t *renderer,
 
 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;
 
index 43c30b4..b7cea1c 100644 (file)
@@ -33,7 +33,8 @@ struct pepper_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 */
index 1fd7019..8640784 100644 (file)
@@ -30,7 +30,8 @@ PEPPER_API pepper_bool_t
 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,
index 4e6d29b..d738322 100644 (file)
@@ -260,11 +260,11 @@ pixman_renderer_read_pixels(pepper_renderer_t *renderer,
 
 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),
index 0a74c21..7a0ad43 100644 (file)
@@ -42,16 +42,10 @@ pepper_renderer_flush_surface_damage(pepper_renderer_t *renderer, pepper_object_
 }
 
 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
index 2443bc3..7cb3942 100644 (file)
@@ -164,7 +164,7 @@ static const struct wl_callback_listener frame_listener =
 };
 
 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;
@@ -172,8 +172,7 @@ wayland_output_repaint(void *o)
     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);
index 4af6ee0..96959af 100644 (file)
@@ -444,12 +444,12 @@ x11_output_add_mode_change_listener(void *o, struct wl_listener *listener)
 }
 
 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)
     {