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

Reply via email to