diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-01-04 21:28:58 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-01-04 21:28:58 +0400 |
commit | 499088366421d2a240721267f46bf5ca335e1ed4 (patch) | |
tree | 2e7cf13ee61578a87c0b23b62de2ac8431839828 /source/blender/imbuf | |
parent | 419016928216707f95fa7b94d233b0bb8707ff3c (diff) |
Optimization for speed regression in mipmap generation
Regression was caused by alpha premul cleanup commit and the reason
of slowdown was uchar <-> float conversion which is slow.
Replaced with uchar <-> int conversion which seeps to be accurate
enough and mostly eliminates slowdown.
Slowdown was easy to notice when movie clip is used for 3d vierport
background and undistortion is enabled. In this case every frame
will re-calculate mipmaps.
It's still a nit slower than mipmap generation before cleanup
commit, but couldn't think about extra boost here atm.
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r-- | source/blender/imbuf/intern/scaling.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c index 75d1f4c412d..8d3cd648fc1 100644 --- a/source/blender/imbuf/intern/scaling.c +++ b/source/blender/imbuf/intern/scaling.c @@ -311,19 +311,19 @@ void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1) for (y = ibuf2->y; y > 0; y--) { cp2 = cp1 + (ibuf1->x << 2); for (x = ibuf2->x; x > 0; x--) { - float p1f[8], p2f[8], destf[4]; + int p1i[8], p2i[8], desti[4]; - straight_uchar_to_premul_float(p1f, cp1); - straight_uchar_to_premul_float(p2f, cp2); - straight_uchar_to_premul_float(p1f + 4, cp1 + 4); - straight_uchar_to_premul_float(p2f + 4, cp2 + 4); + straight_uchar_to_premul_int(p1i, cp1); + straight_uchar_to_premul_int(p2i, cp2); + straight_uchar_to_premul_int(p1i + 4, cp1 + 4); + straight_uchar_to_premul_int(p2i + 4, cp2 + 4); - destf[0] = 0.25f * (p1f[0] + p2f[0] + p1f[4] + p2f[4]); - destf[1] = 0.25f * (p1f[1] + p2f[1] + p1f[5] + p2f[5]); - destf[2] = 0.25f * (p1f[2] + p2f[2] + p1f[6] + p2f[6]); - destf[3] = 0.25f * (p1f[3] + p2f[3] + p1f[7] + p2f[7]); + desti[0] = (p1i[0] + p2i[0] + p1i[4] + p2i[4]) >> 2; + desti[1] = (p1i[1] + p2i[1] + p1i[5] + p2i[5]) >> 2; + desti[2] = (p1i[2] + p2i[2] + p1i[6] + p2i[6]) >> 2; + desti[3] = (p1i[3] + p2i[3] + p1i[7] + p2i[7]) >> 2; - premul_float_to_straight_uchar(dest, destf); + premul_int_to_straight_uchar(dest, desti); cp1 += 8; cp2 += 8; |