[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