Commit 8dad46cf authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds

[PATCH] tridentfb: Fix scrolling artifacts if acceleration is enabled

Reported by: Jochen Hein (Bugzilla Bug 4386)

booting leaves the end of long lines in the last line on screen when
scrolling.  When X is running, scrolling puts garbage on the screen
(looks like X data) Console switch fixes the screen.  Behaviour seems to
be identical with noaccel and without on the video=tridentfb parameter
in lilo.conf.

This bug was explained by: Knut_Petersen

Acceleration is broken for all BLADE 3D chips for all versions of kernel
2.6 except for 32bit modes.  Most important reason is that the u32 col
parameter of the graphics engine needs the color value replicated to all
u8 of the u32 (8bit modes) and to both u16 of the u32.

Fix color value passed to graphics engine, verified by the reporter.
Signed-off-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6cb54819
...@@ -454,13 +454,16 @@ static struct accel_switch accel_image = { ...@@ -454,13 +454,16 @@ static struct accel_switch accel_image = {
static void tridentfb_fillrect(struct fb_info * info, const struct fb_fillrect *fr) static void tridentfb_fillrect(struct fb_info * info, const struct fb_fillrect *fr)
{ {
int bpp = info->var.bits_per_pixel; int bpp = info->var.bits_per_pixel;
int col; int col = 0;
switch (bpp) { switch (bpp) {
default: default:
case 8: col = fr->color; case 8: col |= fr->color;
col |= col << 8;
col |= col << 16;
break; break;
case 16: col = ((u32 *)(info->pseudo_palette))[fr->color]; case 16: col = ((u32 *)(info->pseudo_palette))[fr->color];
break; break;
case 32: col = ((u32 *)(info->pseudo_palette))[fr->color]; case 32: col = ((u32 *)(info->pseudo_palette))[fr->color];
break; break;
...@@ -882,8 +885,9 @@ static int tridentfb_set_par(struct fb_info *info) ...@@ -882,8 +885,9 @@ static int tridentfb_set_par(struct fb_info *info)
write3X4(GraphEngReg, 0x80); //enable GE for text acceleration write3X4(GraphEngReg, 0x80); //enable GE for text acceleration
// if (info->var.accel_flags & FB_ACCELF_TEXT) #ifdef CONFIG_FB_TRIDENT_ACCEL
//FIXME acc->init_accel(info->var.xres,bpp); acc->init_accel(info->var.xres,bpp);
#endif
switch (bpp) { switch (bpp) {
case 8: tmp = 0x00; break; case 8: tmp = 0x00; break;
...@@ -981,12 +985,14 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green, ...@@ -981,12 +985,14 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
t_outb(green>>10,0x3C9); t_outb(green>>10,0x3C9);
t_outb(blue>>10,0x3C9); t_outb(blue>>10,0x3C9);
} else } else if (bpp == 16) { /* RGB 565 */
if (bpp == 16) /* RGB 565 */ u32 col;
((u32*)info->pseudo_palette)[regno] = (red & 0xF800) |
((green & 0xFC00) >> 5) | ((blue & 0xF800) >> 11); col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
else ((blue & 0xF800) >> 11);
if (bpp == 32) /* ARGB 8888 */ col |= col << 16;
((u32 *)(info->pseudo_palette))[regno] = col;
} else if (bpp == 32) /* ARGB 8888 */
((u32*)info->pseudo_palette)[regno] = ((u32*)info->pseudo_palette)[regno] =
((transp & 0xFF00) <<16) | ((transp & 0xFF00) <<16) |
((red & 0xFF00) << 8) | ((red & 0xFF00) << 8) |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment