Commit: 1d33843ea6b128242183bb31804474019c606a9d
Author: Bastien Montagne
Date:   Thu Nov 30 15:55:15 2017 +0100
Branches: master
https://developer.blender.org/rB1d33843ea6b128242183bb31804474019c606a9d

Removing OMP: legacy ccgsubsurf.

Performances gain is rather low this time, about 5% on average (in whole
affected functions).

===================================================================

M       source/blender/blenkernel/intern/CCGSubSurf_legacy.c

===================================================================

diff --git a/source/blender/blenkernel/intern/CCGSubSurf_legacy.c 
b/source/blender/blenkernel/intern/CCGSubSurf_legacy.c
index e9002af19b1..f68d1a2697c 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_legacy.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_legacy.c
@@ -27,6 +27,7 @@
 
 #include "BLI_utildefines.h" /* for BLI_assert */
 #include "BLI_math.h"
+#include "BLI_task.h"
 
 #include "CCGSubSurf.h"
 #include "CCGSubSurf_intern.h"
@@ -121,179 +122,251 @@ static float EDGE_getSharpness(CCGEdge *e, int lvl)
                return e->crease - lvl;
 }
 
-static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss,
-                                        CCGVert **effectedV, CCGEdge 
**effectedE, CCGFace **effectedF,
-                                        int numEffectedV, int numEffectedE, 
int numEffectedF)
+
+
+typedef struct CCGSubSurfCalcSubdivData {
+       CCGSubSurf *ss;
+       CCGVert **effectedV;
+       CCGEdge **effectedE;
+       CCGFace **effectedF;
+       int numEffectedV;
+       int numEffectedE;
+       int numEffectedF;
+
+       int curLvl;
+} CCGSubSurfCalcSubdivData;
+
+static void ccgSubSurf__calcVertNormals_faces_accumulate_cb(void *userdata, 
int ptrIdx)
 {
-       int i, ptrIdx;
-       int subdivLevels = ss->subdivLevels;
-       int lvl = ss->subdivLevels;
-       int edgeSize = ccg_edgesize(lvl);
-       int gridSize = ccg_gridsize(lvl);
-       int normalDataOffset = ss->normalDataOffset;
-       int vertDataSize = ss->meshIFC.vertDataSize;
+       CCGSubSurfCalcSubdivData *data = userdata;
 
-#pragma omp parallel for private(ptrIdx) if (numEffectedF * edgeSize * 
edgeSize * 4 >= CCG_OMP_LIMIT)
-       for (ptrIdx = 0; ptrIdx < numEffectedF; ptrIdx++) {
-               CCGFace *f = (CCGFace *) effectedF[ptrIdx];
-               int S, x, y;
-               float no[3];
+       CCGSubSurf *ss = data->ss;
+       CCGFace *f = data->effectedF[ptrIdx];
 
-               for (S = 0; S < f->numVerts; S++) {
-                       for (y = 0; y < gridSize - 1; y++) {
-                               for (x = 0; x < gridSize - 1; x++) {
-                                       NormZero(FACE_getIFNo(f, lvl, S, x, y));
-                               }
-                       }
+       const int subdivLevels = ss->subdivLevels;
+       const int lvl = ss->subdivLevels;
+       const int gridSize = ccg_gridsize(lvl);
+       const int normalDataOffset = ss->normalDataOffset;
+       const int vertDataSize = ss->meshIFC.vertDataSize;
 
-                       if (FACE_getEdges(f)[(S - 1 + f->numVerts) % 
f->numVerts]->flags & Edge_eEffected) {
-                               for (x = 0; x < gridSize - 1; x++) {
-                                       NormZero(FACE_getIFNo(f, lvl, S, x, 
gridSize - 1));
-                               }
+       int S, x, y;
+       float no[3];
+
+       for (S = 0; S < f->numVerts; S++) {
+               for (y = 0; y < gridSize - 1; y++) {
+                       for (x = 0; x < gridSize - 1; x++) {
+                               NormZero(FACE_getIFNo(f, lvl, S, x, y));
                        }
-                       if (FACE_getEdges(f)[S]->flags & Edge_eEffected) {
-                               for (y = 0; y < gridSize - 1; y++) {
-                                       NormZero(FACE_getIFNo(f, lvl, S, 
gridSize - 1, y));
-                               }
+               }
+
+               if (FACE_getEdges(f)[(S - 1 + f->numVerts) % 
f->numVerts]->flags & Edge_eEffected) {
+                       for (x = 0; x < gridSize - 1; x++) {
+                               NormZero(FACE_getIFNo(f, lvl, S, x, gridSize - 
1));
                        }
-                       if (FACE_getVerts(f)[S]->flags & Vert_eEffected) {
-                               NormZero(FACE_getIFNo(f, lvl, S, gridSize - 1, 
gridSize - 1));
+               }
+               if (FACE_getEdges(f)[S]->flags & Edge_eEffected) {
+                       for (y = 0; y < gridSize - 1; y++) {
+                               NormZero(FACE_getIFNo(f, lvl, S, gridSize - 1, 
y));
                        }
                }
+               if (FACE_getVerts(f)[S]->flags & Vert_eEffected) {
+                       NormZero(FACE_getIFNo(f, lvl, S, gridSize - 1, gridSize 
- 1));
+               }
+       }
 
-               for (S = 0; S < f->numVerts; S++) {
-                       int yLimit = !(FACE_getEdges(f)[(S - 1 + f->numVerts) % 
f->numVerts]->flags & Edge_eEffected);
-                       int xLimit = !(FACE_getEdges(f)[S]->flags & 
Edge_eEffected);
-                       int yLimitNext = xLimit;
-                       int xLimitPrev = yLimit;
-                       
-                       for (y = 0; y < gridSize - 1; y++) {
-                               for (x = 0; x < gridSize - 1; x++) {
-                                       int xPlusOk = (!xLimit || x < gridSize 
- 2);
-                                       int yPlusOk = (!yLimit || y < gridSize 
- 2);
-
-                                       FACE_calcIFNo(f, lvl, S, x, y, no);
-
-                                       NormAdd(FACE_getIFNo(f, lvl, S, x + 0, 
y + 0), no);
-                                       if (xPlusOk)
-                                               NormAdd(FACE_getIFNo(f, lvl, S, 
x + 1, y + 0), no);
-                                       if (yPlusOk)
-                                               NormAdd(FACE_getIFNo(f, lvl, S, 
x + 0, y + 1), no);
-                                       if (xPlusOk && yPlusOk) {
-                                               if (x < gridSize - 2 || y < 
gridSize - 2 || FACE_getVerts(f)[S]->flags & Vert_eEffected) {
-                                                       NormAdd(FACE_getIFNo(f, 
lvl, S, x + 1, y + 1), no);
-                                               }
+       for (S = 0; S < f->numVerts; S++) {
+               int yLimit = !(FACE_getEdges(f)[(S - 1 + f->numVerts) % 
f->numVerts]->flags & Edge_eEffected);
+               int xLimit = !(FACE_getEdges(f)[S]->flags & Edge_eEffected);
+               int yLimitNext = xLimit;
+               int xLimitPrev = yLimit;
+
+               for (y = 0; y < gridSize - 1; y++) {
+                       for (x = 0; x < gridSize - 1; x++) {
+                               int xPlusOk = (!xLimit || x < gridSize - 2);
+                               int yPlusOk = (!yLimit || y < gridSize - 2);
+
+                               FACE_calcIFNo(f, lvl, S, x, y, no);
+
+                               NormAdd(FACE_getIFNo(f, lvl, S, x + 0, y + 0), 
no);
+                               if (xPlusOk)
+                                       NormAdd(FACE_getIFNo(f, lvl, S, x + 1, 
y + 0), no);
+                               if (yPlusOk)
+                                       NormAdd(FACE_getIFNo(f, lvl, S, x + 0, 
y + 1), no);
+                               if (xPlusOk && yPlusOk) {
+                                       if (x < gridSize - 2 || y < gridSize - 
2 || FACE_getVerts(f)[S]->flags & Vert_eEffected) {
+                                               NormAdd(FACE_getIFNo(f, lvl, S, 
x + 1, y + 1), no);
                                        }
+                               }
 
-                                       if (x == 0 && y == 0) {
-                                               int K;
+                               if (x == 0 && y == 0) {
+                                       int K;
 
-                                               if (!yLimitNext || 1 < gridSize 
- 1)
-                                                       NormAdd(FACE_getIFNo(f, 
lvl, (S + 1) % f->numVerts, 0, 1), no);
-                                               if (!xLimitPrev || 1 < gridSize 
- 1)
-                                                       NormAdd(FACE_getIFNo(f, 
lvl, (S - 1 + f->numVerts) % f->numVerts, 1, 0), no);
+                                       if (!yLimitNext || 1 < gridSize - 1)
+                                               NormAdd(FACE_getIFNo(f, lvl, (S 
+ 1) % f->numVerts, 0, 1), no);
+                                       if (!xLimitPrev || 1 < gridSize - 1)
+                                               NormAdd(FACE_getIFNo(f, lvl, (S 
- 1 + f->numVerts) % f->numVerts, 1, 0), no);
 
-                                               for (K = 0; K < f->numVerts; 
K++) {
-                                                       if (K != S) {
-                                                               
NormAdd(FACE_getIFNo(f, lvl, K, 0, 0), no);
-                                                       }
+                                       for (K = 0; K < f->numVerts; K++) {
+                                               if (K != S) {
+                                                       NormAdd(FACE_getIFNo(f, 
lvl, K, 0, 0), no);
                                                }
                                        }
-                                       else if (y == 0) {
-                                               NormAdd(FACE_getIFNo(f, lvl, (S 
+ 1) % f->numVerts, 0, x), no);
-                                               if (!yLimitNext || x < gridSize 
- 2)
-                                                       NormAdd(FACE_getIFNo(f, 
lvl, (S + 1) % f->numVerts, 0, x + 1), no);
-                                       }
-                                       else if (x == 0) {
-                                               NormAdd(FACE_getIFNo(f, lvl, (S 
- 1 + f->numVerts) % f->numVerts, y, 0), no);
-                                               if (!xLimitPrev || y < gridSize 
- 2)
-                                                       NormAdd(FACE_getIFNo(f, 
lvl, (S - 1 + f->numVerts) % f->numVerts, y + 1, 0), no);
-                                       }
+                               }
+                               else if (y == 0) {
+                                       NormAdd(FACE_getIFNo(f, lvl, (S + 1) % 
f->numVerts, 0, x), no);
+                                       if (!yLimitNext || x < gridSize - 2)
+                                               NormAdd(FACE_getIFNo(f, lvl, (S 
+ 1) % f->numVerts, 0, x + 1), no);
+                               }
+                               else if (x == 0) {
+                                       NormAdd(FACE_getIFNo(f, lvl, (S - 1 + 
f->numVerts) % f->numVerts, y, 0), no);
+                                       if (!xLimitPrev || y < gridSize - 2)
+                                               NormAdd(FACE_getIFNo(f, lvl, (S 
- 1 + f->numVerts) % f->numVerts, y + 1, 0), no);
                                }
                        }
                }
        }
-       /* XXX can I reduce the number of normalisations here? */
-       for (ptrIdx = 0; ptrIdx < numEffectedV; ptrIdx++) {
-               CCGVert *v = (CCGVert *) effectedV[ptrIdx];
-               float *no = VERT_getNo(v, lvl);
+}
 
-               NormZero(no);
+static void ccgSubSurf__calcVertNormals_faces_finalize_cb(void *userdata, int 
ptrIdx)
+{
+       CCGSubSurfCalcSubdivData *data = userdata;
 
-               for (i = 0; i < v->numFaces; i++) {
-                       CCGFace *f = v->faces[i];
-                       NormAdd(no, FACE_getIFNo(f, lvl, 
ccg_face_getVertIndex(f, v), gridSize - 1, gridSize - 1));
-               }
+       CCGSubSurf *ss = data->ss;
+       CCGFace *f = data->effectedF[ptrIdx];
 
-               if (UNLIKELY(v->numFaces == 0)) {
-                       NormCopy(no, VERT_getCo(v, lvl));
+       const int subdivLevels = ss->subdivLevels;
+       const int lvl = ss->subdivLevels;
+       const int gridSize = ccg_gridsize(lvl);
+       const int normalDataOffset = ss->normalDataOffset;
+       const int vertDataSize = ss->meshIFC.vertDataSize;
+
+       int S, x, y;
+
+       for (S = 0; S < f->numVerts; S++) {
+               NormCopy(FACE_getIFNo(f, lvl, (S + 1) % f->numVerts, 0, 
gridSize - 1),
+                        FACE_getIFNo(f, lvl, S, gridSize - 1, 0));
+       }
+
+       for (S = 0; S < f->numVerts; S++) {
+               for (y = 0; y < gridSize; y++) {
+                       for (x = 0; x < gridSize; x++) {
+                               float *no = FACE_getIFNo(f, lvl, S, x, y);
+                               Normalize(no);
+                       }
                }
 
-               Normalize(no);
+               VertDataCopy((float *)((byte *)FACE_getCenterData(f) + 
normalDataOffset),
+                            FACE_getIFNo(f, lvl, S, 0, 0), ss);
 
-               for (i = 0; i < v->numFaces; i++) {
-                       CCGFace *f = v->faces[i];
-                       NormCopy(FACE_getIFNo(f, lvl, ccg_face_getVertIndex(f, 
v), gridSize - 1, gridSize - 1), no);
+               for (x = 1; x < gridSize - 1; x++) {
+                       NormCopy(FACE_getIENo(f, lvl, S, x),
+                                FACE_getIFNo(f, lvl, S, x, 0));
                }
        }
-       for (ptrIdx = 0; ptrIdx < numEffectedE; ptrIdx++) {
-               CCGEdge *e = (CCGEdge *) effectedE[ptrIdx];
+}
 
-               if (e->numFaces) {
-                       CCGFace *fLast = e->faces[e->numFaces - 1];
-                       int x;
+static void ccgSubSurf__calcVertNormals_edges_accumulate_cb(void *userdata, 
int ptrIdx)
+{
+       CCGSubSurfCalcSubdivData *data = userdata;
 
-                       for (i = 0; i < e->numFaces - 1; i++) {
-                               CCGFace *f = e->faces[i];
-                               const int f_ed_idx = ccg_face_getEdgeIndex(f, 
e);
-                               const int f_ed_idx_last = 
ccg_face_getEdgeIndex(fLast, e);
+       CCGSubSurf *ss = data->ss;
+       CCGEdge *e = data->effectedE[ptrIdx];
 
-                               for (x = 1; x < edgeSize - 1; x++) {
-                                       NormAdd(_face_getIFNoEdge(fLast, e, 
f_ed_idx_last, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset),
-                                               _face_getIFNoEdge(f, e, 
f_ed_idx, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset));
-                               }
+       const int subdivLevels = ss->subdivLevels;
+       const int lvl = ss->subdivLevels;
+       const int edgeSize = ccg_edgesize(lvl);
+       const int normalDataOffset = ss->normalDataOffset;
+       const int vertDataSize = ss->meshIFC.vertDataSize;
+
+       if (e->numFaces) {
+               CCGFace *fLast = e->faces[e->numFaces - 1];
+               int x, i;
+
+               for (i = 0; i < e->numFaces - 1; i++) {
+                       CCGFace *f = e->faces[i];
+                       const int f_ed_idx = ccg_face_getEdgeIndex(f, e);
+                       const int f_ed_idx_last = ccg_face_getEdgeIndex(fLast, 
e);
+
+                       for (x = 1; x < edgeSize - 1; x++) {
+                               NormAdd(_face_getIFNoEdge(fLast, e, 
f_ed_idx_last, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset),
+                                       _face_get

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to