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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to