changeset 8067:482666d4c729

- cleanup - add fixed-vo support please test, this is working for me
author pontscho
date Sun, 03 Nov 2002 00:39:28 +0000
parents 956562173bbe
children a9e2956905e6
files libvo/vo_dga.c
diffstat 1 files changed, 93 insertions(+), 99 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_dga.c	Sun Nov 03 00:21:20 2002 +0000
+++ b/libvo/vo_dga.c	Sun Nov 03 00:39:28 2002 +0000
@@ -256,7 +256,11 @@
 static int       vo_dga_src_mode = 0;    // index in mode list that is used by 
                                          // codec
 static int       vo_dga_XServer_mode = 0;// index in mode list for resolution
-                                         // XServer is running
+
+#ifdef HAVE_DGA2
+ static XDGAMode * vo_modelines;
+ static int        vo_modecount;
+#endif
 
 #define MAX_NR_VIDEO_BUFFERS 3
 
@@ -272,8 +276,6 @@
 	uint8_t *data;
 } vo_dga_video_buffer[MAX_NR_VIDEO_BUFFERS];
 
-static Display  *vo_dga_dpy;
-
 /* saved src and dst dimensions for SwScaler */
 static unsigned int scale_srcW = 0,
                     scale_dstW = 0,
@@ -398,7 +400,7 @@
 
 static void check_events(void)
 {
-  int e=vo_x11_check_events(vo_dga_dpy);
+  int e=vo_x11_check_events(mDisplay);
 }
 
 //---------------------------------------------------------
