Ticket #5911: goom-sse2-1.patch

File goom-sse2-1.patch, 8.5 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..fa1281f 100644
    a b void c_zoom (unsigned int *expix1, unsigned int *expix2, unsigned int prevX, uns 
    3737
    3838#ifdef MMX
    3939
     40void    zoom_filter_sse2 (int prevX, int prevY, unsigned int *expix1, unsigned int *expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
     41int     zoom_filter_sse2_supported ();
    4042void    zoom_filter_xmmx (int prevX, int prevY, unsigned int *expix1, unsigned int *expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
    4143int     zoom_filter_xmmx_supported ();
    4244void    zoom_filter_mmx (int prevX, int prevY, unsigned int *expix1, unsigned int *expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
    4345int     zoom_filter_mmx_supported ();
    4446
     47static int zf_use_sse2 = 0;
    4548static int zf_use_xmmx = 0;
    4649static int zf_use_mmx = 0;
    4750
    4851static void select_zoom_filter () {
    4952        static int firsttime = 1;
    5053        if (firsttime){
    51                 if (zoom_filter_xmmx_supported()) {
     54                if (zoom_filter_sse2_supported()) {
     55                        zf_use_sse2 = 1;
     56                        printf("SSE2 detected. Using fastest method !\n");
     57                }
     58                else if (zoom_filter_xmmx_supported()) {
    5259                        zf_use_xmmx = 1;
    53                         printf ("Extended MMX detected. Using the fastest method !\n");
     60                        printf ("Extended MMX detected. Using a faster method !\n");
    5461                }
    55                 else if (zoom_filter_mmx_supported()) {
     62                else if (zoom_filter_mmx_supported()) {
    5663                        zf_use_mmx = 1;
    5764                        printf ("MMX detected. Using fast method !\n");
    5865                }
    zoomFilterFastRGB (Uint * pix1, Uint * pix2, ZoomFilterData * zf, Uint resx, Uin 
    696703
    697704#ifdef USE_ASM
    698705#ifdef MMX
    699         if (zf_use_xmmx)
    700                 zoom_filter_xmmx (prevX, prevY,expix1, expix2,
    701                                                                                         brutS, brutD, buffratio, precalCoef);
     706        if (zf_use_sse2)
     707                zoom_filter_sse2(prevX, prevY, expix1, expix2, brutS, brutD,
     708                                 buffratio, precalCoef);
     709        else if (zf_use_xmmx)
     710                zoom_filter_xmmx(prevX, prevY,expix1, expix2, brutS, brutD,
     711                                 buffratio, precalCoef);
    702712        else if (zf_use_mmx)
    703                 zoom_filter_mmx (prevX, prevY,expix1, expix2,
    704                                                                                  brutS, brutD, buffratio, precalCoef);
     713                zoom_filter_mmx(prevX, prevY,expix1, expix2, brutS, brutD,
     714                                buffratio, precalCoef);
    705715        else c_zoom (expix1, expix2, prevX, prevY, brutS, brutD);
    706716#endif
    707717
    708718#ifdef POWERPC
    709719        if (useAltivec)
    710 {
    711             ppc_zoom (expix1, expix2, prevX, prevY, brutS, brutD, buffratio,precalCoef);
    712 }
     720            ppc_zoom (expix1, expix2, prevX, prevY, brutS, brutD,
     721                      buffratio, precalCoef);
    713722        else
    714             ppc_zoom (expix1, expix2, prevX, prevY, brutS, brutD, buffratio,precalCoef);
     723            ppc_zoom (expix1, expix2, prevX, prevY, brutS, brutD,
     724                      buffratio, precalCoef);
    715725#endif
    716726#else
    717727        c_zoom (expix1, expix2, prevX, prevY, brutS, brutD);
    718728#endif
     729       
    719730}
    720731
    721732void
  • 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..e5f573a
    - +  
     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, posX1, posX2;
     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(
     21        "pxor       %%xmm5, %%xmm5    \n\t"
     22        ::
     23    );
     24
     25    for(count = 0; count < bufsize; count += 2)
     26    {
     27        cnt = count << 1;
     28       
     29        pos1x = lbruS[cnt] + (((lbruD[cnt] - lbruS[cnt])*buffratio)>>16);
     30        pos1y = lbruS[cnt+1] + (((lbruD[cnt+1] - lbruS[cnt+1])*buffratio)>>16);
     31        pos2x = lbruS[cnt+2] + (((lbruD[cnt+2] - lbruS[cnt+2])*buffratio)>>16);
     32        pos2y = lbruS[cnt+3] + (((lbruD[cnt+3] - lbruS[cnt+3])*buffratio)>>16);
     33       
     34        if (pos1x < 0) pos1x = 0;
     35        if (pos1y < 0) pos1y = 0;
     36        if (pos2x < 0) pos2x = 0;
     37        if (pos2y < 0) pos2y = 0;
     38       
     39        coeff1 = precalCoef[pos1x & 0xf][pos1y & 0xf];
     40        coeff2 = precalCoef[pos2x & 0xf][pos2y & 0xf];
     41        pos1 = (pos1x >> 4) + prevX * (pos1y >> 4);
     42        pos2 = (pos2x >> 4) + prevX * (pos2y >> 4);
     43       
     44        if ((pos1y >= (int)ay) || (pos1x >= (int)ax))
     45            pos1 = coeff1 = 0;
     46        if ((pos2y >= (int)ay) || (pos2x >= (int)ax))
     47            pos2 = coeff2 = 0;
     48       
     49        posX1 = pos1 + prevX;
     50        posX2 = pos2 + prevX;
     51       
     52        asm(
     53            "movd       %0, %%xmm0      \n\t"
     54            "movd       %1, %%xmm1      \n\t"
     55            "punpcklwd  %%xmm0, %%xmm0  \n\t"
     56            "punpcklwd  %%xmm1, %%xmm1  \n\t"
     57            "movq       (%2,%3,4),%%xmm2\n\t"
     58            "punpcklbw  %%xmm0, %%xmm1  \n\t"
     59            "movq       (%2,%4,4),%%xmm3\n\t"
     60            "punpckldq  %%xmm2, %%xmm3  \n\t"
     61            "movdqa     %%xmm1, %%xmm0  \n\t"
     62            "movdqa     %%xmm3, %%xmm4  \n\t"
     63            "punpcklbw  %%xmm5, %%xmm3  \n\t"
     64            "punpcklbw  %%xmm1, %%xmm1  \n\t"
     65            "punpckhbw  %%xmm5, %%xmm4  \n\t"
     66            "punpcklbw  %%xmm1, %%xmm1  \n\t"
     67            "movdqa     %%xmm1, %%xmm2  \n\t"
     68            "punpckhbw  %%xmm5, %%xmm1  \n\t"
     69            "punpcklbw  %%xmm5, %%xmm2  \n\t"
     70            "pmullw     %%xmm1, %%xmm4  \n\t"
     71            "pmullw     %%xmm2, %%xmm3  \n\t"
     72            "movq       (%2,%5,4),%%xmm2\n\t"
     73            "paddw      %%xmm3, %%xmm4  \n\t"
     74            "movq       (%2,%6,4),%%xmm3\n\t"
     75            "punpckldq  %%xmm2, %%xmm3  \n\t"
     76            "punpckhbw  %%xmm0, %%xmm0  \n\t"
     77            "movdqa     %%xmm3, %%xmm1  \n\t"
     78            "punpcklbw  %%xmm5, %%xmm3  \n\t"
     79            "punpckhbw  %%xmm0, %%xmm0  \n\t"
     80            "punpckhbw  %%xmm5, %%xmm1  \n\t"
     81            "movdqa     %%xmm0, %%xmm2  \n\t"
     82            "punpcklbw  %%xmm5, %%xmm0  \n\t"
     83            "punpckhbw  %%xmm5, %%xmm2  \n\t"
     84            "pmullw     %%xmm0, %%xmm3  \n\t"
     85            "pmullw     %%xmm2, %%xmm1  \n\t"
     86            "paddw      %%xmm3, %%xmm4  \n\t"
     87            "paddw      %%xmm1, %%xmm4  \n\t"
     88            "psrlw      $8, %%xmm4      \n\t"
     89            "packuswb   %%xmm5, %%xmm4  \n\t"
     90            "movq       %%xmm4,(%7,%8,4)\n\t"
     91            ::"r"(coeff1),"r"(coeff2),"r"(expix1),"r"(pos1),"r"(pos2),
     92            "r"(posX1),"r"(posX2),"r"(expix2),"r"(count)
     93        );
     94
     95    }
     96}
     97       
     98#else
     99
     100int zoom_filter_sse2_supported () {
     101        return 0;
     102}
     103void zoom_filter_sse2(int prevX, int prevY, unsigned int *expix1,
     104                      unsigned int *expix2, int *lbruS, int *lbruD,
     105                      int buffratio, int precalCoef[16][16])
     106{
     107    (void) prevX;     (void) prevY;
     108    (void) expix1;    (void) expix2;
     109    (void) lbruS;     (void) lbruD;
     110    (void) buffratio; (void) precalCoef;
     111        return;
     112}
     113
     114#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