Use OpenMP threads in bm_loop_interp_mdisps
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 11 Jun 2013 09:14:39 +0000 (09:14 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 11 Jun 2013 09:14:39 +0000 (09:14 +0000)
Gives approx 2x speedup on my laptop on such operations
as mesh subdivision in edit mode. Desktops with fancier
CPUs could benefit even more.

Thanks Campbell for review!

source/blender/bmesh/intern/bmesh_interp.c

index bf7bfc1123ca048d4e4b397db9bf5b844d451c2d..9c85a4fc4e58f0572f8ad163adf8f58105062fec 100644 (file)
@@ -432,10 +432,8 @@ static void bm_loop_flip_disp(float source_axis_x[3], float source_axis_y[3],
 static void bm_loop_interp_mdisps(BMesh *bm, BMLoop *target, BMFace *source)
 {
        MDisps *mdisps;
-       BMLoop *l_iter;
-       BMLoop *l_first;
-       float x, y, d, v1[3], v2[3], v3[3], v4[3] = {0.0f, 0.0f, 0.0f}, e1[3], e2[3];
-       int ix, iy, res;
+       float d, v1[3], v2[3], v3[3], v4[3] = {0.0f, 0.0f, 0.0f}, e1[3], e2[3];
+       int ix, res;
        float axis_x[3], axis_y[3];
        
        /* ignore 2-edged faces */
@@ -467,10 +465,15 @@ static void bm_loop_interp_mdisps(BMesh *bm, BMLoop *target, BMFace *source)
 
        res = (int)sqrt(mdisps->totdisp);
        d = 1.0f / (float)(res - 1);
-       for (x = 0.0f, ix = 0; ix < res; x += d, ix++) {
+       #pragma omp parallel for if(res > 3)
+       for (ix = 0; ix < res; ix++) {
+               float x = d * ix, y;
+               int iy;
                for (y = 0.0f, iy = 0; iy < res; y += d, iy++) {
+                       BMLoop *l_iter;
+                       BMLoop *l_first;
                        float co1[3], co2[3], co[3];
-                       
+
                        copy_v3_v3(co1, e1);
                        
                        mul_v3_fl(co1, y);