[Bf-blender-cvs] [58adefe] opensubdiv-modifier: Skip DM face initialization when GPU backend is possible to use

Sergey Sharybin noreply at git.blender.org
Mon May 12 20:09:00 CEST 2014


Commit: 58adefe12dbea9c20e130b13628570368618b351
Author: Sergey Sharybin
Date:   Sun May 11 16:04:29 2014 +0200
https://developer.blender.org/rB58adefe12dbea9c20e130b13628570368618b351

Skip DM face initialization when GPU backend is possible to use

Currently only last SS modifier in the stack is capable of using
GPU for tessellation. If there are any modifiers on top of SS then
CPU is gonna to be used (even if the modifier is disabled).

There's still uite reasonable amount of overhead happening, but
that's task for further design changes. For now let's make all
the bits working and when it's clear how it all communicates
re-design drawObject, derivedmesh and probably other areas.

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

M	source/blender/blenkernel/BKE_subsurf.h
M	source/blender/blenkernel/intern/CCGSubSurf.c
M	source/blender/blenkernel/intern/CCGSubSurf.h
M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/modifiers/intern/MOD_subsurf.c

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

diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index 3dae408..91ab9e5 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -60,7 +60,8 @@ typedef enum {
 	SUBSURF_IS_FINAL_CALC = 2,
 	SUBSURF_FOR_EDIT_MODE = 4,
 	SUBSURF_IN_EDIT_MODE = 8,
-	SUBSURF_ALLOC_PAINT_MASK = 16
+	SUBSURF_ALLOC_PAINT_MASK = 16,
+	SUBSURF_USE_GPU_BACKEND = 32
 } SubsurfFlags;
 
 struct DerivedMesh *subsurf_make_derived_from_derived(
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 500bfb4..46e822c 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -460,6 +460,7 @@ struct CCGSubSurf {
 	struct OpenSubdiv_GLMesh *osd_mesh;
 	struct OpenSubdiv_CUDAComputeController *osd_controller;
 	unsigned int osd_vao;
+	bool skip_grids;
 #endif
 };
 
@@ -919,6 +920,7 @@ CCGSubSurf *ccgSubSurf_new(CCGMeshIFC *ifc, int subdivLevels, CCGAllocatorIFC *a
 		ss->osd_mesh = NULL;
 		ss->osd_controller = NULL;
 		ss->osd_vao = 0;
+		ss->skip_grids = false;
 #endif
 
 		return ss;
@@ -2355,6 +2357,11 @@ void ccgSubSurf_drawGLMesh(CCGSubSurf *ss)
 	glBindBuffer(GL_ARRAY_BUFFER, 0);
 }
 
+void ccgSubSurf_setSkipGrids(CCGSubSurf *ss, bool skip_grids)
+{
+	ss->skip_grids = skip_grids;
+}
+
 BLI_INLINE void ccgSubSurf__mapGridToFace(int S, float grid_u, float grid_v,
                                           float *face_u, float *face_v)
 {
@@ -2859,7 +2866,7 @@ static void ccgSubSurf__syncOpenSubdiv(CCGSubSurf *ss)
 
 	/* Make sure OSD evaluator is up-to-date. */
 	if (opensubdiv_ensureEvaluator(ss)) {
-		if (false) {
+		if (ss->skip_grids == false) {
 			/* Update coarse points in the OpenSubdiv evaluator. */
 			opensubdiv_updateCoarsePositions(ss);
 
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 149aa73..93f4756 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -189,6 +189,7 @@ void				ccgFaceIterator_free		(CCGFaceIterator *fi);
 #ifdef WITH_OPENSUBDIV
 void ccgSubSurf_prepareGLMesh(CCGSubSurf *ss);
 void ccgSubSurf_drawGLMesh(CCGSubSurf *ss);
+void ccgSubSurf_setSkipGrids(CCGSubSurf *ss, bool skip_grids);
 #endif
 
 #endif  /* __CCGSUBSURF_H__ */
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index cb5dae7..aabdf21 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -87,7 +87,8 @@ static ThreadRWMutex origindex_cache_rwlock = BLI_RWLOCK_INITIALIZER;
 static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
                                          int drawInteriorEdges,
                                          int useSubsurfUv,
-                                         DerivedMesh *dm);
+                                         DerivedMesh *dm,
+                                         bool use_gpu_backend);
 static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm);
 
 ///
@@ -3408,7 +3409,8 @@ static void ccgDM_calcNormals(DerivedMesh *dm)
 static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
                                          int drawInteriorEdges,
                                          int useSubsurfUv,
-                                         DerivedMesh *dm)
+                                         DerivedMesh *dm,
+                                         bool use_gpu_backend)
 {
 	CCGDerivedMesh *ccgdm = MEM_callocN(sizeof(*ccgdm), "ccgdm");
 	CCGVertIterator *vi;
@@ -3612,81 +3614,65 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 #endif
 
 	loopindex = loopindex2 = 0; /* current loop index */
-	for (index = 0; index < totface; index++) {
-		CCGFace *f = ccgdm->faceMap[index].face;
-		int numVerts = ccgSubSurf_getFaceNumVerts(f);
-		int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges);
-		int origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
-		int g2_wid = gridCuts + 2;
-		float *w, *w2;
-		int s, x, y;
+	/* TODO(sergey): This is only for purposes of test. */
+	if (use_gpu_backend == false) {
+		for (index = 0; index < totface; index++) {
+			CCGFace *f = ccgdm->faceMap[index].face;
+			int numVerts = ccgSubSurf_getFaceNumVerts(f);
+			int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges);
+			int origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
+			int g2_wid = gridCuts + 2;
+			float *w, *w2;
+			int s, x, y;
 #ifdef USE_DYNSIZE
-		int loopidx[numVerts], vertidx[numVerts];
+			int loopidx[numVerts], vertidx[numVerts];
 #endif
 
-		w = get_ss_weights(&wtable, gridCuts, numVerts);
+			w = get_ss_weights(&wtable, gridCuts, numVerts);
 
-		ccgdm->faceMap[index].startVert = vertNum;
-		ccgdm->faceMap[index].startEdge = edgeNum;
-		ccgdm->faceMap[index].startFace = faceNum;
-		
-		faceFlags->flag = mpoly ?  mpoly[origIndex].flag : 0;
-		faceFlags->mat_nr = mpoly ? mpoly[origIndex].mat_nr : 0;
-		faceFlags++;
+			ccgdm->faceMap[index].startVert = vertNum;
+			ccgdm->faceMap[index].startEdge = edgeNum;
+			ccgdm->faceMap[index].startFace = faceNum;
+
+			faceFlags->flag = mpoly ?  mpoly[origIndex].flag : 0;
+			faceFlags->mat_nr = mpoly ? mpoly[origIndex].mat_nr : 0;
+			faceFlags++;
 
-		/* set the face base vert */
-		*((int *)ccgSubSurf_getFaceUserData(ss, f)) = vertNum;
+			/* set the face base vert */
+			*((int *)ccgSubSurf_getFaceUserData(ss, f)) = vertNum;
 
 #ifndef USE_DYNSIZE
-		BLI_array_empty(loopidx);
-		BLI_array_grow_items(loopidx, numVerts);
+			BLI_array_empty(loopidx);
+			BLI_array_grow_items(loopidx, numVerts);
 #endif
-		for (s = 0; s < numVerts; s++) {
-			loopidx[s] = loopindex++;
-		}
+			for (s = 0; s < numVerts; s++) {
+				loopidx[s] = loopindex++;
+			}
 
 #ifndef USE_DYNSIZE
-		BLI_array_empty(vertidx);
-		BLI_array_grow_items(vertidx, numVerts);
+			BLI_array_empty(vertidx);
+			BLI_array_grow_items(vertidx, numVerts);
 #endif
-		for (s = 0; s < numVerts; s++) {
-			CCGVert *v = ccgSubSurf_getFaceVert(f, s);
-			vertidx[s] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
-		}
-		
-
-		/*I think this is for interpolating the center vert?*/
-		w2 = w; // + numVerts*(g2_wid-1) * (g2_wid-1); //numVerts*((g2_wid-1) * g2_wid+g2_wid-1);
-		DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2,
-		                    numVerts, vertNum);
-		if (vertOrigIndex) {
-			*vertOrigIndex = ORIGINDEX_NONE;
-			vertOrigIndex++;
-		}
-
-		vertNum++;
-
-		/*interpolate per-vert data*/
-		for (s = 0; s < numVerts; s++) {
-			for (x = 1; x < gridFaces; x++) {
-				w2 = w + s * numVerts * g2_wid * g2_wid + x * numVerts;
-				DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2,
-				                    numVerts, vertNum);
-
-				if (vertOrigIndex) {
-					*vertOrigIndex = ORIGINDEX_NONE;
-					vertOrigIndex++;
-				}
+			for (s = 0; s < numVerts; s++) {
+				CCGVert *v = ccgSubSurf_getFaceVert(f, s);
+				vertidx[s] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+			}
 
-				vertNum++;
+			/*I think this is for interpolating the center vert?*/
+			w2 = w; // + numVerts*(g2_wid-1) * (g2_wid-1); //numVerts*((g2_wid-1) * g2_wid+g2_wid-1);
+			DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2,
+			                    numVerts, vertNum);
+			if (vertOrigIndex) {
+				*vertOrigIndex = ORIGINDEX_NONE;
+				vertOrigIndex++;
 			}
-		}
 
