[MPlayer-dev-eng] [PATCH] vo_tdfxfb.c clear screen and tiny image bug

Burton Samograd kruhft at kruhft.dyndns.org
Wed Aug 28 04:46:07 CEST 2002


I already sent part of this patch earlier today, but this one also
fixes one of the comments on the wishlist that was just sent out
(clearing the screen).

burton
-------------- next part --------------
? h
Index: vo_tdfxfb.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_tdfxfb.c,v
retrieving revision 1.14
diff -u -r1.14 vo_tdfxfb.c
--- vo_tdfxfb.c	13 Apr 2002 19:14:33 -0000	1.14
+++ vo_tdfxfb.c	28 Aug 2002 03:01:26 -0000
@@ -153,8 +153,16 @@
 
 static void clear_screen()
 {
-	if(vo_doublebuffering) {
-		memset(vidpage, 0, screenwidth * screenheight * screendepth);
+  /* There needs to be some sort of delay here or else things seriously screw up.
+     Causes the image to not be the right size on screen if this isn't like this.
+     A printf before the memset call also seems to work, but this made more sense
+     since it actually checks the status of the card. 
+  */
+  do {
+    memset(vidpage, 0, screenwidth * screenheight * screendepth);
+  } while((reg_IO->status & 0x1f) < 1);
+  
+  	if(vo_doublebuffering) {
 		memset(hidpage, 0, screenwidth * screenheight * screendepth);
 	}
 }
@@ -171,9 +179,14 @@
 
 		if(screenwidth / ratio <= screenheight)
 			vidheight = (double)screenwidth / ratio;
+		/* Is this really needed?  This causes movies that are encoded at YxY 
+		   sizes to not be displayed properly (they're squished horizontally).
+		This might cause problems with videos that are taller than they are wide 
+		but I haven't really seen many of those so we won't worry about it for now. */
+#if 0		
 		else
 			vidwidth = (double)screenheight * ratio;
-
+#endif 
 		vidx = (screenwidth - vidwidth) / 2;
 		vidy = (screenheight - vidheight) / 2;
 	} else {					/* Reset to normal size */
@@ -185,7 +198,7 @@
 		vidheight = r_height;
 		vidx = vidy = 0;
 	}
-
+	
 	clear_screen();
 }
 
@@ -265,12 +278,11 @@
 
 	in_voodoo_format |= in_width * in_depth;
 
-	/* Linux lives in the first frame */
-	if(vo_doublebuffering) {
-		vidpageoffset = screenwidth * screenheight * screendepth;
-		hidpageoffset = vidpageoffset + screenwidth * screenheight * screendepth;
-	} else
-		vidpageoffset = hidpageoffset = 0;		/* Console background */
+	/* Put the image pages off the console screen so they don't get console messages  */
+	/* This used to place single buffered movies onto the main console screen */
+	vidpageoffset = hidpageoffset = screenwidth * screenheight * screendepth;
+	if(vo_doublebuffering)
+	  hidpageoffset = vidpageoffset + screenwidth * screenheight * screendepth;
 
 	inpageoffset = hidpageoffset + screenwidth * screenheight * screendepth;
 
@@ -322,6 +334,10 @@
 {
 	voodoo_2d_reg regs = *reg_2d;		/* Copy the regs */
 	int i = 0;
+	/* This has to be done of else setting dstSize doesn't work  */
+	/* Must be a gcc 3.0+ bug */
+	int tempvidheight = vidheight; 
+	int tempvidwidth = vidwidth;
 
 	if(vo_doublebuffering) {
 		/* Flip to an offscreen buffer for rendering */
@@ -346,7 +362,8 @@
 	reg_2d->dstBaseAddr = vidpageoffset;
 	reg_2d->dstXY = XYREG(vidx, vidy);
 	reg_2d->dstFormat = vid_voodoo_format;
-	reg_2d->dstSize = XYREG(vidwidth, vidheight);
+	/* The XYREG macro doesn't seem to work for this line so build the register contents very explicitly */
+	reg_2d->dstSize = ((((unsigned long)vidheight) & 0x0000FFFF) << 16) | (((unsigned long) vidwidth) & 0x0000FFFF);  
 	reg_2d->command = S2S_STRECH_BLT | S2S_IMMED | S2S_ROP;
 
 	/* Wait for the command to finish (If we don't do this, we get wierd


More information about the MPlayer-dev-eng mailing list