[PATCH xserver 3/3] glamor: Scissor Render composite operations to the bounds of the drawing.

Eric Anholt eric at anholt.net
Tue Aug 1 20:59:15 UTC 2017


Unlike the previous two fixes, this one introduces new GL calls and
statechanges of the scissor.  However, given that our Render drawing
already does CPU side transformation and inefficient box upload, this
shouldn't be a limiting factor for Render acceleration.

Surprisingly, it improves x11perf -comppixwin10 -repeat 1 -reps 10000
on i965 by 3.21191% +/- 1.79977% (n=50).

Signed-off-by: Eric Anholt <eric at anholt.net>
---
 glamor/glamor_render.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 52f073d0578b..413c4a7f8e8a 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -1198,6 +1198,29 @@ glamor_composite_with_shader(CARD8 op,
 
     nrect_max = MIN(nrect, GLAMOR_COMPOSITE_VBO_VERT_CNT / 4);
 
+    if (nrect < 100) {
+        BoxRec bounds = glamor_start_rendering_bounds();
+
+        for (int i = 0; i < nrect; i++) {
+            BoxRec box = {
+                .x1 = rects[i].x_dst,
+                .y1 = rects[i].y_dst,
+                .x2 = rects[i].x_dst + rects[i].width,
+                .y2 = rects[i].y_dst + rects[i].height,
+            };
+            glamor_bounds_union_box(&bounds, &box);
+        }
+
+        if (bounds.x1 >= bounds.x2 || bounds.y1 >= bounds.y2)
+            goto disable;
+
+        glEnable(GL_SCISSOR_TEST);
+        glScissor(bounds.x1 + dest_x_off,
+                  bounds.y1 + dest_y_off,
+                  bounds.x2 - bounds.x1,
+                  bounds.y2 - bounds.y1);
+    }
+
     while (nrect) {
         int mrect, rect_processed;
         int vb_stride;
@@ -1279,6 +1302,8 @@ glamor_composite_with_shader(CARD8 op,
         }
     }
 
+disable:
+    glDisable(GL_SCISSOR_TEST);
     glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
     glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
     glDisableVertexAttribArray(GLAMOR_VERTEX_MASK);
-- 
2.13.3



More information about the xorg-devel mailing list