Ticket #5911: goom-simd.patch

File goom-simd.patch, 11.1 KB (added by foobum@…, 11 years ago)
  • mythplugins/mythmusic/mythmusic/goom/filters.c

    diff --git a/mythplugins/mythmusic/mythmusic/goom/filters.c b/mythplugins/mythmusic/mythmusic/goom/filters.c
    index 0220e4d..3f8e15b 100644
    a b extern volatile guint32 c_resoly; 
    3636void c_zoom (unsigned int *expix1, unsigned int *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD);
    3737
    3838#ifdef MMX
    39 
     39void    zoom_filter_sse2 (int prevX, int prevY, unsigned int *expix1, unsigned int *expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
     40int     zoom_filter_sse2_supported ();
    4041void    zoom_filter_xmmx (int prevX, int prevY, unsigned int *expix1, unsigned int *expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
    4142int     zoom_filter_xmmx_supported ();
    4243void    zoom_filter_mmx (int prevX, int prevY, unsigned int *expix1, unsigned int *expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
    4344int     zoom_filter_mmx_supported ();
    4445
     46static int zf_use_sse2 = 0;
    4547static int zf_use_xmmx = 0;
    4648static int zf_use_mmx = 0;
    4749
    4850static void select_zoom_filter () {
    4951        static int firsttime = 1;
    5052        if (firsttime){
    51                 if (zoom_filter_xmmx_supported()) {
     53                if (zoom_filter_sse2_supported()) {
     54                        zf_use_sse2 = 1;
     55                        printf("SSE2 detected. Using fastest method !\n");
     56                }
     57                else if (zoom_filter_xmmx_supported()) {
    5258                        zf_use_xmmx = 1;
    53                         printf ("Extended MMX detected. Using the fastest method !\n");
     59                        printf ("Extended MMX detected. Using a faster method !\n");
    5460                }
    55                 else if (zoom_filter_mmx_supported()) {
     61                else if (zoom_filter_mmx_supported()) {
    5662                        zf_use_mmx = 1;
    5763                        printf ("MMX detected. Using fast method !\n");
    5864                }
    zoomFilterFastRGB (Uint * pix1, Uint * pix2, ZoomFilterData * zf, Uint resx, Uin 
    696702
    697703#ifdef USE_ASM
    698704#ifdef MMX
    699         if (zf_use_xmmx)
    700                 zoom_filter_xmmx (prevX, prevY,expix1, expix2,
    701                                                                                         brutS, brutD, buffratio, precalCoef);
     705        if (zf_use_sse2)
     706                zoom_filter_sse2(prevX, prevY, expix1, expix2, brutS, brutD,
     707                                 buffratio, precalCoef);
     708        else if (zf_use_xmmx)
     709                zoom_filter_xmmx(prevX, prevY,expix1, expix2, brutS, brutD,
     710                                 buffratio, precalCoef);
    702711        else if (zf_use_mmx)
    703                 zoom_filter_mmx (prevX, prevY,expix1, expix2,
    704                                                                                  brutS, brutD, buffratio, precalCoef);
     712                zoom_filter_mmx(prevX, prevY,expix1, expix2, brutS, brutD,
     713                                buffratio, precalCoef);
    705714        else c_zoom (expix1, expix2, prevX, prevY, brutS, brutD);
    706715#endif
    707716
    708717#ifdef POWERPC
    709718        if (useAltivec)
    710 {
    711             ppc_zoom (expix1, expix2, prevX, prevY, brutS, brutD, buffratio,precalCoef);
    712 }
     719            ppc_zoom (expix1, expix2, prevX, prevY, brutS, brutD,
     720                      buffratio, precalCoef);
    713721        else
    714             ppc_zoom (expix1, expix2, prevX, prevY, brutS, brutD, buffratio,precalCoef);
     722            ppc_zoom (expix1, expix2, prevX, prevY, brutS, brutD,
     723                      buffratio, precalCoef);
    715724#endif
    716725#else
    717726        c_zoom (expix1, expix2, prevX, prevY, brutS, brutD);
    718727#endif
     728
    719729}
    720730
    721731void
  • mythplugins/mythmusic/mythmusic/goom/mythgoom.cpp

    diff --git a/mythplugins/mythmusic/mythmusic/goom/mythgoom.cpp b/mythplugins/mythmusic/mythmusic/goom/mythgoom.cpp
    index 789d97a..89a8b8b 100644
    a b using namespace std; 
    2121
    2222Goom::Goom(long int winid)
    2323{
    24     fps = 20;
     24    fps = 16;
    2525
    2626    surface = NULL;
    2727    buffer = NULL;
  • new file mythplugins/mythmusic/mythmusic/goom/zoom_filter_sse2.c

    diff --git a/mythplugins/mythmusic/mythmusic/goom/zoom_filter_sse2.c b/mythplugins/mythmusic/mythmusic/goom/zoom_filter_sse2.c
    new file mode 100644
    index 0000000..c080a7f
    - +  
     1#ifdef MMX
     2#include "mmx.h"
     3
     4int zoom_filter_sse2_supported ()
     5{
     6    return (mm_support() & 0x10);
     7}
     8
     9void zoom_filter_sse2(int prevX, int prevY, unsigned int *expix1,
     10                      unsigned int *expix2, int *lbruS, int *lbruD,
     11                      int buffratio, int precalCoef[16][16])
     12{
     13    int pos1x, pos1y, pos2x, pos2y;
     14    int coeff1, coeff2;
     15    long pos1, pos2;
     16    unsigned long count, cnt;
     17    unsigned int bufsize = prevX * prevY;
     18    unsigned int ax = (prevX - 1) << 4, ay = (prevY - 1) << 4;
     19   
     20    asm volatile (
     21        "pxor       %%xmm5, %%xmm5    \n\t"
     22        ::
     23    );
     24
     25    for(count = 0; count < bufsize; count += 2)
     26    {
     27        cnt = count << 1;
     28
     29        asm volatile (
     30            "movdqu     %4, %%xmm0      \n\t" // lbruS2y lbruS2x lbruS1y lbruS1x
     31            "movd       %6, %%xmm2      \n\t"
     32            "movdqu     %5, %%xmm1      \n\t" // lbruD2y lbruD2x lbruD1y lbruD1x
     33            "punpckldq  %%xmm2, %%xmm2  \n\t"
     34            "psubd      %%xmm0, %%xmm1  \n\t" // lbruD - lbruS
     35            "punpckldq  %%xmm2, %%xmm2  \n\t"
     36            "pmullw     %%xmm2, %%xmm1  \n\t" // * buffratio
     37            "psrld      $16, %%xmm1     \n\t" // >> 16
     38            "paddd      %%xmm1, %%xmm0  \n\t"
     39            "movdqa     %%xmm0, %%xmm1  \n\t"
     40            "pcmpgtd    %%xmm5, %%xmm0  \n\t"
     41            "pand       %%xmm0, %%xmm1  \n\t"
     42            "movd       %%xmm1, %0      \n\t"
     43            "psrldq     $4, %%xmm1      \n\t"
     44            "movd       %%xmm1, %1      \n\t"
     45            "psrldq     $4, %%xmm1      \n\t"
     46            "movd       %%xmm1, %2      \n\t"
     47            "psrldq     $4, %%xmm1      \n\t"
     48            "movd       %%xmm1, %3      \n\t"     
     49            :"=r"(pos1x),"=r"(pos1y),"=r"(pos2x),"=r"(pos2y)
     50            :"m"(lbruS[cnt]),"m"(lbruD[cnt]),"r"(buffratio)
     51        );
     52       
     53        coeff1 = precalCoef[pos1x & 0xf][pos1y & 0xf];
     54        coeff2 = precalCoef[pos2x & 0xf][pos2y & 0xf];
     55        pos1 = (pos1x >> 4) + prevX * (pos1y >> 4);
     56        pos2 = (pos2x >> 4) + prevX * (pos2y >> 4);
     57       
     58        if ((pos1y >= (int)ay) || (pos1x >= (int)ax))
     59            pos1 = coeff1 = 0;
     60        if ((pos2y >= (int)ay) || (pos2x >= (int)ax))
     61            pos2 = coeff2 = 0;
     62       
     63        asm volatile (
     64            "movd       %0, %%xmm0      \n\t"
     65            "movd       %1, %%xmm1      \n\t"
     66            "punpcklwd  %%xmm0, %%xmm0  \n\t"
     67            "punpcklwd  %%xmm1, %%xmm1  \n\t"
     68            "movq       (%2,%3,4),%%xmm2\n\t"
     69            "punpcklbw  %%xmm0, %%xmm1  \n\t"
     70            "movq       (%2,%4,4),%%xmm3\n\t"
     71            "punpckldq  %%xmm2, %%xmm3  \n\t"
     72            "movdqa     %%xmm1, %%xmm0  \n\t"
     73            "movdqa     %%xmm3, %%xmm4  \n\t"
     74            "punpcklbw  %%xmm5, %%xmm3  \n\t"
     75            "punpcklbw  %%xmm1, %%xmm1  \n\t"
     76            "punpckhbw  %%xmm5, %%xmm4  \n\t"
     77            "punpcklbw  %%xmm1, %%xmm1  \n\t"
     78            "add        %5, %3          \n\t"
     79            "movdqa     %%xmm1, %%xmm2  \n\t"
     80            "punpckhbw  %%xmm5, %%xmm1  \n\t"
     81            "add        %5, %4          \n\t"
     82            "punpcklbw  %%xmm5, %%xmm2  \n\t"
     83            "pmullw     %%xmm1, %%xmm4  \n\t"
     84            "pmullw     %%xmm2, %%xmm3  \n\t"
     85            "movq       (%2,%3,4),%%xmm2\n\t"
     86            "paddw      %%xmm3, %%xmm4  \n\t"
     87            "movq       (%2,%4,4),%%xmm3\n\t"
     88            "punpckldq  %%xmm2, %%xmm3  \n\t"
     89            "punpckhbw  %%xmm0, %%xmm0  \n\t"
     90            "movdqa     %%xmm3, %%xmm1  \n\t"
     91            "punpcklbw  %%xmm5, %%xmm3  \n\t"
     92            "punpckhbw  %%xmm0, %%xmm0  \n\t"
     93            "punpckhbw  %%xmm5, %%xmm1  \n\t"
     94            "movdqa     %%xmm0, %%xmm2  \n\t"
     95            "punpcklbw  %%xmm5, %%xmm0  \n\t"
     96            "punpckhbw  %%xmm5, %%xmm2  \n\t"
     97            "pmullw     %%xmm0, %%xmm3  \n\t"
     98            "pmullw     %%xmm2, %%xmm1  \n\t"
     99            "paddw      %%xmm3, %%xmm4  \n\t"
     100            "paddw      %%xmm1, %%xmm4  \n\t"
     101            "psrlw      $8, %%xmm4      \n\t"
     102            "packuswb   %%xmm5, %%xmm4  \n\t"
     103            "movq       %%xmm4,(%6,%7,4)\n\t"
     104            ::"m"(coeff1),"m"(coeff2),"r"(expix1),"r"(pos1),"r"(pos2),
     105            "r"((long)prevX),"r"(expix2),"r"(count)
     106        );
     107    }
     108}
     109       
     110#else
     111
     112int zoom_filter_sse2_supported () {
     113        return 0;
     114}
     115void zoom_filter_sse2(int prevX, int prevY, unsigned int *expix1,
     116                      unsigned int *expix2, int *lbruS, int *lbruD,
     117                      int buffratio, int precalCoef[16][16])
     118{
     119    (void) prevX;     (void) prevY;
     120    (void) expix1;    (void) expix2;
     121    (void) lbruS;     (void) lbruD;
     122    (void) buffratio; (void) precalCoef;
     123        return;
     124}
     125
     126#endif // MMX
  • mythplugins/mythmusic/mythmusic/mythmusic.pro

    diff --git a/mythplugins/mythmusic/mythmusic/mythmusic.pro b/mythplugins/mythmusic/mythmusic/mythmusic.pro
    index 2520f2b..7844c98 100644
    a b SOURCES += metaioflacvorbiscomment.cpp metaioavfcomment.cpp 
    5353SOURCES += goom/filters.c goom/goom_core.c goom/graphic.c goom/tentacle3d.c
    5454SOURCES += goom/ifs.c goom/ifs_display.c goom/lines.c goom/surf3d.c
    5555SOURCES += goom/zoom_filter_mmx.c goom/zoom_filter_xmmx.c goom/mythgoom.cpp
     56SOURCES += goom/zoom_filter_sse2.c
    5657SOURCES += avfdecoder.cpp editmetadata.cpp smartplaylist.cpp search.cpp
    5758SOURCES += treebuilders.cpp importmusic.cpp directoryfinder.cpp
    5859SOURCES += filescanner.cpp libvisualplugin.cpp musicplayer.cpp miniplayer.cpp
  • mythplugins/mythmusic/mythmusic/goom/zoom_filter_xmmx.c

    diff --git a/mythplugins/mythmusic/mythmusic/goom/zoom_filter_xmmx.c b/mythplugins/mythmusic/mythmusic/goom/zoom_filter_xmmx.c
    index 3e257fb..c5a0016 100644
    a b  
    11#include <mythtv/mythconfig.h>
    22
    3 #if defined(MMX) && !defined(ARCH_X86_64)
     3#if defined(MMX)
    44/* a definir pour avoir exactement le meme resultat que la fonction C
    55 * (un chouillat plus lent)
    66 */
     
    1717// faire : a / sqrtperte <=> a >> PERTEDEC
    1818#define PERTEDEC 4
    1919
     20#if defined(ARCH_X86_64)
     21#define REG_c "rcx"
     22#define REG_a "rax"
     23#elif defined(ARCH_X86_32)
     24#define REG_c "ecx"
     25#define REG_a "eax"
     26#endif
    2027
    2128//#define MMX_TRACE
    2229#include "mmx.h"
    void zoom_filter_xmmx (int prevX, int prevY, 
    115122                                "movd %%mm0,%%ecx\n"
    116123                                "movq %%mm0,%%mm1\n"
    117124
    118                                 "andl $15,%%ecx\n"
     125                                "and $15,%%"REG_c"\n"
    119126                                "psrlq $32,%%mm1\n"
    120127
    121                                 "shll $6,%%ecx\n"
     128                                "shl $6,%%"REG_c"\n"
    122129                                "movd %%mm1,%%eax\n"
    123130
    124                                 "addl %0,%%ecx\n"
    125                                 "andl $15,%%eax\n"
     131                                "add %0,%%"REG_c"\n"
     132                                "and $15,%%"REG_a"\n"
    126133
    127                                 "movd (%%ecx,%%eax,4),%%mm3\n"
     134                                "movd (%%"REG_c",%%"REG_a",4),%%mm3\n"
    128135                                /* ::"X"(precalCoef):"eax","ecx"); */
    129                                 ::"m"(precalCoef):"eax","ecx");
     136                                ::"m"(precalCoef):REG_a,REG_c);
    130137                               
    131138
    132139                        /*
    void zoom_filter_xmmx (int prevX, int prevY, 
    171178                                /*^*/ "movq %%mm3,%%mm4\n"       /*^*/
    172179                                /*^*/ "movq %%mm3,%%mm5\n"       /*^*/
    173180
    174                                 "movl %0,%%ecx\n"
     181                                "mov %0,%%"REG_c"\n"
    175182                                /*^*/ "punpcklbw %%mm5,%%mm3\n"  /*^*/
    176183
    177                                 "movq (%%ecx,%%eax,4),%%mm0\n"
     184                                "movq (%%"REG_c",%%"REG_a",4),%%mm0\n"
    178185                                /*^*/ "punpckhbw %%mm5,%%mm4\n"  /*^*/
    179186
    180187                                "addl %1,%%eax\n"
    181                                 "movq (%%ecx,%%eax,4),%%mm2\n"
     188                                "movq (%%"REG_c",%%"REG_a",4),%%mm2\n"
    182189                               
    183190                                : : "X"(expix1), "X"(prevX):"eax","ecx"
    184191                                );