NV50: switch to fixed point scale factor calculations
authorMaarten Maathuis <madman2003@gmail.com>
Tue, 1 Jul 2008 14:00:09 +0000 (16:00 +0200)
committerMaarten Maathuis <madman2003@gmail.com>
Tue, 1 Jul 2008 14:00:09 +0000 (16:00 +0200)
linux-core/nv50_crtc.c

index fd2ad38..c9745e0 100644 (file)
@@ -232,17 +232,18 @@ static int nv50_crtc_set_dither(struct nv50_crtc *crtc)
 
 static void nv50_crtc_calc_scale(struct nv50_crtc *crtc, uint32_t *outX, uint32_t *outY)
 {
-       float hor_scale, ver_scale;
+       uint32_t hor_scale, ver_scale;
 
-       hor_scale = (float)crtc->native_mode->hdisplay/(float)crtc->mode->hdisplay;
-       ver_scale = (float)crtc->native_mode->vdisplay/(float)crtc->mode->vdisplay;
+       /* max res is 8192, which is 2^13, which leaves 19 bits */
+       hor_scale = (crtc->native_mode->hdisplay << 19)/crtc->mode->hdisplay;
+       ver_scale = (crtc->native_mode->vdisplay << 19)/crtc->mode->vdisplay;
 
        if (ver_scale > hor_scale) {
-               *outX = crtc->mode->hdisplay * hor_scale;
-               *outY = crtc->mode->vdisplay * hor_scale;
+               *outX = (crtc->mode->hdisplay * hor_scale) >> 19;
+               *outY = (crtc->mode->vdisplay * hor_scale) >> 19;
        } else {
-               *outX = crtc->mode->hdisplay * ver_scale;
-               *outY = crtc->mode->vdisplay * ver_scale;
+               *outX = (crtc->mode->hdisplay * ver_scale) >> 19;
+               *outY = (crtc->mode->vdisplay * ver_scale) >> 19;
        }
 }