diff options
| author | Antonino Daplas <adaplas@hotpop.com> | 2004-09-07 17:55:19 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-09-07 17:55:19 -0700 |
| commit | e6c1741e9d50c4feb816cb1b633e2ff4dc0863e3 (patch) | |
| tree | 44e48760dbe55714386069cd72cfed045f2b9562 | |
| parent | 89abac272ad7cc3f903db478ef331a8d7b633354 (diff) | |
[PATCH] fbdev: Speed up scrolling of tdfxfb
This patch speeds up scrolling of tdfxfb by maximizing var->yres_virtual so
tdfxfb uses SCROLL_PAN_MOVE instead of SCROLL_REDRAW. This is true whether
CONFIG_FB_3DFX_ACCEL is set or not. This problem was reported by Paolo
Ornati <ornati@fastwebnet.it> who also made substantial contributions to
solve this problem.
This patch also fixes compile errors when CONFIG_FB_3DFX_ACCEL is false.
Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | drivers/video/tdfxfb.c | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/drivers/video/tdfxfb.c b/drivers/video/tdfxfb.c index b58eced6d6b7..5aa485de58e8 100644 --- a/drivers/video/tdfxfb.c +++ b/drivers/video/tdfxfb.c @@ -168,7 +168,6 @@ static int banshee_wait_idle(struct fb_info *info); static void tdfxfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect); static void tdfxfb_copyarea(struct fb_info *info, const struct fb_copyarea *area); static void tdfxfb_imageblit(struct fb_info *info, const struct fb_image *image); -static int tdfxfb_cursor(struct fb_info *info, struct fb_cursor *cursor); #endif /* CONFIG_FB_3DFX_ACCEL */ static struct fb_ops tdfxfb_ops = { @@ -183,13 +182,12 @@ static struct fb_ops tdfxfb_ops = { .fb_fillrect = tdfxfb_fillrect, .fb_copyarea = tdfxfb_copyarea, .fb_imageblit = tdfxfb_imageblit, - .fb_cursor = tdfxfb_cursor, #else .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, - .fb_cursor = soft_cursor, #endif + .fb_cursor = soft_cursor, }; /* @@ -502,15 +500,11 @@ static int tdfxfb_check_var(struct fb_var_screeninfo *var,struct fb_info *info) return -EINVAL; } - if (var->xres != var->xres_virtual) { - DPRINTK("virtual x resolution != physical x resolution not supported\n"); - return -EINVAL; - } + if (var->xres != var->xres_virtual) + var->xres_virtual = var->xres; - if (var->yres > var->yres_virtual) { - DPRINTK("virtual y resolution < physical y resolution not possible\n"); - return -EINVAL; - } + if (var->yres > var->yres_virtual) + var->yres_virtual = var->yres; if (var->xoffset) { DPRINTK("xoffset not supported\n"); @@ -539,9 +533,12 @@ static int tdfxfb_check_var(struct fb_var_screeninfo *var,struct fb_info *info) } if (lpitch * var->yres_virtual > info->fix.smem_len) { - DPRINTK("no memory for screen (%ux%ux%u)\n", - var->xres, var->yres_virtual, var->bits_per_pixel); - return -EINVAL; + var->yres_virtual = info->fix.smem_len/lpitch; + if (var->yres_virtual < var->yres) { + DPRINTK("no memory for screen (%ux%ux%u)\n", + var->xres, var->yres_virtual, var->bits_per_pixel); + return -EINVAL; + } } if (PICOS2KHZ(var->pixclock) > par->max_pixclock) { @@ -1030,7 +1027,9 @@ static void tdfxfb_imageblit(struct fb_info *info, const struct fb_image *image) } banshee_wait_idle(info); } +#endif /* CONFIG_FB_3DFX_ACCEL */ +#ifdef TDFX_HARDWARE_CURSOR static int tdfxfb_cursor(struct fb_info *info, struct fb_cursor *cursor) { struct tdfx_par *par = (struct tdfx_par *) info->par; @@ -1167,7 +1166,7 @@ static int tdfxfb_cursor(struct fb_info *info, struct fb_cursor *cursor) spin_unlock_irqrestore(&par->DAClock, flags); return 0; } -#endif /* CONFIG_FB_3DFX_ACCEL */ +#endif /** * tdfxfb_probe - Device Initializiation @@ -1183,7 +1182,7 @@ static int __devinit tdfxfb_probe(struct pci_dev *pdev, { struct tdfx_par *default_par; struct fb_info *info; - int size, err; + int size, err, lpitch; if ((err = pci_enable_device(pdev))) { printk(KERN_WARNING "tdfxfb: Can't enable pdev: %d\n", err); @@ -1288,6 +1287,22 @@ static int __devinit tdfxfb_probe(struct pci_dev *pdev, if (!err || err == 4) info->var = tdfx_var; + /* maximize virtual vertical length */ + lpitch = info->var.xres_virtual * ((info->var.bits_per_pixel + 7) >> 3); + info->var.yres_virtual = info->fix.smem_len/lpitch; + if (info->var.yres_virtual < info->var.yres) + goto out_err; + +#ifdef CONFIG_FB_3DFX_ACCEL + /* + * FIXME: Limit var->yres_virtual to 4096 because of screen artifacts + * during scrolling. This is only present if 2D acceleration is + * enabled. + */ + if (info->var.yres_virtual > 4096) + info->var.yres_virtual = 4096; +#endif /* CONFIG_FB_3DFX_ACCEL */ + if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { printk(KERN_WARNING "tdfxfb: Can't allocate color map\n"); goto out_err; |
