[GEM-cvs] Gem/src/Base GemPixObj.cpp,1.19,1.20 GemPixUtil.cpp,1.53,1.54
Brought to you by:
zmoelnig
From: IOhannes m z. <zmo...@us...> - 2006-03-24 15:16:42
|
Update of /cvsroot/pd-gem/Gem/src/Base In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32093 Modified Files: GemPixObj.cpp GemPixUtil.cpp Log Message: initialize (and modify) m_simd via GemSIMD and select optimized algorithms at runtime. Index: GemPixObj.cpp =================================================================== RCS file: /cvsroot/pd-gem/Gem/src/Base/GemPixObj.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** GemPixObj.cpp 22 Mar 2006 23:06:11 -0000 1.19 --- GemPixObj.cpp 24 Mar 2006 15:16:28 -0000 1.20 *************** *** 26,41 **** GemPixObj :: GemPixObj() : orgPixBlock(NULL), m_processOnOff(1), - #ifdef __MMX__ - m_simd(GEM_SIMD_MMX) - #elif defined __SSE2__ - m_simd(GEM_SIMD_SSE2) - #elif defined __VEC__ - m_simd(GEM_SIMD_ALTIVEC) - #else m_simd(GEM_SIMD_NONE) - #endif { cachedPixBlock.newimage=0; cachedPixBlock.newfilm =0; } --- 26,35 ---- GemPixObj :: GemPixObj() : orgPixBlock(NULL), m_processOnOff(1), m_simd(GEM_SIMD_NONE) { cachedPixBlock.newimage=0; cachedPixBlock.newfilm =0; + + m_simd=GemSIMD::getCPU(); } *************** *** 224,227 **** void GemPixObj :: simdMessCallback(void *data, float n) { ! GetMyClass(data)->m_simd=(int)n; } --- 218,221 ---- void GemPixObj :: simdMessCallback(void *data, float n) { ! GetMyClass(data)->m_simd=GemSIMD::requestCPU((int)n); } Index: GemPixUtil.cpp =================================================================== RCS file: /cvsroot/pd-gem/Gem/src/Base/GemPixUtil.cpp,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** GemPixUtil.cpp 23 Mar 2006 17:05:48 -0000 1.53 --- GemPixUtil.cpp 24 Mar 2006 15:16:28 -0000 1.54 *************** *** 62,65 **** --- 62,67 ---- #endif /* __TIMING__ */ + static int m_simd = GemSIMD::getCPU(); + pixBlock :: pixBlock() : newimage(0), newfilm(0) *************** *** 526,534 **** case GL_YUV422_GEM: START_TIMING; #ifdef __SSE2__ ! RGBA_to_UYVY_SSE2(rgbadata, pixelnum, pixels); ! #else ! pixelnum>>=1; ! while(pixelnum--){ *pixels++=((RGB2YUV_21*rgbadata[chRed]+ RGB2YUV_22*rgbadata[chGreen]+ --- 528,543 ---- case GL_YUV422_GEM: START_TIMING; + switch(m_simd){ + #ifdef __VEC__ + case GEM_SIMD_ALTIVEC: + BGRA_to_YCbCr_altivec(bgradata,pixelnum,pixels); + #endif #ifdef __SSE2__ ! case GEM_SIMD_SSE2: ! RGBA_to_UYVY_SSE2(rgbadata,pixelnum,pixels); ! #endif ! case GEM_SIMD_NONE: default: ! pixelnum>>=1; ! while(pixelnum--){ *pixels++=((RGB2YUV_21*rgbadata[chRed]+ RGB2YUV_22*rgbadata[chGreen]+ *************** *** 544,549 **** RGB2YUV_13*rgbadata[4+chBlue])>>8)+ Y_OFFSET; // Y rgbadata+=8; } - #endif STOP_TIMING("RGBA to UYVY"); break; --- 553,558 ---- RGB2YUV_13*rgbadata[4+chBlue])>>8)+ Y_OFFSET; // Y rgbadata+=8; + } } STOP_TIMING("RGBA to UYVY"); break; *************** *** 663,686 **** case GL_YUV422_GEM: START_TIMING; #ifdef __VEC__ ! BGRA_to_YCbCr_altivec(bgradata,pixelnum,pixels); ! #else ! pixelnum>>=1; ! while(pixelnum--){ ! *pixels++=((RGB2YUV_21*bgradata[chRed]+ ! RGB2YUV_22*bgradata[chGreen]+ ! RGB2YUV_23*bgradata[chBlue])>>8)+UV_OFFSET; // U ! *pixels++=((RGB2YUV_11*bgradata[chRed]+ ! RGB2YUV_12*bgradata[chGreen]+ ! RGB2YUV_13*bgradata[chBlue])>>8)+ Y_OFFSET; // Y ! *pixels++=((RGB2YUV_31*bgradata[chRed]+ ! RGB2YUV_32*bgradata[chGreen]+ ! RGB2YUV_33*bgradata[chBlue])>>8)+UV_OFFSET; // V ! *pixels++=((RGB2YUV_11*bgradata[4+chRed]+ ! RGB2YUV_12*bgradata[4+chGreen]+ ! RGB2YUV_13*bgradata[4+chBlue])>>8)+ Y_OFFSET; // Y ! bgradata+=8; ! } #endif STOP_TIMING("BGRA_to_YCbCr"); break; --- 672,698 ---- case GL_YUV422_GEM: START_TIMING; + switch(m_simd){ #ifdef __VEC__ ! case GEM_SIMD_ALTIVEC: ! BGRA_to_YCbCr_altivec(bgradata,pixelnum,pixels); #endif + case GEM_SIMD_NONE: default: + pixelnum>>=1; + while(pixelnum--){ + *pixels++=((RGB2YUV_21*bgradata[chRed]+ + RGB2YUV_22*bgradata[chGreen]+ + RGB2YUV_23*bgradata[chBlue])>>8)+UV_OFFSET; // U + *pixels++=((RGB2YUV_11*bgradata[chRed]+ + RGB2YUV_12*bgradata[chGreen]+ + RGB2YUV_13*bgradata[chBlue])>>8)+ Y_OFFSET; // Y + *pixels++=((RGB2YUV_31*bgradata[chRed]+ + RGB2YUV_32*bgradata[chGreen]+ + RGB2YUV_33*bgradata[chBlue])>>8)+UV_OFFSET; // V + *pixels++=((RGB2YUV_11*bgradata[4+chRed]+ + RGB2YUV_12*bgradata[4+chGreen]+ + RGB2YUV_13*bgradata[4+chBlue])>>8)+ Y_OFFSET; // Y + bgradata+=8; + } + } STOP_TIMING("BGRA_to_YCbCr"); break; *************** *** 1109,1115 **** { START_TIMING; #ifdef __VEC__ ! YV12_to_YUV422_altivec(Y, U, V, data, xsize, ysize); ! #else unsigned char *pixels1=data; unsigned char *pixels2=data+xsize*csize; --- 1121,1130 ---- { START_TIMING; + switch(m_simd){ #ifdef __VEC__ ! case GEM_SIMD_ALTIVEC: ! BGRA_to_YCbCr_altivec(bgradata,pixelnum,pixels); ! #endif ! case GEM_SIMD_NONE: default: unsigned char *pixels1=data; unsigned char *pixels2=data+xsize*csize; *************** *** 1139,1143 **** py1+=xsize*1; py2+=xsize*1; } ! #endif STOP_TIMING("YV12_to_YUV422"); } --- 1154,1158 ---- py1+=xsize*1; py2+=xsize*1; } ! } STOP_TIMING("YV12_to_YUV422"); } *************** *** 1173,1179 **** int uv_r, uv_g, uv_b; START_TIMING; #ifdef __SSE2__ UYVY_to_RGB_SSE2(yuvdata, pixelnum, pixels); ! #else pixelnum>>=1; --- 1188,1197 ---- int uv_r, uv_g, uv_b; START_TIMING; + switch(m_simd){ #ifdef __SSE2__ + case GEM_SIMD_SSE2: UYVY_to_RGB_SSE2(yuvdata, pixelnum, pixels); ! #endif ! case GEM_SIMD_NONE: default: pixelnum>>=1; *************** *** 1200,1205 **** yuvdata+=4; } ! #endif ! STOP_TIMING("YUV2RGB"); } break; --- 1218,1223 ---- yuvdata+=4; } ! } ! STOP_TIMING("YUV2RGB"); } break; *************** *** 1208,1216 **** { START_TIMING; ! #if 0 ! YUV422_to_BGRA_altivec( yuvdata, pixelnum, data); ! #elif defined __SSE2__ ! UYVY_to_RGBA_SSE2(yuvdata, pixelnum, data); ! #else unsigned char *pixels=data; int y, u, v; --- 1226,1241 ---- { START_TIMING; ! switch(m_simd){ ! #ifdef __VEC__ ! # if 0 ! case GEM_SIMD_ALTIVEC: ! YUV422_to_BGRA_altivec( yuvdata, pixelnum, data); ! # endif ! #endif ! #ifdef __SSE2__ ! case GEM_SIMD_SSE2: ! UYVY_to_RGBA_SSE2(yuvdata, pixelnum, data); ! #endif ! case GEM_SIMD_NONE: default: unsigned char *pixels=data; int y, u, v; *************** *** 1241,1247 **** yuvdata+=4; } - #endif STOP_TIMING("UYVY_to_RGBA/BGRA"); } break; } --- 1266,1272 ---- yuvdata+=4; } STOP_TIMING("UYVY_to_RGBA/BGRA"); } + } break; } |