comparison libvo/vo_dga.c @ 720:8146b106816a

- now chooses mode with highest ymax (enables doublebuffering in some cases it didn't work before) - use my own memcopy() on non MMX machines again - do memcpy() in one single block if stride==0
author acki2
date Mon, 07 May 2001 19:16:04 +0000
parents 3693fd4c4ec2
children 83919c1b9924
comparison
equal deleted inserted replaced
719:26786fde68a9 720:8146b106816a
21 * BGR_32_24_888 21 * BGR_32_24_888
22 * 22 *
23 * - works only on x86 architectures 23 * - works only on x86 architectures
24 * 24 *
25 * $Log$ 25 * $Log$
26 * Revision 1.22 2001/05/07 19:16:04 acki2
27 * - now chooses mode with highest ymax (enables doublebuffering in some cases
28 * it didn't work before)
29 * - use my own memcopy() on non MMX machines again
30 * - do memcpy() in one single block if stride==0
31 *
26 * Revision 1.21 2001/05/03 22:39:38 acki2 32 * Revision 1.21 2001/05/03 22:39:38 acki2
27 * - finally: 15to16 conversion included!!! 33 * - finally: 15to16 conversion included!!!
28 * 34 *
29 * Revision 1.20 2001/05/02 23:21:27 acki2 35 * Revision 1.20 2001/05/02 23:21:27 acki2
30 * - now we use fastmemcpy() for copying. Saves about 25% of copying time on K6-2+ 36 * - now we use fastmemcpy() for copying. Saves about 25% of copying time on K6-2+
376 : \ 382 : \
377 : "a" (d_add), "b" (count), "S" (src), "D" (dest), \ 383 : "a" (d_add), "b" (count), "S" (src), "D" (dest), \
378 "d" (numwords) \ 384 "d" (numwords) \
379 : "memory" ) 385 : "memory" )
380 386
387 // quick & dirty - for debugging only
388
389 void fillblock(char *strt, int yoff, int lines, int val){
390 char *i;
391 for(i = strt + yoff * vo_dga_width *HW_MODE.vdm_bytespp;
392 i< strt + (lines+yoff) * vo_dga_width *HW_MODE.vdm_bytespp; ){
393 *i++ = val;
394 }
395 }
396
381 397
382 //--------------------------------------------------------- 398 //---------------------------------------------------------
383 399
384 static uint32_t draw_frame( uint8_t *src[] ){ 400 static uint32_t draw_frame( uint8_t *src[] ){
385 401
392 s = *src; 408 s = *src;
393 d = (&((char *)vo_dga_base)[vo_dga_vp_offset + vo_dga_dbf_current * vo_dga_dbf_mem_offset]); 409 d = (&((char *)vo_dga_base)[vo_dga_vp_offset + vo_dga_dbf_current * vo_dga_dbf_mem_offset]);
394 410
395 switch(SRC_MODE.vdm_conversion_func){ 411 switch(SRC_MODE.vdm_conversion_func){
396 case VDM_CONV_NATIVE: 412 case VDM_CONV_NATIVE:
397 {int i; 413
398 for(i=0; i< vo_dga_lines; i++){ 414 #ifdef HAVE_MMX
415 // use the code from fastmemcpy.h
416 if(vo_dga_vp_skip){
417 // use some stride ...
418 int i;
419 for(i=0; i< vo_dga_lines; i++){
399 memcpy(d, s, vo_dga_bytes_per_line); 420 memcpy(d, s, vo_dga_bytes_per_line);
400 d+=vo_dga_vp_skip; 421 d+=vo_dga_vp_skip;
401 d+=vo_dga_bytes_per_line; 422 d+=vo_dga_bytes_per_line;
402 s+=vo_dga_bytes_per_line; 423 s+=vo_dga_bytes_per_line;
403 } 424 }
404 } 425 }else{
426 // no stride, cool + fast ...
427 memcpy(d,s, vo_dga_bytes_per_line * vo_dga_lines);
428 }
429 #else
430 // use some homebrewn assembly code ...
431 rep_movsl(d, s, lpl, vo_dga_vp_skip, numlines );
432 #endif
405 433
406 434 // DBG-COde
407 // rep_movsl(d, s, lpl, vo_dga_vp_skip, numlines ); 435
436 #if 0
437 d = (&((char *)vo_dga_base)[vo_dga_vp_offset + vo_dga_dbf_current * vo_dga_dbf_mem_offset]);
438 fillblock(d, 0, 10, 0x800000ff);
439 fillblock(d, 10, 10, 0x8000ff00);
440 fillblock(d, 20, 10, 0x80ff0000);
441 fillblock(d, 30, 10, 0xff0000ff);
442 fillblock(d, 40, 10, 0x800000ff);
443 fillblock(d, 50, 10, 0x0f0000ff);
444 #endif
408 break; 445 break;
409 case VDM_CONV_15TO16: 446 case VDM_CONV_15TO16:
410 { 447 {
411 int i; 448 int i;
412 char *e; 449 char *e;
433 int i,k,l,m; 470 int i,k,l,m;
434 for(i = 0; i< vo_dga_lines; i++ ){ 471 for(i = 0; i< vo_dga_lines; i++ ){
435 for(k = 0; k< vo_dga_src_width; k+=2 ){ 472 for(k = 0; k< vo_dga_src_width; k+=2 ){
436 l = *(((uint32_t *)s)++); 473 l = *(((uint32_t *)s)++);
437 m = (l & 0xff000000)>> 24 ; 474 m = (l & 0xff000000)>> 24 ;
438 *(((uint32_t *)d)++) = l & 0x00ffffff; 475 *(((uint32_t *)d)++) = (l & 0x00ffffff); // | 0x80000000;
439 m |= *(((uint16_t *)s)++) << 8; 476 m |= *(((uint16_t *)s)++) << 8;
440 *(((uint32_t *)d)++) = m; 477 *(((uint32_t *)d)++) = m; // | 0x80000000 ;
441 } 478 }
442 d+= vp_skip; 479 d+= vp_skip;
443 } 480 }
444 } 481 }
445 //printf("vo_dga: 24 to 32 not implemented yet!!!\n"); 482 //printf("vo_dga: 24 to 32 not implemented yet!!!\n");
639 //---------------------------------------------------------- 676 //----------------------------------------------------------
640 // TODO: check for larger maxy value 677 // TODO: check for larger maxy value
641 // (useful for double buffering!!!) 678 // (useful for double buffering!!!)
642 679
643 int check_res( int num, int x, int y, int bpp, 680 int check_res( int num, int x, int y, int bpp,
644 int new_x, int new_y, int new_vbi, 681 int new_x, int new_y, int new_vbi, int new_maxy,
645 int *old_x, int *old_y, int *old_vbi){ 682 int *old_x, int *old_y, int *old_vbi, int *old_maxy){
646 683
647 vd_printf(VD_RES, "vo_dga: (%3d) Trying %4d x %4d @ %3d Hz @ depth %2d ..", 684 vd_printf(VD_RES, "vo_dga: (%3d) Trying %4d x %4d @ %3d Hz @ depth %2d ..",
648 num, new_x, new_y, new_vbi, bpp ); 685 num, new_x, new_y, new_vbi, bpp );
649 vd_printf(VD_RES, "(old: %dx%d@%d).", *old_x, *old_y, *old_vbi); 686 vd_printf(VD_RES, "(old: %dx%d@%d).", *old_x, *old_y, *old_vbi);
650 if ( 687 if (
683 *old_vbi >= 50 && 720 *old_vbi >= 50 &&
684 new_vbi < *old_vbi && 721 new_vbi < *old_vbi &&
685 new_vbi >= 50 722 new_vbi >= 50
686 ) 723 )
687 ) 724 )
725 ||
726 // if everything is equal, then use the mode with the lower
727 // stride
728 (
729 (new_x == *old_x) &&
730 (new_y == *old_y) &&
731 (new_vbi == *old_vbi) &&
732 (new_maxy > *old_maxy)
733 )
688 ) 734 )
689 ) 735 )
690 ) 736 )
691 { 737 {
692 *old_x = new_x; 738 *old_x = new_x;
693 *old_y = new_y; 739 *old_y = new_y;
740 *old_maxy = new_maxy;
694 *old_vbi = new_vbi; 741 *old_vbi = new_vbi;
695 vd_printf(VD_RES, ".ok!!\n"); 742 vd_printf(VD_RES, ".ok!!\n");
696 return 1; 743 return 1;
697 }else{ 744 }else{
698 vd_printf(VD_RES, ".no\n"); 745 vd_printf(VD_RES, ".no\n");
712 int x_off, y_off; 759 int x_off, y_off;
713 int wanted_width, wanted_height; 760 int wanted_width, wanted_height;
714 761
715 #ifdef HAVE_DGA2 762 #ifdef HAVE_DGA2
716 // needed to change DGA video mode 763 // needed to change DGA video mode
717 int modecount, mX=100000, mY=100000 , mVBI=100000, i,j=0; 764 int modecount, mX=100000, mY=100000 , mVBI=100000, mMaxY=0, i,j=0;
718 int dga_modenum; 765 int dga_modenum;
719 XDGAMode *modelines=NULL; 766 XDGAMode *modelines=NULL;
720 XDGADevice *dgadevice; 767 XDGADevice *dgadevice;
721 int max_vpy_pos; 768 int max_vpy_pos;
722 #else 769 #else
723 #ifdef HAVE_XF86VM 770 #ifdef HAVE_XF86VM
724 unsigned int vm_event, vm_error; 771 unsigned int vm_event, vm_error;
725 unsigned int vm_ver, vm_rev; 772 unsigned int vm_ver, vm_rev;
726 int i, j=0, have_vm=0; 773 int i, j=0, have_vm=0;
727 int modecount, mX=100000, mY=100000, mVBI=100000, dga_modenum; 774 int modecount, mX=100000, mY=100000, mVBI=100000, mMaxY=0, dga_modenum;
728 #endif 775 #endif
729 int bank, ram; 776 int bank, ram;
730 #endif 777 #endif
731 778
732 if( vo_dga_is_running )return -1; 779 if( vo_dga_is_running )return -1;
801 modelines[i].maxViewportY, modelines[i].depth, 848 modelines[i].maxViewportY, modelines[i].depth,
802 modelines[i].imageWidth, modelines[i].imageHeight ); 849 modelines[i].imageWidth, modelines[i].imageHeight );
803 if ( check_res(i, wanted_width, wanted_height, modelines[i].depth, 850 if ( check_res(i, wanted_width, wanted_height, modelines[i].depth,
804 modelines[i].viewportWidth, 851 modelines[i].viewportWidth,
805 modelines[i].viewportHeight, 852 modelines[i].viewportHeight,
806 (unsigned) modelines[i].verticalRefresh, 853 (unsigned) modelines[i].verticalRefresh,
807 &mX, &mY, &mVBI )) j = i; 854 modelines[i].maxViewportY,
855 &mX, &mY, &mVBI, &mMaxY )) j = i;
808 } 856 }
809 } 857 }
810 vd_printf(VD_INFO, 858 vd_printf(VD_INFO,
811 "vo_dga: Selected hardware mode %4d x %4d @ %3d Hz @ depth %2d, bitspp %2d.\n", 859 "vo_dga: Selected hardware mode %4d x %4d @ %3d Hz @ depth %2d, bitspp %2d.\n",
812 mX, mY, mVBI, 860 mX, mY, mVBI,
855 vo_dga_vidmodes[i]->hdisplay, 903 vo_dga_vidmodes[i]->hdisplay,
856 vo_dga_vidmodes[i]->vdisplay, 904 vo_dga_vidmodes[i]->vdisplay,
857 GET_VREFRESH(vo_dga_vidmodes[i]->dotclock, 905 GET_VREFRESH(vo_dga_vidmodes[i]->dotclock,
858 vo_dga_vidmodes[i]->htotal, 906 vo_dga_vidmodes[i]->htotal,
859 vo_dga_vidmodes[i]->vtotal), 907 vo_dga_vidmodes[i]->vtotal),
860 &mX, &mY, &mVBI )) j = i; 908 0,
909 &mX, &mY, &mVBI, &mMaxY )) j = i;
861 } 910 }
862 911
863 vd_printf(VD_INFO, 912 vd_printf(VD_INFO,
864 "vo_dga: Selected video mode %4d x %4d @ %3d Hz @ depth %2d, bitspp %2d, video %3d x %3d.\n", 913 "vo_dga: Selected video mode %4d x %4d @ %3d Hz @ depth %2d, bitspp %2d, video %3d x %3d.\n",
865 mX, mY, mVBI, 914 mX, mY, mVBI,