[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