-		/*interpolate per-vert data*/
-		for (s = 0; s < numVerts; s++) {
-			for (y = 1; y < gridFaces; y++) {
+			vertNum++;
+
+			/*interpolate per-vert data*/
+			for (s = 0; s < numVerts; s++) {
 				for (x = 1; x < gridFaces; x++) {
-					w2 = w + s * numVerts * g2_wid * g2_wid + (y * g2_wid + x) * numVerts;
+					w2 = w + s * numVerts * g2_wid * g2_wid + x * numVerts;
 					DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2,
 					                    numVerts, vertNum);
 
@@ -3698,128 +3684,146 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 					vertNum++;
 				}
 			}
-		}
 
-		if (edgeOrigIndex) {
-			for (i = 0; i < numFinalEdges; ++i) {
-				edgeOrigIndex[edgeNum + i] = ORIGINDEX_NONE;
-			}
-		}
+			/*interpolate per-vert data*/
+			for (s = 0; s < numVerts; s++) {
+				for (y = 1; y < gridFaces; y++) {
+					for (x = 1; x < gridFaces; x++) {
+						w2 = w + s * numVerts * g2_wid * g2_wid + (y * g2_wid + x) * numVerts;
+						DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2,
+						                    numVerts, vertNum);
+
+						if (vertOrigIndex) {
+							*vertOrigIndex = ORIGINDEX_NONE;
+							vertOrigIndex++;
+						}
 
-		for (s = 0; s < numVerts; s++) {
-			/*interpolate per-face data*/
-			for (y = 0; y < gridFaces; y++) {
-				for (x = 0; x < gridFaces; x++) {
-					w2 = w + s * numVerts * g2_wid * g2_wid + (y * g2_wid + x) * numVerts;
-					CustomData_interp(&dm->loopData, &ccgdm->dm.loopData,
-					                  loopidx, w2, NULL, numVerts, loopindex2);
-					loopindex2++;
-
-					w2 = w + s * numVerts * g2_wid * g2_wid + ((y + 1) * g2_wid + (x)) * numVerts;
-					CustomData_interp(&dm->loopData, &ccgdm->dm.loopData,
-					                  loopidx, w2, NULL, numVerts, loopindex2);
-					loopindex2++;
-
-					w2 = w + s * numVerts * g2_wid * g2_wid + ((y + 1) * g2_wid + (x + 1)) * numVerts;
-					CustomData_interp(&dm->loopData, &ccgdm->dm.loopData,
-					                  loopidx, w2, NULL, numVerts, loopindex2);
-					loopindex2++;
-					
-					w2 = w + s * numVerts * g2_wid * g2_wid + ((y) * g2_wid + (x + 1)) * numVerts;
-					CustomData_interp(&dm->loopData, &ccgdm->dm.loopData,
-					                  loopidx, w2, NULL, numVerts, loopindex2);
-					loopindex2++;
-
-					/*copy over poly data, e.g. mtexpoly*/
-					CustomData_copy_data(&dm->polyData, &ccgdm->dm.polyData, origIndex, faceNum, 1);
-
-					/*generate tessellated face data used for drawing*/
-					ccg_loops_to_corners(&ccgdm->dm.faceData, &ccgdm->dm.loopData,
-					                     &ccgdm->dm.polyData, loopindex2 - 4, faceNum, faceNum,
-					                     numTex, numCol, hasPCol, hasOrigSpace);
-					
-					/*set original index data*/
-					if (faceOrigIndex) {
-						/* reference the i

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list