xserver: Branch 'master' - 2 commits

Peter Hutterer whot at kemper.freedesktop.org
Thu Apr 9 21:16:26 PDT 2009


 dix/ptrveloc.c |   38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

New commits:
commit ff7f019bbcbc52618cc478db7baed57aa5b7c3d3
Author: Simon Thum <simon.thum at gmx.de>
Date:   Wed Apr 1 10:53:10 2009 +0200

    dix: correctly utilize tracker buffer and protect from timer overruns
    
    two small related fixes hard to split up
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index fc1d121..99efc79 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -98,7 +98,7 @@ InitVelocityData(DeviceVelocityPtr s)
     s->min_acceleration = 1.0; /* don't decelerate */
     s->max_rel_diff = 0.2;
     s->max_diff = 1.0;
-    s->initial_range = 1;
+    s->initial_range = 2;
     s->average_accel = TRUE;
     SetAccelerationProfile(s, AccelProfileClassic);
     InitTrackers(s, 16);
@@ -445,8 +445,8 @@ FeedTrackers(DeviceVelocityPtr s, int dx, int dy, int cur_t)
 	s->tracker[n].dy += dy;
     }
     n = (s->cur_tracker + 1) % s->num_tracker;
-    s->tracker[n].dx = dx;
-    s->tracker[n].dy = dy;
+    s->tracker[n].dx = 0;
+    s->tracker[n].dy = 0;
     s->tracker[n].time = cur_t;
     s->tracker[n].dir = GetDirection(dx, dy);
     DebugAccelF("(dix prtacc) motion [dx: %i dy: %i dir:%i diff: %i]\n",
@@ -465,7 +465,7 @@ CalcTracker(DeviceVelocityPtr s, int offset, int cur_t){
     int index = TRACKER_INDEX(s, offset);
     float dist = sqrt(  s->tracker[index].dx * s->tracker[index].dx
                       + s->tracker[index].dy * s->tracker[index].dy);
-    int dtime = cur_t - s->tracker[TRACKER_INDEX(s, offset+1)].time;
+    int dtime = cur_t - s->tracker[index].time;
     if(dtime > 0)
 	return (dist / dtime);
     else
@@ -476,20 +476,22 @@ CalcTracker(DeviceVelocityPtr s, int offset, int cur_t){
  * (in time) tracker which isn't too old, beyond a linear partition,
  * or simply too much off initial velocity.
  *
- * min_t should be (now - ~100-600 ms). May return 0.
+ * May return 0.
  */
 static float
-QueryTrackers(DeviceVelocityPtr s, int min_t, int cur_t){
-    int n, offset, dir = 255, i = -1;
+QueryTrackers(DeviceVelocityPtr s, int cur_t){
+    int n, offset, dir = 255, i = -1, age_ms;
     /* initial velocity: a low-offset, valid velocity */
     float iveloc = 0, res = 0, tmp, vdiff;
     float vfac =  s->corr_mul * s->const_acceleration; /* premultiply */
     /* loop from current to older data */
-    for(offset = 0; offset < s->num_tracker-1; offset++){
+    for(offset = 1; offset < s->num_tracker; offset++){
 	n = TRACKER_INDEX(s, offset);
 
-	/* bail out if data is too old */
-	if(s->tracker[TRACKER_INDEX(s, offset+1)].time < min_t){
+	age_ms = cur_t - s->tracker[n].time;
+
+	/* bail out if data is too old and protect from overrun */
+	if (age_ms >= s->reset_time || age_ms < 0) {
 	    DebugAccelF("(dix prtacc) query: tracker too old\n");
 	    break;
 	}
@@ -566,7 +568,7 @@ ProcessVelocityData2D(
 
     FeedTrackers(s, dx, dy, time);
 
-    velocity = QueryTrackers(s, time - s->reset_time, time);
+    velocity = QueryTrackers(s, time);
 
     s->velocity = velocity;
     return velocity == 0;
commit 06aebecb19dd9d90d73b742a09b6068b862f1d05
Author: Simon Thum <simon.thum at gmx.de>
Date:   Wed Apr 8 14:35:01 2009 +0200

    dix: fix pointer accelerations remainder handling
    
    This didn't really work as intended, but did amazingly well thanks
    to roundf() hiding the defect. Cheers!
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index a3a0451..fc1d121 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -950,7 +950,7 @@ acceleratePointerPredictable(
     int *px = NULL, *py = NULL;
     DeviceVelocityPtr velocitydata =
 	(DeviceVelocityPtr) pDev->valuator->accelScheme.accelData;
-    float fdx, fdy; /* no need to init */
+    float fdx, fdy, tmp; /* no need to init */
     Bool soften = TRUE;
 
     if (!num_valuators || !valuators || !velocitydata)
@@ -991,14 +991,14 @@ acceleratePointerPredictable(
 						       (mult > 1.0) && soften);
 
                 if (dx) {
-                    pDev->last.remainder[0] = roundf(mult * fdx + pDev->last.remainder[0]);
-                    *px = (int)pDev->last.remainder[0];
-                    pDev->last.remainder[0] = pDev->last.remainder[0] - (float)*px;
+                    tmp = mult * fdx + pDev->last.remainder[0];
+                    *px = (int)roundf(tmp);
+                    pDev->last.remainder[0] = tmp - (float)*px;
                 }
                 if (dy) {
-                    pDev->last.remainder[1] = roundf(mult * fdy + pDev->last.remainder[1]);
-                    *py = (int)pDev->last.remainder[1];
-                    pDev->last.remainder[1] = pDev->last.remainder[1] - (float)*py;
+                    tmp = mult * fdy + pDev->last.remainder[1];
+                    *py = (int)roundf(tmp);
+                    pDev->last.remainder[1] = tmp - (float)*py;
                 }
             }
         }


More information about the xorg-commit mailing list