I've noticed that vertical scrolling with Firefox and many other applications are quite slow, especially when you have a limited bandwidth. The reason for this is that Xvnc fails to detect the framebuffer update as a copy, which can be sent as a CopyRect RFB operation. Instead, the entire screen is resent.

The code in question is here (function vncHooksCopyArea):
http://tigervnc.svn.sourceforge.net/viewvc/tigervnc/trunk/unix/xserver/hw/vnc/vncHooks.cc?view=markup

We have:

REGION_INTERSECT(pScreen, src.reg, src.reg, &((WindowPtr)pSrc)->clipList);

However, when scrolling in Firefox, the clipList region have x1 == x2 and y1 == y2. (We have a data pointer, but size and numRects are zero.) The intersection result is empty, and no CopyRects are sent. The problem can be solved with this patch:

-    REGION_INTERSECT(pScreen, src.reg, src.reg, &((WindowPtr)pSrc)->clipList);
+    if (REGION_NOTEMPTY(pScreen, &((WindowPtr)pSrc)->clipList)) {
+       REGION_INTERSECT(pScreen, src.reg, src.reg, 
&((WindowPtr)pSrc)->clipList);
+    }


But why is clipList so strange? I've tracked it down to pixman_set_extents:

    if (!region->data)
        return;

    if (!region->data->size)
    {
        region->extents.x2 = region->extents.x1;
        region->extents.y2 = region->extents.y1;
        return;
    }

This code is called every now and then. (In our case, it seems to be an INTERSECT call which calls pixman_set_extents.) Apparently, the idea seems to be that if the region has a data pointer, then it must have a size as well, or it should be considered empty/NIL. Then, the question is, what on earth is setting clipList to such a broken region? It cannot be miRegionEmpty/REGION_EMPTY because those are directly setting x1 == x2 and y1 == y2.


Using pixman 0.20.0 and xorg-server 1.5.3. However, the problem seems to be present even with the Fedora 14 version of Xvnc, which uses more modern versions. Comments appreciated...

Rgds, ---
Peter Åstrand           ThinLinc Chief Developer
Cendio AB               http://www.cendio.com
Wallenbergs gata 4
583 30 Linköping        Phone: +46-13-21 46 00
------------------------------------------------------------------------------
The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE:
Pinpoint memory and threading errors before they happen.
Find and fix more than 250 security defects in the development cycle.
Locate bottlenecks in serial and parallel code that limit performance.
http://p.sf.net/sfu/intel-dev2devfeb
_______________________________________________
Tigervnc-devel mailing list
Tigervnc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-devel

Reply via email to