[Bf-blender-cvs] [1d33843ea6b] master: Removing OMP: legacy ccgsubsurf.

Bastien Montagne noreply at git.blender.org
Thu Nov 30 19:51:21 CET 2017


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. @@



More information about the Bf-blender-cvs mailing list