changeset 266:336b1559a447

- added detection of memsize of graphics card to check if double buffering is possible - fixed resolution switching a little and added more debug output - resolution switching is still according to d_width and d_height which is not always a good idea ...
author acki2
date Sun, 01 Apr 2001 08:07:14 +0000
parents 1d02e6f7c63a
children 3c27519164d6
files libvo/vo_dga.c
diffstat 1 files changed, 64 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_dga.c	Sun Apr 01 00:08:26 2001 +0000
+++ b/libvo/vo_dga.c	Sun Apr 01 08:07:14 2001 +0000
@@ -1,6 +1,8 @@
 #define DISP
 
 /*
+ * $Id$
+ * 
  * video_out_dga.c, X11 interface
  *
  *
@@ -15,6 +17,14 @@
  * o this is alpha
  * o covers only common video card formats
  * o works only on intel architectures
+ *
+ * $Log$
+ * Revision 1.9  2001/04/01 08:07:14  acki2
+ * - added detection of memsize of graphics card to check if double buffering is possible
+ * - fixed resolution switching a little and added more debug output
+ * - resolution switching is still according to d_width and d_height which
+ *   is not always a good idea ...
+ *
  * 
  * 30/02/2001
  *
@@ -39,7 +49,7 @@
  * 
  */
 
-
+//#define VO_DGA_FORCE_DEPTH 32
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -80,6 +90,9 @@
 #endif
 
 
+//extern int       verbose;           // shouldn't someone remove the static from 
+                                      // its definition in mplayer.c ???
+
 static int       vo_dga_width;           // bytes per line in framebuffer
 static int       vo_dga_vp_width;        // visible pixels per line in 
                                          // framebuffer
@@ -246,6 +259,14 @@
 	  )
 	)
         {
+          // this only for debug reasons ...
+	  if(modelines[i].bitsPerPixel == 15 || modelines[i].bitsPerPixel == 16){
+              printf("vo_dga: depth: %d, %08x, %08x, %08x\n",
+		       modelines[i].bitsPerPixel,
+		       modelines[i].redMask,
+		       modelines[i].greenMask,
+	               modelines[i].blueMask);			  
+          }
           for(k=0, dummy=1; k<modelines[i].bitsPerPixel-1; k++)dummy <<=1;
 	  dga_depths |= dummy;
         }
@@ -336,10 +357,13 @@
 
 //----------------------------------------------------------
 
-int check_mode( int x, int y, 
+int check_mode( int num, int x, int y, int bpp,  
                 int new_x, int new_y, int new_vbi, 
                 int *old_x, int *old_y, int *old_vbi){
 
+  printf("vo_dga: (%3d) Trying %4d x %4d @ %3d Hz @ %2d bpp ..",
+          num, new_x, new_y, new_vbi, bpp );
+  printf("(old: %dx%d@%d).", *old_x, *old_y, *old_vbi);	
   if (
       (new_x >= x) && 
       (new_y >= y) &&
@@ -359,7 +383,7 @@
 	 !(new_y > *old_y)) ||
 	((new_y < *old_y) &&
 	 !(new_x > *old_x)) 
-	) 
+       ) 
        // but if we get an identical resolution choose
        // the one with the lower refreshrate (saves bandwidth !!!)
        // as long as it's above 50 Hz (acki2 on 30/3/2001)
@@ -370,23 +394,25 @@
 	(
 	 (
 	  new_vbi >= *old_vbi && *old_vbi < 50
-	  )  
+	 )  
 	 ||
 	 (
 	  *old_vbi >= 50 && 
 	  new_vbi < *old_vbi &&
 	  new_vbi >= 50
-	  )
 	 )
 	)
        )
-      )  
+      )
+     )  
     {
       *old_x = new_x;
       *old_y = new_y;
       *old_vbi = new_vbi;
+      printf(".ok!!\n");
       return 1;
     }else{
+      printf(".no\n");
       return 0;
     }
 }
@@ -404,16 +430,17 @@
 
 #ifdef HAVE_DGA2
   // needed to change DGA video mode
-  int modecount,mX, mY, mVBI, i,j;
+  int modecount, mX=100000, mY=100000 , mVBI=100000, i,j=0;
   int dga_modenum;
   XDGAMode   *modelines=NULL;
   XDGADevice *dgadevice;
+  int max_vpy_pos;
 #else
 #ifdef HAVE_XF86VM
   unsigned int vm_event, vm_error;
   unsigned int vm_ver, vm_rev;
-  int i,j,have_vm=0;
-  int modecount,mX, mY, mVBI, dga_modenum;  
+  int i, j=0, have_vm=0;
+  int modecount, mX=100000, mY=100000, mVBI=100000, dga_modenum;  
 #endif
   int bank, ram;
 #endif
@@ -465,36 +492,17 @@
   if (modelines==NULL)
     modelines=XDGAQueryModes(vo_dga_dpy, XDefaultScreen(vo_dga_dpy),&modecount);
   
-  mX=modelines[0].imageWidth;
-  mY=modelines[0].imageHeight;
-  mVBI = modelines[0].verticalRefresh;
-
-  
   printf("vo_dga: Using DGA 2.0 mode changing support\n");	
-  j=0; 
   // offbyone-error !!! i<=modecount is WRONG !!!
