We've been setting it every time a client does something that can change the viewport (as opposed to something that does change the viewport).
However, as an example, a client could be calling set_buffer_scale() with the same value every commit. This would lead us to performing operations only required when the viewport changes when it didn't actually change at all. Signed-off-by: Derek Foreman <der...@osg.samsung.com> --- src/compositor.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/compositor.c b/src/compositor.c index 8bf55dc..33d500e 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -2861,6 +2861,10 @@ surface_set_buffer_transform(struct wl_client *client, return; } + if (surface->pending.buffer_viewport.buffer.transform == + (unsigned int)transform) + return; + surface->pending.buffer_viewport.buffer.transform = transform; surface->pending.buffer_viewport.changed = 1; } @@ -2880,6 +2884,9 @@ surface_set_buffer_scale(struct wl_client *client, return; } + if (surface->pending.buffer_viewport.buffer.scale == scale) + return; + surface->pending.buffer_viewport.buffer.scale = scale; surface->pending.buffer_viewport.changed = 1; } @@ -4221,6 +4228,14 @@ viewport_set(struct wl_client *client, return; } + if (surface->pending.buffer_viewport.buffer.src_x == src_x && + surface->pending.buffer_viewport.buffer.src_y == src_y && + surface->pending.buffer_viewport.buffer.src_width == src_width && + surface->pending.buffer_viewport.buffer.src_height == src_height && + surface->pending.buffer_viewport.surface.width == dst_width && + surface->pending.buffer_viewport.surface.height == dst_height) + return; + surface->pending.buffer_viewport.buffer.src_x = src_x; surface->pending.buffer_viewport.buffer.src_y = src_y; surface->pending.buffer_viewport.buffer.src_width = src_width; @@ -4261,6 +4276,12 @@ viewport_set_source(struct wl_client *client, return; } + if (surface->pending.buffer_viewport.buffer.src_x == src_x && + surface->pending.buffer_viewport.buffer.src_y == src_y && + surface->pending.buffer_viewport.buffer.src_width == src_width && + surface->pending.buffer_viewport.buffer.src_height == src_height) + return; + surface->pending.buffer_viewport.buffer.src_x = src_x; surface->pending.buffer_viewport.buffer.src_y = src_y; surface->pending.buffer_viewport.buffer.src_width = src_width; @@ -4294,6 +4315,10 @@ viewport_set_destination(struct wl_client *client, return; } + if (surface->pending.buffer_viewport.surface.width == dst_width && + surface->pending.buffer_viewport.surface.height == dst_height) + return; + surface->pending.buffer_viewport.surface.width = dst_width; surface->pending.buffer_viewport.surface.height = dst_height; surface->pending.buffer_viewport.changed = 1; -- 2.6.2 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel