ref: 9dc9c6c5ef8bba195778f7701142af602e457665
parent: bf6ba56817e6bb083d5c411b1660f696144d5ac6
author: cinap_lenrek <[email protected]>
date: Tue Mar 8 11:45:29 EST 2016
rio, libdraw: experimental removal of redundant flushimage() calls for roundtrip latency reduction - remove redundant flushimage() calls before readmouse() - remove flushimage() calls for allocimage(),freeimage() and originwindow() this is experimental. it will break allocimage() error handling unless the caller does explicit flushimage() calls, tho the gains in usability over high latency connections is huge. in most cases, programs will just terminate when encountering these errors.
--- a/sys/src/cmd/rio/rio.c
+++ b/sys/src/cmd/rio/rio.c
@@ -421,6 +421,7 @@
originwindow(i, i->r.min, view->r.max);
}
freeimage(i);
+ flushimage(display, 1);
free(s);
}
}
@@ -850,9 +851,6 @@
r.max = p;
oi = nil;
while(mouse->buttons == 4){
- readmouse(mousectl);
- if(mouse->buttons != 4 && mouse->buttons != 0)
- break;
if(!eqpt(mouse->xy, p)){
p = onscreen(mouse->xy);
r = canonrect(Rpt(p0, p));
@@ -864,9 +862,9 @@
oi = i;
border(i, r, Selborder, sizecol, ZP);
draw(i, insetrect(r, Selborder), cols[BACK], nil, ZP);
- flushimage(display, 1);
}
}
+ readmouse(mousectl);
}
if(mouse->buttons != 0)
goto Rescue;
@@ -939,12 +937,10 @@
d = subpt(w->screenr.max, w->screenr.min);
op = subpt(mouse->xy, dm);
drawborder(Rect(op.x, op.y, op.x+d.x, op.y+d.y), 1);
- flushimage(display, 1);
while(mouse->buttons==4){
p = subpt(mouse->xy, dm);
if(!eqpt(p, op)){
drawborder(Rect(p.x, p.y, p.x+d.x, p.y+d.y), 1);
- flushimage(display, 1);
op = p;
}
readmouse(mousectl);
@@ -954,7 +950,6 @@
cornercursor(w, mouse->xy, 1);
moveto(mousectl, mouse->xy); /* force cursor update; ugly */
menuing = FALSE;
- flushimage(display, 1);
if(mouse->buttons!=0 || !goodrect(r)){
while(mouse->buttons)
readmouse(mousectl);
@@ -1050,7 +1045,6 @@
r = whichrect(w->screenr, p, which);
if(!eqrect(r, or) && goodrect(r)){
drawborder(r, 1);
- flushimage(display, 1);
or = r;
}
readmouse(mousectl);
@@ -1057,7 +1051,6 @@
}
p = mouse->xy;
drawborder(or, 0);
- flushimage(display, 1);
wsetcursor(w, 1);
if(mouse->buttons!=0 || !goodrect(or)){
while(mouse->buttons)
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -174,7 +174,7 @@
Stringpair pair;
Wctlmesg wcm;
Completion *cr;
- char *kbdq[8], *kbds;
+ char *kbdq[32], *kbds;
int kbdqr, kbdqw;
w = arg;
@@ -1032,7 +1032,6 @@
if(q0==q1 && selectq==w->q0){
wdoubleclick(w, &q0, &q1);
wsetselect(w, q0, q1);
- flushimage(display, 1);
x = w->mc.xy.x;
y = w->mc.xy.y;
/* stay here until something interesting happens */
@@ -1072,7 +1071,6 @@
}else
clickwin = nil;
wsetselect(w, q0, q1);
- flushimage(display, 1);
while(w->mc.buttons){
w->mc.msec = 0;
b = w->mc.buttons;
@@ -1089,7 +1087,6 @@
}
}
wscrdraw(w);
- flushimage(display, 1);
while(w->mc.buttons == b)
readmouse(&w->mc);
clickwin = nil;
@@ -1414,6 +1411,7 @@
/* move it off-screen to hide it, in case client is slow in letting it go */
MOVEIT originwindow(i, i->r.min, view->r.max);
freeimage(i);
+ flushimage(display, 1);
}
}
--- a/sys/src/libdraw/alloc.c
+++ b/sys/src/libdraw/alloc.c
@@ -47,8 +47,6 @@
return nil;
}
- /* flush pending data so we don't get error allocating the image */
- flushimage(d, 0);
a = bufimage(d, 1+4+4+1+4+1+4*4+4*4+4);
if(a == nil)
goto Error;
@@ -74,8 +72,6 @@
BPLONG(a+39, clipr.max.x);
BPLONG(a+43, clipr.max.y);
BPLONG(a+47, col);
- if(flushimage(d, 0) < 0)
- goto Error;
if(ai != nil)
i = ai;
@@ -207,7 +203,6 @@
if(i == nil || i->display == nil)
return 0;
d = i->display;
- flushimage(d, 0);
if(i->screen != nil){
w = d->windows;
if(w == i)
@@ -226,9 +221,6 @@
return -1;
a[0] = 'f';
BPLONG(a+1, i->id);
- if(flushimage(d, i->screen!=nil) < 0)
- return -1;
-
return 0;
}
--- a/sys/src/libdraw/window.c
+++ b/sys/src/libdraw/window.c
@@ -201,7 +201,6 @@
uchar *b;
Point delta;
- flushimage(w->display, 0);
b = bufimage(w->display, 1+4+2*4+2*4);
if(b == nil)
return 0;
@@ -211,8 +210,6 @@
BPLONG(b+9, log.y);
BPLONG(b+13, scr.x);
BPLONG(b+17, scr.y);
- if(flushimage(w->display, 1) < 0)
- return -1;
delta = subpt(log, w->r.min);
w->r = rectaddpt(w->r, delta);
w->clipr = rectaddpt(w->clipr, delta);
--- a/sys/src/libframe/frselect.c
+++ b/sys/src/libframe/frselect.c
@@ -96,7 +96,6 @@
}
if(scrled)
(*f->scroll)(f, 0);
- flushimage(f->display, 1);
if(!scrled)
readmouse(mc);
mp = mc->xy;