[Mplayer-cvslog] CVS: main/libvo vo_dga.c,1.7,1.8

Andreas Ackermann acki2 at users.sourceforge.net
Sat Mar 31 11:16:11 CEST 2001


Update of /cvsroot/mplayer/main/libvo
In directory usw-pr-cvs1:/tmp/cvs-serv12298

Modified Files:
	vo_dga.c 
Log Message:
- added VidMode changing support for DGA1.0 (used code from Michael Graffam (mgraffam at idsi.net))


Index: vo_dga.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_dga.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** vo_dga.c	2001/03/30 23:12:31	1.7
--- vo_dga.c	2001/03/31 09:16:08	1.8
***************
*** 35,38 ****
--- 35,41 ----
   *           depth!!!
   * o Added double buffering :-))
+  * o included VidMode switching support for DGA1.0, written by  Michael Graffam
+  *    mgraffam at idsi.net
+  * 
   */
  
***************
*** 48,52 ****
--- 51,58 ----
  #include "yuv2rgb.h"
  
+ 
  //#undef HAVE_DGA2
+ //#undef HAVE_XF86VM
+ 
  
  LIBVO_EXTERN( dga )
***************
*** 55,58 ****
--- 61,69 ----
  #include <X11/extensions/xf86dga.h>
  
+ #ifdef HAVE_XF86VM
+ #include <X11/extensions/xf86vmode.h>
+ #endif
+ 
+ 
  #include "x11_common.h"
  
***************
*** 65,70 ****
  };
  
  static int       vo_dga_width;           // bytes per line in framebuffer
! static int       vo_dga_vp_width;        // visible pixels per line in framebuffer
  static int       vo_dga_vp_height;       // visible lines in framebuffer
  static int       vo_dga_is_running = 0; 
--- 76,87 ----
  };
  
+ #ifdef HAVE_XF86VM
+ static XF86VidModeModeInfo **vo_dga_vidmodes=NULL;
+ #endif
+ 
+ 
  static int       vo_dga_width;           // bytes per line in framebuffer
! static int       vo_dga_vp_width;        // visible pixels per line in 
!                                          // framebuffer
  static int       vo_dga_vp_height;       // visible lines in framebuffer
  static int       vo_dga_is_running = 0; 
***************
*** 285,303 ****
    XDGADevice *dgadevice;
  #endif
! 	
!   vo_dga_is_running = 0;
!   printf("vo_dga: in uninit\n");
!   XUngrabPointer (vo_dga_dpy, CurrentTime);
!   XUngrabKeyboard (vo_dga_dpy, CurrentTime);
  #ifdef HAVE_DGA2
!   dgadevice = XDGASetMode(vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 0);
!   if(dgadevice != NULL){
!      XFree(dgadevice);	
!   }
!   XDGACloseFramebuffer(vo_dga_dpy, XDefaultScreen(vo_dga_dpy));
  #else
!   XF86DGADirectVideo (vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 0);
  #endif
!   XCloseDisplay(vo_dga_dpy);
  }
  
--- 302,335 ----
    XDGADevice *dgadevice;
  #endif
! 
!   if(vo_dga_is_running){	
!     vo_dga_is_running = 0;
!     printf("vo_dga: in uninit\n");
!     XUngrabPointer (vo_dga_dpy, CurrentTime);
!     XUngrabKeyboard (vo_dga_dpy, CurrentTime);
  #ifdef HAVE_DGA2
!     dgadevice = XDGASetMode(vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 0);
!     if(dgadevice != NULL){
!       XFree(dgadevice);	
!     }
!     XDGACloseFramebuffer(vo_dga_dpy, XDefaultScreen(vo_dga_dpy));
  #else
!     XF86DGADirectVideo (vo_dga_dpy, XDefaultScreen(vo_dga_dpy), 0);
!     // first disable DirectVideo and then switch mode back!	
! #ifdef HAVE_XF86VM
!     if (vo_dga_vidmodes != NULL ){
!       int screen; screen=XDefaultScreen( vo_dga_dpy );
!       printf("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]);
!       XFree(vo_dga_vidmodes);
!     }
! #endif
  #endif
!     XCloseDisplay(vo_dga_dpy);
!   }
  }
  
***************
*** 378,381 ****
--- 410,419 ----
    XDGADevice *dgadevice;
  #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;  
+ #endif
    int bank, ram;
  #endif
***************
*** 395,400 ****
      vo_dga_planes = (format & 0xff);
  
!     // hack!!! here we should only get what we told in query_format()
!     // but mplayer is somewhat generous about 15/16bit depth ...
      
      vo_dga_planes = vo_dga_planes == 15 ? 16 : vo_dga_planes;
--- 433,439 ----
      vo_dga_planes = (format & 0xff);
  
