[PATCH weston 11/11] simple-damage: Add --use-buffer-damage flag

Derek Foreman derekf at osg.samsung.com
Thu Nov 19 09:18:17 PST 2015


On 18/11/15 07:24 PM, Bill Spitzak wrote:
> As this code is going to be referred to by people trying to figure out
> wayland, it might be best to use this by default. Fall back to the old
> damage request only if the api is too old or if a special switch is passed.

I agree, but I'll wait for additional comments before I make the change
in case others don't.  Especially since it makes version negotiation a
little more complicated and I'm lazy. ;)

Thanks,
Derek

> 
> On Wed, Nov 18, 2015 at 2:32 PM, Derek Foreman <derekf at osg.samsung.com
> <mailto:derekf at osg.samsung.com>> wrote:
> 
>     Add a new flag for testing damage in buffer co-ordinates
> 
>     Signed-off-by: Derek Foreman <derekf at osg.samsung.com
>     <mailto:derekf at osg.samsung.com>>
>     ---
>      clients/simple-damage.c | 62
>     +++++++++++++++++++++++++++++++++++++------------
>      1 file changed, 47 insertions(+), 15 deletions(-)
> 
>     diff --git a/clients/simple-damage.c b/clients/simple-damage.c
>     index 0551b9d..8929071 100644
>     --- a/clients/simple-damage.c
>     +++ b/clients/simple-damage.c
>     @@ -64,6 +64,7 @@ struct buffer {
>      enum window_flags {
>             WINDOW_FLAG_USE_VIEWPORT = 0x1,
>             WINDOW_FLAG_ROTATING_TRANSFORM = 0x2,
>     +       WINDOW_FLAG_USE_DAMAGE_BUFFER = 0x4,
>      };
> 
>      struct window {
>     @@ -261,6 +262,14 @@ create_window(struct display *display, int
>     width, int height,
>                     exit(1);
>             }
> 
>     +       if (display->compositor_version < 4 &&
>     +           (flags & WINDOW_FLAG_USE_DAMAGE_BUFFER)) {
>     +               fprintf(stderr, "wl_surface.damage_buffer
>     unsupported in "
>     +                               "wl_surface version %d\n",
>     +                       display->compositor_version);
>     +               exit(1);
>     +       }
>     +
>             window = calloc(1, sizeof *window);
>             if (!window)
>                     return NULL;
>     @@ -303,8 +312,12 @@ create_window(struct display *display, int
>     width, int height,
>             }
> 
>             /* Initialise damage to full surface, so the padding gets
>     painted */
>     -       wl_surface_damage(window->surface, 0, 0, INT32_MAX, INT32_MAX);
>     -
>     +       if (window->flags & WINDOW_FLAG_USE_DAMAGE_BUFFER) {
>     +               wl_surface_damage_buffer(window->surface, 0, 0,
>     +                                        INT32_MAX, INT32_MAX);
>     +       } else {
>     +               wl_surface_damage(window->surface, 0, 0, INT32_MAX,
>     INT32_MAX);
>     +       }
>             return window;
>      }
> 
>     @@ -567,12 +580,20 @@ redraw(void *data, struct wl_callback
>     *callback, uint32_t time)
>                       bwidth - 2 * bborder, bheight - 2 * bborder,
>     0x80000000);
> 
>             /* Damage where the ball was */
>     -       wl_surface_damage(window->surface,
>     -                         window->ball.x - window->ball.radius,
>     -                         window->ball.y - window->ball.radius,
>     -                         window->ball.radius * 2 + 1,
>     -                         window->ball.radius * 2 + 1);
>     -
>     +       if (window->flags & WINDOW_FLAG_USE_DAMAGE_BUFFER) {
>     +               window_get_transformed_ball(window, &bx, &by);
>     +               wl_surface_damage_buffer(window->surface,
>     +                                        bx - bradius + off_x,
>     +                                        by - bradius + off_y,
>     +                                        bradius * 2 + 1,
>     +                                        bradius * 2 + 1);
>     +       } else {
>     +               wl_surface_damage(window->surface,
>     +                                 window->ball.x - window->ball.radius,
>     +                                 window->ball.y - window->ball.radius,
>     +                                 window->ball.radius * 2 + 1,
>     +                                 window->ball.radius * 2 + 1);
>     +       }
>             window_advance_game(window, time);
> 
>             window_get_transformed_ball(window, &bx, &by);
>     @@ -595,12 +616,19 @@ redraw(void *data, struct wl_callback
>     *callback, uint32_t time)
>             }
> 
>             /* Damage where the ball is now */
>     -       wl_surface_damage(window->surface,
>     -                         window->ball.x - window->ball.radius,
>     -                         window->ball.y - window->ball.radius,
>     -                         window->ball.radius * 2 + 1,
>     -                         window->ball.radius * 2 + 1);
>     -
>     +       if (window->flags & WINDOW_FLAG_USE_DAMAGE_BUFFER) {
>     +               wl_surface_damage_buffer(window->surface,
>     +                                        bx - bradius + off_x,
>     +                                        by - bradius + off_y,
>     +                                        bradius * 2 + 1,
>     +                                        bradius * 2 + 1);
>     +       } else {
>     +               wl_surface_damage(window->surface,
>     +                                 window->ball.x - window->ball.radius,
>     +                                 window->ball.y - window->ball.radius,
>     +                                 window->ball.radius * 2 + 1,
>     +                                 window->ball.radius * 2 + 1);
>     +       }
>             wl_surface_attach(window->surface, buffer->buffer, 0, 0);
> 
>             if (window->display->compositor_version >= 2 &&
>     @@ -787,6 +815,7 @@ print_usage(int retval)
>                     "  --transform=TRANSFORM\tTransform for the surface\n"
>                     "  --rotating-transform\tUse a different
>     buffer_transform for each frame\n"
>                     "  --use-viewport\tUse wl_viewport\n"
>     +               "  --use-damage-buffer\tUse damage_buffer to post
>     damage\n"
>             );
> 
>             exit(retval);
>     @@ -837,7 +866,7 @@ main(int argc, char **argv)
>                         strcmp(argv[i], "-h") == 0) {
>                             print_usage(0);
>                     } else if (sscanf(argv[i], "--version=%d", &version)
>     > 0) {
>     -                       if (version < 1 || version > 3) {
>     +                       if (version < 1 || version > 4) {
>                                     fprintf(stderr, "Unsupported
>     wl_surface version: %d\n",
>                                             version);
>                                     return 1;
>     @@ -861,6 +890,9 @@ main(int argc, char **argv)
>                     } else if (strcmp(argv[i], "--use-viewport") == 0) {
>                             flags |= WINDOW_FLAG_USE_VIEWPORT;
>                             continue;
>     +               } else if (strcmp(argv[i], "--use-damage-buffer") ==
>     0) {
>     +                       flags |= WINDOW_FLAG_USE_DAMAGE_BUFFER;
>     +                       continue;
>                     } else {
>                             printf("Invalid option: %s\n", argv[i]);
>                             print_usage(255);
>     --
>     2.6.2
> 
>     _______________________________________________
>     wayland-devel mailing list
>     wayland-devel at lists.freedesktop.org
>     <mailto:wayland-devel at lists.freedesktop.org>
>     http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 
> 
> 
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 



More information about the wayland-devel mailing list