图形图像处理-之-高质量的快速的图像缩放 补充 使用SSE2优化_第1页
图形图像处理-之-高质量的快速的图像缩放 补充 使用SSE2优化_第2页
图形图像处理-之-高质量的快速的图像缩放 补充 使用SSE2优化_第3页
图形图像处理-之-高质量的快速的图像缩放 补充 使用SSE2优化_第4页
图形图像处理-之-高质量的快速的图像缩放 补充 使用SSE2优化_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图形图像处理 之 高质量的快速的图像缩放图形图像处理 之 高质量的快速的图像缩放 补充补充 使用使用 SSE2 优化优化 HouSisong GM 2011 04 12 tag 图像缩放 速度优化 线性插值 三次卷积插值 SSE2 scale bilinear bicubic StretchBlt 摘要摘要 本文章对线性插值和三次卷积插值 bicubic 的实现做了一些新的优化尝试 使用了 SSE2 的 128bit 寄存器及相关指令 并预先建立 SSE2 用到的缩放系数表 实现的结果在我的 i7 电脑上比以前的版本分别快出 145 和 75 线性插值的速度是 StretchBlt 的 13 倍 正文正文 请先看看我的 blog 里的前 3 篇文章 支持 SSE2 指令集的 CPU 越来越多 CPU 的 SSE2 实现性能也好了很多 以前不比 MMX 好 多少 而且软件在 64 位模式的时候不再支持 MMX 所以尝试了 SSE2 的缩放优化 效果不错 速度测试说明速度测试说明 只测试内存数据到内存数据的缩放 测试图片都是 800 600 缩放到 1024 768 单线程 fps 表示每秒钟的帧数 值越大表 示函数越快 速度测试对比速度测试对比 CPU i7 920 内存 DDR3 1333 3 通道 windows StretchBlt 近邻取样 869 09 fps StretchBlt 线性插值 44 46 fps SetStretchBltMode dc 4 PicZoom0 95 69 fps PicZoom1 158 35 fps PicZoom2 332 78 fps PicZoom3 1172 79 fps PicZoom3 float 874 13 fps PicZoom3 Table 1158 30 fps PicZoom3 SSE 1908 40 fps PicZoom Bilinear0 28 80 fps PicZoom Bilinear1 56 09 fps PicZoom Bilinear2 97 09 fps PicZoom Bilinear Common 119 83 fps PicZoom Bilinear MMX 180 12 fps PicZoom Bilinear MMX Ex 237 34 fps PicZoom ftBilinear Common 118 67 fps PicZoom ftBilinear MMX 213 68 fps PicZoom ThreeOrder0 6 11 fps PicZoom ThreeOrder Common 25 38 fps PicZoom ThreeOrder MMX 52 32 fps SSE2 的实现 PicZoom ftBilinearTable SSE2 588 24 fps PicZoom ThreeOrderTable SSE2 93 24 fps PicZoom ftBilinearTable SSE2 实现代码如下实现代码如下 view plain 1 typedef UInt64 TMMXData64 2 ftBilinearTable SSE2 out edi ebx 4 xmm5 v xmm6 vr xmm7 0 ebp u ur edx srx x esi PSrcLineColor ecx PSrcLineColorNext 3 void declspec naked ftBilinearTable SSE2 4 define ftBilinearTable SSE2 5 asm mov eax edx ebx 6 asm movq xmm0 qword ptr esi eax 4 7 asm movq xmm1 qword ptr ecx eax 4 8 asm punpcklbw xmm0 xmm7 9 asm punpcklbw xmm1 xmm7 10 asm pmullw xmm0 mm5 11 asm pmullw xmm1 mm6 12 asm paddw xmm0 xmm1 13 asm pmulhw xmm0 xmmword ptr ebp ebx 4 14 asm movdqa xmm1 xmm0 15 asm punpckhqdq xmm0 xmm0 16 asm paddw xmm0 xmm1 17 asm packuswb xmm0 xmm7 18 asm movd dword ptr edi ebx xmm0 19 ret for declspec naked 20 21 22 void declspec naked ftBilinearTable SSE2 expand2 23 define ftBilinearTable SSE2 expand2 24 asm mov eax edx ebx 25 asm movq xmm0 qword ptr esi eax 4 26 asm movq xmm1 qword ptr ecx eax 4 27 asm mov eax edx ebx 4 28 asm movq xmm2 qword ptr esi eax 4 29 asm movq xmm3 qword ptr ecx eax 4 30 asm punpcklbw xmm0 xmm7 31 asm punpcklbw xmm1 xmm7 32 asm punpcklbw xmm2 xmm7 33 asm punpcklbw xmm3 xmm7 34 asm pmullw xmm0 mm5 35 asm pmullw xmm1 mm6 36 asm pmullw xmm2 mm5 37 asm pmullw xmm3 mm6 38 asm paddw xmm0 xmm1 39 asm paddw xmm2 xmm3 40 asm pmulhw xmm0 xmmword ptr ebp ebx 4 41 asm pmulhw xmm2 xmmword ptr ebp ebx 4 16 42 asm movdqa xmm1 xmm0 43 asm punpcklqdq xmm0 xmm2 44 asm punpckhqdq xmm1 xmm2 45 asm paddw xmm0 xmm1 46 asm packuswb xmm0 xmm7 47 asm movq qword ptr edi ebx xmm0 48 ret for declspec naked 49 50 51 52 void PicZoom ftBilinearTable SSE2 const TPixels32Ref 56 long xrIntFloat 16 Src width 1 16 Dst width 57 long yrIntFloat 16 Src height 1 4 4 1 6byte 对齐 61 Int32 xList Int32 uList dst width 2 62 init u table 63 long srcx 16 0 64 for long x 0 x 1 srcx 16 16 66 unsigned long u srcx 16 8 67 unsigned long ur 256 u 1 68 u u 1 69 uList x 0 ur ur 16 70 uList x 0 uList x 0 32 71 uList x 1 u u 16 72 uList x 1 uList x 1 32 73 srcx 16 xrIntFloat 16 74 75 76 Color32 pDstLine Dst pdata 77 long srcy 16 0 78 asm pxor xmm7 xmm7 xmm7 0 79 for long y 0 y 8 81 unsigned long vr 256 v 1 82 v 1 83 Color32 PSrcLineColor Color32 UInt8 Src pdata Src byte w idth srcy 16 16 84 Color32 PSrcLineColorNext Color32 UInt8 PSrcLineColor Sr c byte width 85 asm 86 movd xmm5 vr 87 movd xmm6 v 88 punpcklwd xmm5 xmm5 89 punpcklwd xmm6 xmm6 90 punpckldq xmm5 xmm5 91 punpckldq xmm6 xmm6 92 punpcklqdq xmm5 xmm5 93 punpcklqdq xmm6 xmm6 94 95 mov esi PSrcLineColor 96 mov ecx PSrcLineColorNext 97 mov edx xList x 98 mov ebx dst width 99 mov edi pDstLine 100 push ebp 101 mov ebp uList 102 push ebx 103 104 and ebx not 1 105 test ebx ebx 106 jle end loop2 107 108 lea ebx ebx 4 109 lea edi edi ebx 110 lea edx edx ebx 111 lea ebp ebp ebx 4 112 neg ebx 113 loop2 start 114 call ftBilinearTable SSE2 expand2 115 ftBilinearTable SSE2 expand2 116 add ebx 8 117 jnz loop2 start 118 end loop2 119 pop ebx 120 and ebx 1 121 test ebx ebx 122 jle end write 123 lea ebx ebx 4 124 lea edi edi ebx 125 lea edx edx ebx 126 lea ebp ebp ebx 4 127 neg ebx 128 loop1 start 129 call ftBilinearTable SSE2 130 ftBilinearTable SSE2 131 add ebx 4 132 jnz loop1 start 133 end write 134 pop ebp 135 136 srcy 16 yrIntFloat 16 137 UInt8 138 139 delete bufMem 140 PicZoom ThreeOrderTable SSE2 实现代码如下实现代码如下 view plain 1 static TMMXData64 SinXDivX Table64 MMX 2 8 1 2 class CAutoInti SinXDivX Table64 MMX 3 private 4 void Inti SinXDivX Table64 MMX 5 6 for long i 0 i 2 8 i 7 8 unsigned short t unsigned short 0 5 1 14 SinXDivX i 1 0 256 9 unsigned long tl t unsigned long t 16 10 TMMXData64 tll tl TMMXData64 tl 32 11 SinXDivX Table64 MMX i tll 12 13 14 public 15 CAutoInti SinXDivX Table64 MMX Inti SinXDivX Table64 MMX 16 17 static CAutoInti SinXDivX Table64 MMX tmp CAutoInti SinXDivX Table 64 MMX 18 void declspec naked private ThreeOrderTable Fast SSE2 2 19 define private ThreeOrderTable Fast SSE2 2 20 asm movq xmm0 qword ptr eax 21 asm movq xmm1 qword ptr eax 8 22 asm movq xmm2 qword ptr eax edx 23 asm movq xmm3 qword ptr eax edx 8 24 asm punpcklbw xmm0 xmm7 25 asm punpcklbw xmm1 xmm7 26 asm punpcklbw xmm2 xmm7 27 asm punpcklbw xmm3 xmm7 28 asm psllw xmm0 7 29 asm psllw xmm1 7 30 asm psllw xmm2 7 31 asm psllw xmm3 7 32 asm pmulhw xmm0 xmmword ptr ecx 33 asm pmulhw xmm1 xmmword ptr ecx 16 34 asm pmulhw xmm2 xmmword ptr ecx 35 asm pmulhw xmm3 xmmword ptr ecx 16 36 asm paddsw xmm0 xmm1 37 asm paddsw xmm2 xmm3 38 asm pmulhw xmm0 xmmword ptr ebx 39 asm pmulhw xmm2 xmmword ptr ebx 16 40 asm paddsw xmm0 xmm2 41 asm ret for declspec naked 42 43 must inline UInt32 ThreeOrderTable Fast SSE2 const Color32 pixel lon g byte width const TMMXData64 v4 const TMMXData64 u4 44 asm mov eax pixel 45 asm mov edx byte width 46 asm mov ebx v4 47 asm mov ecx u4 48 asm call private ThreeOrderTable Fast SSE2 2 49 private ThreeOrderTable Fast SSE2 2 50 asm movdqa xmm6 xmm0 51 asm lea eax eax edx 2 pic byte width 52 asm lea ebx ebx 32 53 asm call private ThreeOrderTable Fast SSE2 2 54 private ThreeOrderTable Fast SSE2 2 55 asm paddsw xmm6 xmm0 56 asm movdqa xmm5 xmm6 57 asm psrldq xmm6 8 srl 8 8 bit 58 asm paddsw xmm5 xmm6 59 asm psraw xmm5 3 60 asm packuswb xmm5 xmm7 61 asm movd eax xmm5 62 63 must inline long getSizeBorder long x long maxx 64 if x maxx 67 return maxx 68 else 69 return x 70 71 must inline UInt32 ThreeOrderTable Border SSE2 const TPixels32Ref 73 long height sub 1 pic height 1 74 long width sub 1 pic width 1 75 Color32 pbuf pixel 76 for long i 0 i 4 i pbuf 4 77 long y getSizeBorder y0 sub1 i height sub 1 78 Color32 pLine pic getLinePixels y 79 pbuf 0 pLine getSizeBorder x0 sub1 0 width sub 1 80 pbuf 1 pLine getSizeBorder x0 sub1 1 width sub 1 81 pbuf 2 pLine getSizeBorder x0 sub1 2 width sub 1 82 pbuf 3 pLine getSizeBorder x0 sub1 3 width sub 1 83 84 return ThreeOrderTable Fast SSE2 pixel 4 sizeof Color32 v4 u4 85 86 void PicZoom ThreeOrderTable SSE2 const TPixels32Ref 90 long dst width Dst width 91 long dst height Dst height 92 long xrIntFloat 16 Src width 16 dst width 1 93 long yrIntFloat 16 Src height 16 dst height 1 94 const long csDErrorX 1 1 95 const long csDErrorY 1 1 96 计算出需要特殊处理的边界 97 long border y0 1 1 y0 csDErrorY y 1 csDErrorY yr 98 if border y0 dst height border y0 dst height 99 long border x0 1 dst width border x0 dst width 101 long border y1 Src height 3 16 csDErrorY yrIntFloat 16 1 y0 y yr y height 3 csDErrorY yr 102 if border y1 border y0 border y1 border y0 103 long border x1 Src width 3 16 csDErrorX xrIntFloat 16 1 104 if border x1 4 4 16byte 对齐 107 Int32 xList Int32 uList dst width 4 108 init u table 109 long srcx 16 csDErrorX 110 for long x 0 x 2 srcx 16 16 1 112 long u srcx 16 8 113 uList x 0 SinXDivX Table64 MMX 256 u 114 uList x 1 SinXDivX Table64 MMX u 115 uList x 2 SinXDivX Table64 MMX 256 u 116 uList x 3 SinXDivX Table64 MMX 512 u 117 srcx 16 xrIntFloat 16 118 119 120 TMMXData64 v4 8 2 121 TMMXData64 v4 v4 TMMXData64 ptrdiff t v4 15 4 4 122 asm pxor xmm7 xmm7 123 Color32 pDstLine Dst pdata 124 long srcy 16 csDErrorY 125 for long y 0 y 16 1 128 const long v srcy 16 8 129 v4 0 SinXDivX Table64 MMX 256 v 130 v4 1 v4 0 131 v4 2 SinXDivX Table64 MMX v 132 v4 3 v4 2 133 v4 4 SinXDivX Table64 MMX 256 v 134 v4 5 v4 4 135 v4 6 SinXDivX Table64 MMX 512 v 136 v4 7 v4 6 137 if y border y1 138 for long x 0 x dst width x 139 pDstLine x argb ThreeOrderTable Border SSE2 Src xList x srcy sub1 v4 border 140 else 141 for long x 0 x border x0 x 142 pDstLine x argb ThreeOrderTable Border SSE2 Src xList x srcy sub1 v4 border 143 const Color32 pixelLine Src getLinePixels srcy sub1 144 long byte width Src byte width 145 for long x border x0 x border x1 x 146 pDstLine x argb ThreeOrderTable Fast SSE2 fast MMX 147 for long x border x1 x dst width x 148 pDstLine x argb ThreeOrderTable Border SSE2 Src xList x srcy sub1 v4 border 149 150 srcy 16 yrIntFloat 16 151 UInt8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论