!     // hack!!! here we should only get what we told we can handle in 
!     // query_format() but mplayer is somewhat generous about 
!     // 15/16bit depth ...
      
      vo_dga_planes = vo_dga_planes == 15 ? 16 : vo_dga_planes;
***************
*** 409,412 ****
--- 448,461 ----
    vo_dga_bpp = (vo_dga_planes+7) >> 3;
  
+   // TODO: find out screen resolution of X-Server here and
+   //       provide them as default values (used only in case
+   //       DGA1.0 and no VidMode Ext or VidModeExt doesn't return
+   //       any screens to check if video is larger than current screen)
+ 
+   vo_dga_vp_width = 1280;
+   vo_dga_vp_height = 1024;
+ 
+ 
+ 
  // choose a suitable mode ...
    
***************
*** 462,473 ****
  #else
  
-   printf("vo_dga: DGA 1.0 compatibility code: mode switching not supported (yet)!\n");
  
!   // assume these values are already known at this stage some day 
!   // so that the following check for video <-> screen size can be done ...
!   
!   vo_dga_vp_width = 1280;
!   vo_dga_vp_height = 1024;
    
  #endif
  
--- 511,583 ----
  #else
  
  
! #ifdef HAVE_XF86VM
! 
!   printf("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);
!     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");
!   }
! 
! #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);
+ 
+     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, 
+ 			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");
+ 	}
+       }
+     
+       printf("vo_dga: Selected video mode %4d x %4d @ %3d Hz for image size %3d x %3d.\n", 
+ 	     mX, mY, mVBI, width, height);  
+     }else{
+       printf("vo_dga: XF86VidMode returned no screens - using current resolution.\n");
+     }
+     dga_modenum = j;
+     vo_dga_vp_width = mX;
+     vo_dga_vp_height = mY;
+   }
+ 
+ 
+ #else
+   printf("vo_dga: Only have DGA 1.0 extension and no XF86VidMode :-(\n");
+ #endif
  #endif
  
***************
*** 482,485 ****
--- 592,603 ----
       printf("vo_dga: Sorry, video larger than viewport is not yet supported!\n");
       // ugly, do something nicer in the future ...
+ #ifndef HAVE_DGA2
+ #ifdef HAVE_XF86VM
+      if(vo_dga_vidmodes){
+ 	XFree(vo_dga_vidmodes);
+ 	vo_dga_vidmodes = NULL;
+      }
+ #endif
+ #endif
       return 1;
    }
***************
*** 503,507 ****
    
  #else
! 
    XF86DGAGetViewPortSize(vo_dga_dpy,XDefaultScreen(vo_dga_dpy),
  		         &vo_dga_vp_width,
--- 621,633 ----
    
  #else
!   
! #ifdef HAVE_XF86VM
!     XF86VidModeLockModeSwitch(vo_dga_dpy,XDefaultScreen(vo_dga_dpy),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]);
! #endif
!   
    XF86DGAGetViewPortSize(vo_dga_dpy,XDefaultScreen(vo_dga_dpy),
  		         &vo_dga_vp_width,
***************
*** 549,557 ****
                  ButtonPressMask,GrabModeAsync, GrabModeAsync, 
                  None, None, CurrentTime);
-   
  // TODO: chekc if mem of graphics adaptor is large enough for dbf
  
-   
    // set up variables for double buffering ...
    
    vo_dga_dbf_y_offset = y_off + vo_dga_src_height;
--- 675,682 ----
                  ButtonPressMask,GrabModeAsync, GrabModeAsync, 
                  None, None, CurrentTime);
  // TODO: chekc if mem of graphics adaptor is large enough for dbf
  
    // set up variables for double buffering ...
+   // note: set vo_dga_dbf_mem_offset to NULL to disable doublebuffering
    
    vo_dga_dbf_y_offset = y_off + vo_dga_src_height;
***************
*** 561,571 ****
    if(format ==IMGFMT_YV12 )vo_dga_dbf_mem_offset = 0;
    // disable doublebuffering for YV12
    
    // now clear screen
! 
!   memset(vo_dga_base, 0, vo_dga_width *  
! 	 (vo_dga_vp_height + (vo_dga_dbf_mem_offset != 0 ? (vo_dga_src_height+y_off) : 0)) * 
!          vo_dga_bpp);  
! 
    vo_dga_is_running = 1;
    return 0;
--- 686,701 ----
    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");
    
    // now clear screen
!   {
!     int size = vo_dga_width *
! 	(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);  
!   }
    vo_dga_is_running = 1;
    return 0;


_______________________________________________
Mplayer-cvslog mailing list
Mplayer-cvslog at lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/mplayer-cvslog



More information about the MPlayer-cvslog mailing list