lkml.org 
[lkml]   [2003]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectPATCH: tdfx framebuffer updates
((Richard Drummond)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.6.0-test2/drivers/video/fbmem.c linux-2.6.0-test2-ac1/drivers/video/fbmem.c
--- linux-2.6.0-test2/drivers/video/fbmem.c 2003-07-10 21:03:32.000000000 +0100
+++ linux-2.6.0-test2-ac1/drivers/video/fbmem.c 2003-07-23 15:45:30.000000000 +0100
@@ -214,6 +214,9 @@
#ifdef CONFIG_FB_RIVA
{ "rivafb", rivafb_init, rivafb_setup },
#endif
+#ifdef CONFIG_FB_3DFX
+ { "tdfxfb", tdfxfb_init, tdfxfb_setup },
+#endif
#ifdef CONFIG_FB_RADEON
{ "radeonfb", radeonfb_init, radeonfb_setup },
#endif
@@ -294,9 +297,6 @@
* Chipset specific drivers that don't use resource management (yet)
*/

-#ifdef CONFIG_FB_3DFX
- { "tdfxfb", tdfxfb_init, tdfxfb_setup },
-#endif
#ifdef CONFIG_FB_SGIVW
{ "sgivwfb", sgivwfb_init, sgivwfb_setup },
#endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.6.0-test2/drivers/video/tdfxfb.c linux-2.6.0-test2-ac1/drivers/video/tdfxfb.c
--- linux-2.6.0-test2/drivers/video/tdfxfb.c 2003-07-10 21:06:48.000000000 +0100
+++ linux-2.6.0-test2-ac1/drivers/video/tdfxfb.c 2003-07-23 15:45:30.000000000 +0100
@@ -1,3 +1,4 @@
+
/*
*
* tdfxfb.c
@@ -177,7 +178,7 @@
.fb_pan_display = tdfxfb_pan_display,
.fb_fillrect = tdfxfb_fillrect,
.fb_copyarea = tdfxfb_copyarea,
- .fb_imageblit = cfb_imageblit,
+ .fb_imageblit = tdfxfb_imageblit,
.fb_sync = banshee_wait_idle,
.fb_cursor = soft_cursor,
};
@@ -316,7 +317,9 @@

static inline void banshee_make_room(struct tdfx_par *par, int size)
{
- while((tdfx_inl(par, STATUS) & 0x1f) < size);
+ /* Note: The Voodoo3's onboard FIFO has 32 slots. This loop
+ * won't quit if you ask for more. */
+ while((tdfx_inl(par, STATUS) & 0x1f) < size-1);
}

static int banshee_wait_idle(struct fb_info *info)
@@ -746,6 +749,7 @@
#if defined(__BIG_ENDIAN)
switch (info->var.bits_per_pixel) {
case 8:
+ case 24:
reg.miscinit0 &= ~(1 << 30);
reg.miscinit0 &= ~(1 << 31);
break;
@@ -753,7 +757,6 @@
reg.miscinit0 |= (1 << 30);
reg.miscinit0 |= (1 << 31);
break;
- case 24:
case 32:
reg.miscinit0 |= (1 << 30);
reg.miscinit0 &= ~(1 << 31);
@@ -771,6 +774,9 @@
return 0;
}

+/* A handy macro shamelessly pinched from matroxfb */
+#define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)
+
static int tdfxfb_setcolreg(unsigned regno, unsigned red, unsigned green,
unsigned blue,unsigned transp,struct fb_info *info)
{
@@ -788,13 +794,10 @@
break;
/* Truecolor has no hardware color palettes. */
case FB_VISUAL_TRUECOLOR:
- rgbcol = (red << info->var.red.offset) |
- (green << info->var.green.offset) |
- (blue << info->var.blue.offset) |
- (transp << info->var.transp.offset);
- if (info->var.bits_per_pixel <= 16)
- ((u16*)(info->pseudo_palette))[regno] = rgbcol;
- else
+ rgbcol = (CNVT_TOHW( red, info->var.red.length) << info->var.red.offset) |
+ (CNVT_TOHW( green, info->var.green.length) << info->var.green.offset) |
+ (CNVT_TOHW( blue, info->var.blue.length) << info->var.blue.offset) |
+ (CNVT_TOHW( transp, info->var.transp.length) << info->var.transp.offset);
((u32*)(info->pseudo_palette))[regno] = rgbcol;
break;
default:
@@ -934,6 +937,7 @@
{
struct tdfx_par *par = (struct tdfx_par *) info->par;
int size = image->height * ((image->width * image->depth + 7)>>3);
+ int fifo_free;
int i, stride = info->fix.line_length;
u32 bpp = info->var.bits_per_pixel;
u32 dstfmt = stride | ((bpp+((bpp==8) ? 0 : 8)) << 13);
@@ -946,10 +950,22 @@
cfb_imageblit(info, image);
return;
} else {
- banshee_make_room(par, 8 + ((size + 3) >> 2));
+ banshee_make_room(par, 8);
+ switch (info->fix.visual) {
+ case FB_VISUAL_PSEUDOCOLOR:
tdfx_outl(par, COLORFORE, image->fg_color);
tdfx_outl(par, COLORBACK, image->bg_color);
+ break;
+ case FB_VISUAL_TRUECOLOR:
+ default:
+ tdfx_outl(par, COLORFORE, ((u32*)(info->pseudo_palette))[image->fg_color]);
+ tdfx_outl(par, COLORBACK, ((u32*)(info->pseudo_palette))[image->bg_color]);
+ }
+#ifdef __BIG_ENDIAN
+ srcfmt = 0x400000 | BIT(20);
+#else
srcfmt = 0x400000;
+#endif
}

tdfx_outl(par, SRCXY, 0);
@@ -959,13 +975,22 @@
tdfx_outl(par, DSTFORMAT, dstfmt);
tdfx_outl(par, DSTSIZE, image->width | (image->height << 16));

+ /* A count of how many free FIFO entries we've requested.
+ * When this goes negative, we need to request more. */
+ fifo_free = 0;
+
/* Send four bytes at a time of data */
for (i = (size >> 2) ; i > 0; i--) {
+ if(--fifo_free < 0) {
+ fifo_free=31;
+ banshee_make_room(par,fifo_free);
+ }
tdfx_outl(par, LAUNCH_2D,*(u32*)chardata);
chardata += 4;
}

/* Send the leftovers now */
+ banshee_make_room(par,3);
i = size%4;
switch (i) {
case 0: break;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 13:47    [W:0.103 / U:0.032 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site