From 9dc9c6c5ef8bba195778f7701142af602e457665 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 8 Mar 2016 16:45:29 +0100 Subject: [PATCH] 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. --- sys/src/cmd/rio/rio.c | 11 ++--------- sys/src/cmd/rio/wind.c | 6 ++---- sys/src/libdraw/alloc.c | 8 -------- sys/src/libdraw/window.c | 3 --- sys/src/libframe/frselect.c | 1 - 5 files changed, 4 insertions(+), 25 deletions(-) diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c index d8f7c78bf..2abcb7223 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -421,6 +421,7 @@ deletethread(void*) originwindow(i, i->r.min, view->r.max); } freeimage(i); + flushimage(display, 1); free(s); } } @@ -850,9 +851,6 @@ sweep(void) 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 @@ sweep(void) 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 @@ drag(Window *w) 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 @@ drag(Window *w) 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,14 +1045,12 @@ bandsize(Window *w) r = whichrect(w->screenr, p, which); if(!eqrect(r, or) && goodrect(r)){ drawborder(r, 1); - flushimage(display, 1); or = r; } readmouse(mousectl); } p = mouse->xy; drawborder(or, 0); - flushimage(display, 1); wsetcursor(w, 1); if(mouse->buttons!=0 || !goodrect(or)){ while(mouse->buttons) diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index 72a8286f5..6bf3fe90b 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -174,7 +174,7 @@ winctl(void *arg) Stringpair pair; Wctlmesg wcm; Completion *cr; - char *kbdq[8], *kbds; + char *kbdq[32], *kbds; int kbdqr, kbdqw; w = arg; @@ -1032,7 +1032,6 @@ wselect(Window *w) 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 @@ wselect(Window *w) }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 @@ wselect(Window *w) } } wscrdraw(w); - flushimage(display, 1); while(w->mc.buttons == b) readmouse(&w->mc); clickwin = nil; @@ -1414,6 +1411,7 @@ wclosewin(Window *w) /* 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); } } diff --git a/sys/src/libdraw/alloc.c b/sys/src/libdraw/alloc.c index 90289a6aa..28caaac02 100644 --- a/sys/src/libdraw/alloc.c +++ b/sys/src/libdraw/alloc.c @@ -47,8 +47,6 @@ _allocimage(Image *ai, Display *d, Rectangle r, ulong chan, int repl, ulong col, 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 @@ _allocimage(Image *ai, Display *d, Rectangle r, ulong chan, int repl, ulong col, 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 @@ _freeimage1(Image *i) 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 @@ _freeimage1(Image *i) return -1; a[0] = 'f'; BPLONG(a+1, i->id); - if(flushimage(d, i->screen!=nil) < 0) - return -1; - return 0; } diff --git a/sys/src/libdraw/window.c b/sys/src/libdraw/window.c index b4dc7fad9..2b6702e72 100644 --- a/sys/src/libdraw/window.c +++ b/sys/src/libdraw/window.c @@ -201,7 +201,6 @@ originwindow(Image *w, Point log, Point scr) 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 @@ originwindow(Image *w, Point log, Point scr) 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); diff --git a/sys/src/libframe/frselect.c b/sys/src/libframe/frselect.c index f5955e42b..0f4c66348 100644 --- a/sys/src/libframe/frselect.c +++ b/sys/src/libframe/frselect.c @@ -96,7 +96,6 @@ frselect(Frame *f, Mousectl *mc) /* when called, button 1 is down */ } if(scrled) (*f->scroll)(f, 0); - flushimage(f->display, 1); if(!scrled) readmouse(mc); mp = mc->xy;