Mercurial > mplayer.hg
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, |