fbdev: rendering to shadow image
authorJunghoon <jh13.son@samsung.com>
Wed, 24 Jun 2015 07:25:26 +0000 (16:25 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Tue, 7 Jul 2015 06:56:51 +0000 (15:56 +0900)
Change-Id: Ief61664faead1304fda0db79c5d204e59c073710

fbdev/src/fbdev-internal.h
fbdev/src/fbdev-output.c
samples/src/fbdev-backend.c

index c4e1707..f49a33b 100644 (file)
@@ -44,7 +44,11 @@ struct fbdev_output
     int                         w, h;
     int                         bpp;
     int                         stride;
-    void                       *pixels;
+
+    void                       *frame_buffer_pixels;
+    pixman_image_t             *frame_buffer_image;
+    pixman_image_t             *shadow_image;
+    pepper_bool_t               use_shadow;
 
     struct wl_signal            destroy_signal;
     struct wl_signal            mode_change_signal;
index 66fa74f..837b05b 100644 (file)
@@ -94,8 +94,14 @@ fbdev_output_destroy(void *o)
     if (output->render_target)
         pepper_render_target_destroy(output->render_target);
 
-    if (output->pixels)
-        munmap(output->pixels, output->w * output->stride);
+    if (output->shadow_image)
+        pixman_image_unref(output->shadow_image);
+
+    if (output->frame_buffer_image)
+        pixman_image_unref(output->frame_buffer_image);
+
+    if (output->frame_buffer_pixels)
+        munmap(output->frame_buffer_pixels, output->w * output->stride);
 
     free(output);
 }
@@ -164,6 +170,12 @@ fbdev_output_repaint(void *o, const pepper_list_t *view_list, const pixman_regio
 {
     fbdev_output_t *output = (fbdev_output_t *)o;
     pepper_renderer_repaint_output(output->renderer, output->base, view_list, damage);
+
+    /* FIXME: composite with damage? */
+    if (output->use_shadow)
+        pixman_image_composite32(PIXMAN_OP_SRC, output->shadow_image, NULL,
+                                 output->frame_buffer_image, 0, 0, 0, 0, 0, 0,
+                                 output->w, output->h);
 }
 
 static void
@@ -199,8 +211,13 @@ init_pixman_renderer(fbdev_output_t *output)
     if (!output->fbdev->pixman_renderer)
         return PEPPER_FALSE;
 
-    target = pepper_pixman_renderer_create_target(output->format, output->pixels, output->stride,
-                                                  output->w, output->h);
+    if (output->use_shadow)
+        target = pepper_pixman_renderer_create_target(output->format, NULL,
+                                                      output->stride, output->w, output->h);
+    else
+        target = pepper_pixman_renderer_create_target(output->format, output->frame_buffer_pixels,
+                                                      output->stride, output->w, output->h);
+
     if (!target)
         return PEPPER_FALSE;
 
@@ -274,8 +291,9 @@ pepper_fbdev_output_create(pepper_fbdev_t *fbdev, const char *renderer)
     wl_signal_init(&output->mode_change_signal);
     wl_signal_init(&output->frame_signal);
 
-    output->pixels = mmap(NULL, output->h * output->stride, PROT_WRITE, MAP_SHARED, fd, 0);
-    if (!output->pixels)
+    output->frame_buffer_pixels = mmap(NULL, output->h * output->stride,
+                                       PROT_WRITE, MAP_SHARED, fd, 0);
+    if (!output->frame_buffer_pixels)
     {
         PEPPER_ERROR("mmap failed.\n");
         goto error;
@@ -283,7 +301,32 @@ pepper_fbdev_output_create(pepper_fbdev_t *fbdev, const char *renderer)
 
     close(fd);
 
-    if (!init_renderer(output, renderer))
+    /* TODO: read & set output->use_shadow value from somewhere */
+    output->use_shadow = PEPPER_TRUE;
+    if (output->use_shadow)
+    {
+        pixman_format_code_t pixman_format = get_pixman_format(output->format);
+
+        output->frame_buffer_image = pixman_image_create_bits(pixman_format,
+                                                              output->w, output->h,
+                                                              output->frame_buffer_pixels,
+                                                              output->stride);
+        if (!output->frame_buffer_image)
+        {
+            PEPPER_ERROR("Failed to create pixman image in %s: pixels_image\n", __FUNCTION__);
+            goto error;
+        }
+
+        output->shadow_image = pixman_image_create_bits(pixman_format, output->w, output->h,
+                                                        NULL, output->stride);
+        if (!output->shadow_image)
+        {
+            PEPPER_ERROR("Failed to create pixman image in %s: shadow_image\n", __FUNCTION__);
+            goto error;
+        }
+    }
+
+     if (!init_renderer(output, renderer))
     {
         PEPPER_ERROR("Failed to initialize renderer in %s\n", __FUNCTION__);
         goto error;
index 6b0480d..499462e 100644 (file)
@@ -38,29 +38,40 @@ main(int argc, char **argv)
     }
 
     if (!pepper_virtual_terminal_setup(0/*FIXME*/))
-        PEPPER_ASSERT(0);
+        goto cleanup;
 
     compositor = pepper_compositor_create("wayland-0");
-    PEPPER_ASSERT(compositor);
+    if (!compositor)
+        goto cleanup;
 
     fbdev = pepper_fbdev_create(compositor, "", "pixman");
-    PEPPER_ASSERT(fbdev);
+    if (!fbdev)
+        goto cleanup;
 
     if (!pepper_desktop_shell_init(compositor))
-        PEPPER_ASSERT(0);
+        goto cleanup;
 
     display = pepper_compositor_get_display(compositor);
-    PEPPER_ASSERT(display);
+    if (!display)
+        goto cleanup;
 
     loop = wl_display_get_event_loop(display);
     sigint = wl_event_loop_add_signal(loop, SIGINT, handle_sigint, display);
-    PEPPER_ASSERT(sigint);
+    if (!sigint)
+        goto cleanup;
 
     wl_display_run(display);
 
-    wl_event_source_remove(sigint);
-    pepper_fbdev_destroy(fbdev);
-    pepper_compositor_destroy(compositor);
+cleanup:
+
+    if (sigint)
+        wl_event_source_remove(sigint);
+
+    if (fbdev)
+        pepper_fbdev_destroy(fbdev);
+
+    if (compositor)
+        pepper_compositor_destroy(compositor);
 
     pepper_virtual_terminal_restore();