]> source.dussan.org Git - tigervnc.git/commitdiff
Use XShmGetImage for large reads
authorPeter Åstrand (astrand) <astrand@cendio.se>
Mon, 15 Jan 2018 14:17:39 +0000 (15:17 +0100)
committerPeter Åstrand (astrand) <astrand@cendio.se>
Mon, 15 Jan 2018 14:17:39 +0000 (15:17 +0100)
XShmGetImage is much faster. On my machine, this reduces the CPU usage
of a fullscreen Youtube video playback from 40% to 25%.

unix/x0vncserver/Image.cxx

index ca3d6429455759437537bd0553af2e4975518903..f1a45933bd18294e8774eaf63b3579a01066808d 100644 (file)
@@ -315,8 +315,13 @@ void ShmImage::get(Window wnd, int x, int y)
 void ShmImage::get(Window wnd, int x, int y, int w, int h,
                    int dst_x, int dst_y)
 {
-  // FIXME: Use SHM for this as well?
-  XGetSubImage(dpy, wnd, x, y, w, h, AllPlanes, ZPixmap, xim, dst_x, dst_y);
+  // XShmGetImage is faster, but can only retrieve the entire
+  // window. Use it for large reads.
+  if (x == dst_x && y == dst_y && (long)w * h > (long)xim->width * xim->height / 4) {
+    XShmGetImage(dpy, wnd, xim, 0, 0, AllPlanes);
+  } else {
+    XGetSubImage(dpy, wnd, x, y, w, h, AllPlanes, ZPixmap, xim, dst_x, dst_y);
+  }
 }
 
 //