@@ -419,12 +421,12 @@
 	if(1 < vo_dga_nr_video_buffers)
 	{
 #ifdef HAVE_DGA2
-		XDGASetViewport(vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 
+		XDGASetViewport(mDisplay, mScreen, 
 				0,
 				CURRENT_VIDEO_BUFFER.y, 
 				XDGAFlipRetrace);
 #else
-		XF86DGASetViewPort(vo_dga_dpy, XDefaultScreen(vo_dga_dpy),
+		XF86DGASetViewPort(mDisplay, mScreen,
 				   0,
 				   CURRENT_VIDEO_BUFFER.y);
 #endif
@@ -492,36 +494,38 @@
   XDGADevice *dgadevice;
 #endif
 
+  if ( !vo_config_count ) return;
+
   if(vo_dga_is_running){	
     vo_dga_is_running = 0;
     mp_msg(MSGT_VO,  MSGL_V, "vo_dga: in uninit\n");
     if(vo_grabpointer)
-    XUngrabPointer (vo_dga_dpy, CurrentTime);
-    XUngrabKeyboard (vo_dga_dpy, CurrentTime);
+    XUngrabPointer (mDisplay, CurrentTime);
+    XUngrabKeyboard (mDisplay, CurrentTime);
 #ifdef HAVE_DGA2
-    XDGACloseFramebuffer(vo_dga_dpy, XDefaultScreen(vo_dga_dpy));
-    dgadevice = XDGASetMode(vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 0);
+    XDGACloseFramebuffer(mDisplay, mScreen);
+    dgadevice = XDGASetMode(mDisplay, mScreen, 0);
     if(dgadevice != NULL){
       XFree(dgadevice);	
     }
 #else
-    XF86DGADirectVideo (vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 0);
+    XF86DGADirectVideo (mDisplay, mScreen, 0);
     // first disable DirectVideo and then switch mode back!	
 #ifdef HAVE_XF86VM
     if (vo_dga_vidmodes != NULL ){
-      int screen; screen=XDefaultScreen( vo_dga_dpy );
+      int screen; screen=XDefaultScreen( mDisplay );
       mp_msg(MSGT_VO, MSGL_V, "vo_dga: VidModeExt: Switching back..\n");
       // seems some graphics adaptors need this more than once ...
-      XF86VidModeSwitchToMode(vo_dga_dpy,screen,vo_dga_vidmodes[0]);
-      XF86VidModeSwitchToMode(vo_dga_dpy,screen,vo_dga_vidmodes[0]);
-      XF86VidModeSwitchToMode(vo_dga_dpy,screen,vo_dga_vidmodes[0]);
-      XF86VidModeSwitchToMode(vo_dga_dpy,screen,vo_dga_vidmodes[0]);
+      XF86VidModeSwitchToMode(mDisplay,screen,vo_dga_vidmodes[0]);
+      XF86VidModeSwitchToMode(mDisplay,screen,vo_dga_vidmodes[0]);
+      XF86VidModeSwitchToMode(mDisplay,screen,vo_dga_vidmodes[0]);
+      XF86VidModeSwitchToMode(mDisplay,screen,vo_dga_vidmodes[0]);
       XFree(vo_dga_vidmodes);
     }
 #endif
 #endif
-    XCloseDisplay(vo_dga_dpy);
   }
+  vo_x11_uninit();
 }
 
 
@@ -641,24 +645,24 @@
   int x_off, y_off;
   int wanted_width, wanted_height;
 
-  unsigned char *vo_dga_base;
+  static unsigned char *vo_dga_base;
+  static int prev_width, prev_height;
 #ifdef HAVE_DGA2
   // needed to change DGA video mode
-  int modecount, mX=VO_DGA_INVALID_RES, mY=VO_DGA_INVALID_RES , mVBI=100000, mMaxY=0, i,j=0;
+  int mX=VO_DGA_INVALID_RES, mY=VO_DGA_INVALID_RES , mVBI=100000, mMaxY=0, i,j=0;
   int dga_modenum;
-  XDGAMode   *modelines=NULL, *modeline;
+  XDGAMode   *modeline;
   XDGADevice *dgadevice;
 #else
 #ifdef HAVE_XF86VM
   unsigned int vm_event, vm_error;
   unsigned int vm_ver, vm_rev;
   int i, j=0, have_vm=0;
-  int modecount, mX=VO_DGA_INVALID_RES, mY=VO_DGA_INVALID_RES, mVBI=100000, mMaxY=0, dga_modenum;  
+  int mX=VO_DGA_INVALID_RES, mY=VO_DGA_INVALID_RES, mVBI=100000, mMaxY=0, dga_modenum;  
 #endif
   int bank, ram;
 #endif
 
-  if( vo_dga_is_running )return -1;
   vo_dga_src_format = format;
 
   wanted_width = d_width;
@@ -692,13 +696,8 @@
     return 1;
   }
   
-  if((vo_dga_dpy = XOpenDisplay(0))==NULL){
-    mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: Can't open display\n");
-    return 1;
-  } 
-
-  vo_dga_vp_width = DisplayWidth( vo_dga_dpy, DefaultScreen(vo_dga_dpy));
-  vo_dga_vp_height = DisplayHeight( vo_dga_dpy, DefaultScreen(vo_dga_dpy));
+  vo_dga_vp_width = vo_screenwidth;
+  vo_dga_vp_height = vo_screenheight;
 
   mp_msg(MSGT_VO, MSGL_V, "vo_dga: XServer res: %dx%d\n", 
                      vo_dga_vp_width, vo_dga_vp_height);
@@ -708,13 +707,10 @@
 #ifdef HAVE_DGA2
 // Code to change the video mode added by Michael Graffam
 // mgraffam@idsi.net
-  if (modelines==NULL)
-    modelines=XDGAQueryModes(vo_dga_dpy, XDefaultScreen(vo_dga_dpy),&modecount);
 
-  mp_msg(MSGT_VO, MSGL_V,
-	    "vo_dga: modelines=%p, modecount=%d\n", modelines, modecount);
+  mp_msg(MSGT_VO, MSGL_V, "vo_dga: vo_modelines=%p, vo_modecount=%d\n", vo_modelines, vo_modecount);
 
-  if (modelines == NULL)
+  if (vo_modelines == NULL)
   {
     mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: can't get modelines\n");
     return 1;
@@ -722,23 +718,23 @@
   
   mp_msg(MSGT_VO, MSGL_INFO, 
             "vo_dga: DGA 2.0 available :-) Can switch resolution AND depth!\n");	
-  for (i=0; i<modecount; i++)
+  for (i=0; i<vo_modecount; i++)
   {
-    if(vd_ModeEqual( modelines[i].depth, 
-                     modelines[i].bitsPerPixel,
-                     modelines[i].redMask,
-		     modelines[i].greenMask,
-	             modelines[i].blueMask,
+    if(vd_ModeEqual( vo_modelines[i].depth, 
+                     vo_modelines[i].bitsPerPixel,
+                     vo_modelines[i].redMask,
+		     vo_modelines[i].greenMask,
+	             vo_modelines[i].blueMask,
                      vo_dga_hw_mode)){
 
        mp_msg(MSGT_VO, MSGL_V, "maxy: %4d, depth: %2d, %4dx%4d, ", 
-                       modelines[i].maxViewportY, modelines[i].depth,
-		       modelines[i].imageWidth, modelines[i].imageHeight );
-       if ( check_res(i, wanted_width, wanted_height, modelines[i].depth,  
-                  modelines[i].viewportWidth, 
-                  modelines[i].viewportHeight, 
-                  (unsigned) modelines[i].verticalRefresh, 
-		  modelines[i].maxViewportY,
+                       vo_modelines[i].maxViewportY, vo_modelines[i].depth,
+		       vo_modelines[i].imageWidth, vo_modelines[i].imageHeight );
+       if ( check_res(i, wanted_width, wanted_height, vo_modelines[i].depth,  
+                  vo_modelines[i].viewportWidth, 
+                  vo_modelines[i].viewportHeight, 
+                  (unsigned) vo_modelines[i].verticalRefresh, 
+		  vo_modelines[i].maxViewportY,
                    &mX, &mY, &mVBI, &mMaxY )) j = i;
      }
   }
@@ -776,12 +772,9 @@
     height = scale_dstH;
   }
 
-  vo_dga_width = modelines[j].bytesPerScanline / HW_MODE.vdm_bytespp ;
-  dga_modenum =  modelines[j].num;
-  modeline = modelines + j;
-  
-  XFree(modelines);
-  modelines = NULL;
+  vo_dga_width = vo_modelines[j].bytesPerScanline / HW_MODE.vdm_bytespp ;
+  dga_modenum =  vo_modelines[j].num;
+  modeline = vo_modelines + j;
   
 #else
 
@@ -790,8 +783,8 @@
   mp_msg(MSGT_VO,  MSGL_INFO, 
      "vo_dga: DGA 1.0 compatibility code: Using XF86VidMode for mode switching!\n");
 
-  if (XF86VidModeQueryExtension(vo_dga_dpy, &vm_event, &vm_error)) {
-    XF86VidModeQueryVersion(vo_dga_dpy, &vm_ver, &vm_rev);
+  if (XF86VidModeQueryExtension(mDisplay, &vm_event, &vm_error)) {
+    XF86VidModeQueryVersion(mDisplay, &vm_ver, &vm_rev);
     mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: XF86VidMode Extension v%i.%i\n", vm_ver, vm_rev);
     have_vm=1;
   } else {
@@ -801,9 +794,8 @@
 #define GET_VREFRESH(dotclk, x, y)( (((dotclk)/(x))*1000)/(y) )
   
   if (have_vm) {
-    int screen;
-    screen=XDefaultScreen(vo_dga_dpy);
-    XF86VidModeGetAllModeLines(vo_dga_dpy,screen,&modecount,&vo_dga_vidmodes);
+    int modecount;
+    XF86VidModeGetAllModeLines(mDisplay,mScreen,&modecount,&vo_dga_vidmodes);
 
     if(vo_dga_vidmodes != NULL ){
       for (i=0; i<modecount; i++){
@@ -876,48 +868,51 @@
   
 // now lets start the DGA thing 
 
+ if ( !vo_config_count || width != prev_width || height != prev_height )
+  {
 #ifdef HAVE_DGA2
-    
-  if (!XDGAOpenFramebuffer(vo_dga_dpy, XDefaultScreen(vo_dga_dpy))){
-    mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: Framebuffer mapping failed!!!\n");
-    XCloseDisplay(vo_dga_dpy);
-    return 1;
+
+  if (!XDGAOpenFramebuffer(mDisplay, mScreen)){
+   mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: Framebuffer mapping failed!!!\n");
+   return 1;
   }
-  dgadevice=XDGASetMode(vo_dga_dpy, XDefaultScreen(vo_dga_dpy), dga_modenum);
-  XDGASync(vo_dga_dpy, XDefaultScreen(vo_dga_dpy));
+
+  dgadevice=XDGASetMode(mDisplay, mScreen, dga_modenum);
+  XDGASync(mDisplay, mScreen);
 
   vo_dga_base = dgadevice->data;
   XFree(dgadevice);
 
-  XDGASetViewport (vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 0, 0, XDGAFlipRetrace);
-  
+  XDGASetViewport (mDisplay, mScreen, 0, 0, XDGAFlipRetrace);
+    
 #else
-  
+
 #ifdef HAVE_XF86VM
   if (have_vm)
   {
-    XF86VidModeLockModeSwitch(vo_dga_dpy,XDefaultScreen(vo_dga_dpy),0);
+    XF86VidModeLockModeSwitch(mDisplay,mScreen,0);
     // Two calls are needed to switch modes on my ATI Rage 128. Why?
     // for riva128 one call is enough!
-    XF86VidModeSwitchToMode(vo_dga_dpy,XDefaultScreen(vo_dga_dpy),vo_dga_vidmodes[dga_modenum]);
-    XF86VidModeSwitchToMode(vo_dga_dpy,XDefaultScreen(vo_dga_dpy),vo_dga_vidmodes[dga_modenum]);
+    XF86VidModeSwitchToMode(mDisplay,mScreen,vo_dga_vidmodes[dga_modenum]);
+    XF86VidModeSwitchToMode(mDisplay,mScreen,vo_dga_vidmodes[dga_modenum]);
   }
 #endif
   
-  XF86DGAGetViewPortSize(vo_dga_dpy,XDefaultScreen(vo_dga_dpy),
+  XF86DGAGetViewPortSize(mDisplay,mScreen,
 		         &vo_dga_vp_width,
 			 &vo_dga_vp_height); 
 
-  XF86DGAGetVideo (vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 
+  XF86DGAGetVideo (mDisplay, mScreen, 
 		   (char **)&vo_dga_base, &vo_dga_width, &bank, &ram);
 
-  XF86DGADirectVideo (vo_dga_dpy, XDefaultScreen(vo_dga_dpy),
+  XF86DGADirectVideo (mDisplay, mScreen,
                       XF86DGADirectGraphics | XF86DGADirectMouse |
                       XF86DGADirectKeyb);
   
-  XF86DGASetViewPort (vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 0, 0);
+  XF86DGASetViewPort (mDisplay, mScreen, 0, 0);
 
 #endif
+  }
 
   // do some more checkings here ...
 
@@ -947,22 +942,26 @@
          vo_dga_vp_offset, vo_dga_vp_skip, vo_dga_bytes_per_line);
 
   
-  XGrabKeyboard (vo_dga_dpy, DefaultRootWindow(vo_dga_dpy), True, 
+  XGrabKeyboard (mDisplay, DefaultRootWindow(mDisplay), True, 
                  GrabModeAsync,GrabModeAsync, CurrentTime);
   if(vo_grabpointer)
-  XGrabPointer (vo_dga_dpy, DefaultRootWindow(vo_dga_dpy), True, 
+  XGrabPointer (mDisplay, DefaultRootWindow(mDisplay), True, 
                 ButtonPressMask,GrabModeAsync, GrabModeAsync, 
                 None, None, CurrentTime);
 
-  init_video_buffers(vo_dga_base,
+  if ( !vo_config_count || width != prev_width || height != prev_height )
+   {
+    init_video_buffers(vo_dga_base,
 		     vo_dga_vp_height,
 		     vo_dga_width * HW_MODE.vdm_bytespp,
-#if HAVE_DGA2
+#ifdef HAVE_DGA2
 		     modeline->maxViewportY,
 #else
 		     vo_dga_vp_height,
 #endif
 		     vo_doublebuffering);
+     prev_width=width; prev_height=height;
+    } 
 
   mp_msg(MSGT_VO, MSGL_V, "vo_dga: Using %d frame buffer%s.\n",
 	    vo_dga_nr_video_buffers, vo_dga_nr_video_buffers == 1 ? "" : "s");
@@ -985,10 +984,6 @@
 
  if(dga_depths_init == 0){ // FIXME!?
    int i;
-#ifdef HAVE_DGA2	
-   XDGAMode *modelines;
-   int       modecount;
-#endif
 
    vo_dga_XServer_mode = vd_ValidateMode(vo_depthonscreen);
 
@@ -1003,26 +998,25 @@
    //}                                
  
 #ifdef HAVE_DGA2
-   modelines=XDGAQueryModes(mDisplay, mScreen, &modecount);
-   if(modelines){
-     for(i=0; i< modecount; i++){
+   vo_modelines=XDGAQueryModes(mDisplay, mScreen, &vo_modecount);
+   if(vo_modelines){
+     for(i=0; i< vo_modecount; i++){
         mp_msg(MSGT_VO, MSGL_V, "vo_dga: (%03d) depth=%d, bpp=%d, r=%08x, g=%08x, b=%08x, %d x %d\n",
 	  	i,
-		modelines[i].depth,
-		modelines[i].bitsPerPixel,
-		modelines[i].redMask,
-		modelines[i].greenMask,
-	        modelines[i].blueMask,
-	 	modelines[i].viewportWidth,
-		modelines[i].viewportHeight);			  
+		vo_modelines[i].depth,
+		vo_modelines[i].bitsPerPixel,
+		vo_modelines[i].redMask,
+		vo_modelines[i].greenMask,
+	        vo_modelines[i].blueMask,
+	 	vo_modelines[i].viewportWidth,
+		vo_modelines[i].viewportHeight);			  
         vd_EnableMode(
-		modelines[i].depth,
-		modelines[i].bitsPerPixel,
-		modelines[i].redMask,
-		modelines[i].greenMask,
-	        modelines[i].blueMask);
+		vo_modelines[i].depth,
+		vo_modelines[i].bitsPerPixel,
+		vo_modelines[i].redMask,
+		vo_modelines[i].greenMask,
+	        vo_modelines[i].blueMask);
      }
-     XFree(modelines);
    }
 #endif
    dga_depths_init = 1;