-  for (i=1; i<modecount; i++)
+  for (i=0; i<modecount; i++)
   {
      if( modelines[i].bitsPerPixel == vo_dga_planes)
      {
-       printf("vo_dga: (%3d) Trying %4d x %4d @ %3d Hz @ %2d bpp ..",
-		     i,
-		     modelines[i].viewportWidth, 
-		     modelines[i].viewportHeight,
-		     (unsigned int) modelines[i].verticalRefresh,
-		     modelines[i].bitsPerPixel );
-     
-       if ( check_mode(d_width, d_height, 
+       if ( check_mode(i, d_width, d_height, modelines[i].bitsPerPixel,  
                   modelines[i].viewportWidth, 
                   modelines[i].viewportHeight, 
                   (unsigned) modelines[i].verticalRefresh,
-                   &mX, &mY, &mVBI ))
-       {
-         j = i;
-	 printf(".ok!!\n");
-       }else{
-         printf(".no\n");
-       }
+                   &mX, &mY, &mVBI )) j = i;
      }
   }
   printf("vo_dga: Selected video mode %4d x %4d @ %3d Hz for image size %3d x %3d.\n", 
@@ -504,13 +512,13 @@
   vo_dga_vp_height = mY;
   vo_dga_width = modelines[j].bytesPerScanline / vo_dga_bpp;
   dga_modenum =  modelines[j].num;
+  max_vpy_pos = modelines[j].maxViewportY;
   
   XFree(modelines);
   modelines = NULL;
   
 #else
 
-
 #ifdef HAVE_XF86VM
 
   printf("vo_dga: DGA 1.0 compatibility code: Using XF86VidMode for mode switching!\n");
@@ -520,7 +528,7 @@
     printf("vo_dga: XF86VidMode Extension v%i.%i\n", vm_ver, vm_rev);
     have_vm=1;
   } else {
-    printf("vo_dga: XF86VidMode Extention not available.\n");
+    printf("vo_dga: XF86VidMode Extension not available.\n");
   }
 
 #define GET_VREFRESH(dotclk, x, y)( (((dotclk)/(x))*1000)/(y) )
@@ -531,38 +539,14 @@
     XF86VidModeGetAllModeLines(vo_dga_dpy,screen,&modecount,&vo_dga_vidmodes);
 
     if(vo_dga_vidmodes != NULL ){
-   
-      mX=vo_dga_vidmodes[0]->hdisplay;
-      mY=vo_dga_vidmodes[0]->vdisplay;
-      
-      // TODO: calculate refreshrate from dotclock, hss, hstp, ...
-      mVBI = GET_VREFRESH(vo_dga_vidmodes[0]->dotclock, 
-	                  vo_dga_vidmodes[0]->htotal,
-			  vo_dga_vidmodes[0]->vtotal);                       
-      
-      j=0; 
-      for (i=1; i<modecount; i++){
-	printf("vo_dga: (%3d) Trying %4d x %4d @ %3d Hz @ %2d bpp ..",
-	       i,
-	       vo_dga_vidmodes[i]->hdisplay, 
-	       vo_dga_vidmodes[i]->vdisplay,
-               GET_VREFRESH(vo_dga_vidmodes[i]->dotclock, 
-	                    vo_dga_vidmodes[i]->htotal,
-			    vo_dga_vidmodes[i]->vtotal),
-	       vo_dga_planes );
-	
-	if ( check_mode(d_width, d_height, 
+      for (i=0; i<modecount; i++){
+	if ( check_mode(i, d_width, d_height, vo_dga_planes,  
 			vo_dga_vidmodes[i]->hdisplay, 
 			vo_dga_vidmodes[i]->vdisplay,
 			GET_VREFRESH(vo_dga_vidmodes[i]->dotclock, 
 				     vo_dga_vidmodes[i]->htotal,
 				     vo_dga_vidmodes[i]->vtotal),
-			&mX, &mY, &mVBI )){
-	  j = i;
-	  printf(".ok!!\n");
-	}else{
-	  printf(".no\n");
-	}
+			&mX, &mY, &mVBI )) j = i;
       }
     
       printf("vo_dga: Selected video mode %4d x %4d @ %3d Hz for image size %3d x %3d.\n", 
@@ -581,7 +565,6 @@
 #endif
 #endif
 
-
   vo_dga_src_format = format;
   vo_dga_src_width = width;
   vo_dga_src_height = height;
@@ -686,7 +669,12 @@
   if(format ==IMGFMT_YV12 )vo_dga_dbf_mem_offset = 0;
   // disable doublebuffering for YV12
 
-  printf("vo_dga: Doublebuffering %s.\n", vo_dga_dbf_mem_offset ? "enabled" : "disabled");
+#ifdef HAVE_DGA2
+      if(vo_dga_vp_height>max_vpy_pos){
+        vo_dga_dbf_mem_offset = 0;
+	printf("vo_dga: Not enough memory for double buffering!\n");
+      }
+#endif  
   
   // now clear screen
   {
@@ -694,9 +682,21 @@
 	(vo_dga_vp_height + (vo_dga_dbf_mem_offset != 0 ?
 	(vo_dga_src_height+y_off) : 0)) *
 	vo_dga_bpp;
-   fprintf(stderr, "vo_dga: Before memset: %d. If mplayer exits here, you haven't enough memory for doublebuffering. I'll fix this in the future to check for amount of mem available... For now, select a lower resolution ...\n", size);   
-   memset(vo_dga_base, 0, size);  
+#ifndef HAVE_DGA2
+    printf("%d, %d\n", size, ram);
+    if(size>ram*1024){
+      vo_dga_dbf_mem_offset = 0;
+      printf("vo_dga: Not enough memory for double buffering!\n");
+      size -= (vo_dga_src_height+y_off) * vo_dga_width * vo_dga_bpp;
+    }				        
+#endif
+    
+    printf("vo_dga: Clearing framebuffer (%d bytes). If mplayer exits", size);
+    printf(" here, you haven't enough memory on your card.\n");   
+    fflush(stdout);
+    memset(vo_dga_base, 0, size);  
   }
+  printf("vo_dga: Doublebuffering %s.\n", vo_dga_dbf_mem_offset ? "enabled" : "disabled");
   vo_dga_is_running = 1;
   return 0;
 }