[Bf-blender-cvs] [b9bacf6] opensubdiv-modifier: Avoid some really bad memory usage

Sergey Sharybin noreply at git.blender.org
Wed Jun 18 14:03:01 CEST 2014


Commit: b9bacf634399d8cdc0dd24c0940f42739c14d91c
Author: Sergey Sharybin
Date:   Wed Jun 18 17:58:17 2014 +0600
https://developer.blender.org/rBb9bacf634399d8cdc0dd24c0940f42739c14d91c

Avoid some really bad memory usage

- Need to count DM primitives properly in order
  to avoid bad memor write in ORCO DM.

- Skip GPU if subsurf result will be converted to CDDM.

Material and textured viewport is not quite working yet,
but at least it doesn't crash.

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

M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/modifiers/intern/MOD_subsurf.c

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

diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 0d1067e..925b347 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -3831,27 +3831,33 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 			for (i = 0; i < numlayer && i < dmnumlayer; i++)
 				set_subsurf_uv(ss, dm, &ccgdm->dm, i);
 		}
-	}
 
-	for (index = 0; index < totvert; ++index) {
-		CCGVert *v = ccgdm->vertMap[index].vert;
-		int mapIndex = ccgDM_getVertMapIndex(ccgdm->ss, v);
-		int vertIdx;
+		for (index = 0; index < totvert; ++index) {
+			CCGVert *v = ccgdm->vertMap[index].vert;
+			int mapIndex = ccgDM_getVertMapIndex(ccgdm->ss, v);
+			int vertIdx;
 
-		vertIdx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+			vertIdx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
 
-		ccgdm->vertMap[index].startVert = vertNum;
+			ccgdm->vertMap[index].startVert = vertNum;
 
-		/* set the vert base vert */
-		*((int *) ccgSubSurf_getVertUserData(ss, v)) = vertNum;
+			/* set the vert base vert */
+			*((int *) ccgSubSurf_getVertUserData(ss, v)) = vertNum;
 
-		DM_copy_vert_data(dm, &ccgdm->dm, vertIdx, vertNum, 1);
+			DM_copy_vert_data(dm, &ccgdm->dm, vertIdx, vertNum, 1);
 
-		if (vertOrigIndex) {
-			*vertOrigIndex = mapIndex;
-			vertOrigIndex++;
+			if (vertOrigIndex) {
+				*vertOrigIndex = mapIndex;
+				vertOrigIndex++;
+			}
+			vertNum++;
 		}
-		vertNum++;
+	}
+	else {
+		vertNum = ccgSubSurf_getNumFinalVerts(ss);
+		edgeNum = ccgSubSurf_getNumFinalEdges(ss);
+		loopindex2 = ccgSubSurf_getNumFinalFaces(ss) * 4;
+		faceNum = ccgSubSurf_getNumFinalFaces(ss);
 	}
 
 	ccgdm->dm.numVertData = vertNum;
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index 0ab9a74..9d53d39 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -102,6 +102,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	const bool isFinalCalc = (flag & MOD_APPLY_USECACHE) != 0;
 	const bool allow_gpu = (flag & MOD_APPLY_ALLOW_GPU) != 0;
 
+	/* TODO(sergey): Investigate whether we still need this. */
+	const bool do_cddm_convert = useRenderParams || !isFinalCalc;
+
 	if (useRenderParams)
 		subsurf_flags |= SUBSURF_USE_RENDER_PARAMS;
 	if (isFinalCalc)
@@ -110,14 +113,14 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 		subsurf_flags |= SUBSURF_IN_EDIT_MODE;
 
 	/* TODO(sergey): Not entirely correct, only good for purposes of test. */
-	if (md->next == NULL && allow_gpu) {
+	if (md->next == NULL && allow_gpu && do_cddm_convert == false) {
 		subsurf_flags |= SUBSURF_USE_GPU_BACKEND;
 	}
 
 	result = subsurf_make_derived_from_derived(derivedData, smd, NULL, subsurf_flags);
 	result->cd_flag = derivedData->cd_flag;
 
-	if (useRenderParams || !isFinalCalc) {
+	if (do_cddm_convert) {
 		DerivedMesh *cddm = CDDM_copy(result);
 		result->release(result);
 		result = cddm;




More information about the Bf-blender-cvs mailing list