Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -454,13 +454,16 @@ static struct accel_switch accel_image = {
static void tridentfb_fillrect(struct fb_info * info, const struct fb_fillrect *fr)
{
	int bpp = info->var.bits_per_pixel;
	int col;
	int col = 0;
	
	switch (bpp) {
		default:
		case 8: col = fr->color;
		case 8: col |= fr->color;
			col |= col << 8;
			col |= col << 16;
			break;
		case 16: col = ((u32 *)(info->pseudo_palette))[fr->color];
			
			 break;
		case 32: col = ((u32 *)(info->pseudo_palette))[fr->color];
			 break;
@@ -882,8 +885,9 @@ static int tridentfb_set_par(struct fb_info *info)

	write3X4(GraphEngReg, 0x80);	//enable GE for text acceleration

//	if (info->var.accel_flags & FB_ACCELF_TEXT)
//FIXME		acc->init_accel(info->var.xres,bpp);
#ifdef CONFIG_FB_TRIDENT_ACCEL	
	acc->init_accel(info->var.xres,bpp);
#endif
	
	switch (bpp) {
		case 8:  tmp = 0x00; break;
@@ -981,12 +985,14 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
		t_outb(green>>10,0x3C9);
		t_outb(blue>>10,0x3C9);

	} else
	if (bpp == 16) 			/* RGB 565 */
			((u32*)info->pseudo_palette)[regno] = (red & 0xF800) |
			((green & 0xFC00) >> 5) | ((blue & 0xF800) >> 11);
	else
	if (bpp == 32)		/* ARGB 8888 */
	} else if (bpp == 16) {	/* RGB 565 */
		u32 col;

		col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
			((blue & 0xF800) >> 11);
		col |= col << 16;	
		((u32 *)(info->pseudo_palette))[regno] = col;
	} else if (bpp == 32)		/* ARGB 8888 */
		((u32*)info->pseudo_palette)[regno] =
			((transp & 0xFF00) <<16) 	|
			((red & 0xFF00) << 8) 		|