[Bf-blender-cvs] [32530640] opensubdiv-modifier: OpenSubdiv: Initial work related on skipping CCG geometry creation for GPU

Sergey Sharybin noreply at git.blender.org
Thu Jul 16 12:56:07 CEST 2015


Commit: 325306409fc3695ce76f460079b103d975fc2c5d
Author: Sergey Sharybin
Date:   Wed Jul 15 18:24:34 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rB325306409fc3695ce76f460079b103d975fc2c5d

OpenSubdiv: Initial work related on skipping CCG geometry creation for GPU

The idea is to only allocate CCG geometry (CCGVert, CCGEdge and so on) only
int cases when CPU evaluator is used. In case when GPU rendering is enabled
we'll be creating topology refiner directly from DerivedMesh.

Still quite enough of work to be done, including bringing back GPU backend
synchronization code.

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

M	source/blender/blenkernel/intern/CCGSubSurf.h
M	source/blender/blenkernel/intern/CCGSubSurf_intern.h
M	source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
M	source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
M	source/blender/blenkernel/intern/subsurf_ccg.c

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

diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 8b4fd77..0fa9215 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -200,6 +200,7 @@ bool ccgSubSurf_prepareGLMesh(CCGSubSurf *ss, bool use_osd_glsl);
 void ccgSubSurf_drawGLMesh(CCGSubSurf *ss, bool fill_quads,
                            int start_partition, int num_partitions);
 void ccgSubSurf_setSkipGrids(CCGSubSurf *ss, bool skip_grids);
+bool ccgSubSurf_needGrids(CCGSubSurf *ss);
 
 struct DerivedMesh;
 void ccgSubSurf_setUVCoordsFromDM(CCGSubSurf *ss,
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_intern.h b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
index dc5d9a1..1e5965c 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_intern.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
@@ -272,6 +272,10 @@ void ccgSubSurf_converter_setup_from_derivedmesh(
         struct DerivedMesh *dm,
         struct OpenSubdiv_Converter *converter);
 
+void ccgSubSurf_converter_setup_from_ccg(
+        CCGSubSurf *ss,
+        struct OpenSubdiv_Converter *converter);
+
 /* * CCGSubSurf_util.c * */
 
 #ifdef DUMP_RESULT_GRIDS
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
index 45fa45e..312351c 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
@@ -228,6 +228,11 @@ void ccgSubSurf_setSkipGrids(CCGSubSurf *ss, bool skip_grids)
 	ss->skip_grids = skip_grids;
 }
 
+bool ccgSubSurf_needGrids(CCGSubSurf *ss)
+{
+	return ss->skip_grids == false;
+}
+
 BLI_INLINE void ccgSubSurf__mapGridToFace(int S, float grid_u, float grid_v,
                                           float *face_u, float *face_v)
 {
@@ -363,7 +368,7 @@ static bool opensubdiv_createEvaluator(CCGSubSurf *ss)
 {
 	OpenSubdiv_Converter converter;
 	OpenSubdiv_TopologyRefinerDescr *topology_refiner;
-	ccgSubSurf_converter_setup_from_derivedmesh(ss, ss->dm, &converter);
+	ccgSubSurf_converter_setup_from_ccg(ss, &converter);
 	topology_refiner = openSubdiv_createTopologyRefinerDescr(&converter);
 	ss->osd_compute = U.opensubdiv_compute_type;
 	ss->osd_evaluator =
@@ -387,7 +392,7 @@ static bool opensubdiv_ensureEvaluator(CCGSubSurf *ss)
 			 * Here we only tag for free, actual free should happen
 			 * from the main thread.
 			 */
-			if (ss->osd_mesh) {
+			if (ss->osd_mesh != NULL) {
 				ss->osd_mesh_invalid = true;
 			}
 
@@ -395,8 +400,7 @@ static bool opensubdiv_ensureEvaluator(CCGSubSurf *ss)
 		}
 	}
 	if (ss->osd_evaluator == NULL) {
-		int num_basis_verts = ss->vMap->numEntries;
-		OSD_LOG("Allocating new evaluator, %d verts\n", num_basis_verts);
+		OSD_LOG("Allocating new evaluator, %d verts\n", ss->vMap->numEntries);
 		opensubdiv_createEvaluator(ss);
 	} else {
 		OSD_LOG("Re-using old evaluator\n");
@@ -404,7 +408,7 @@ static bool opensubdiv_ensureEvaluator(CCGSubSurf *ss)
 	return ss->osd_evaluator != NULL;
 }
 
-static void opensubdiv_updateCoarsePositions(CCGSubSurf *ss)
+static void opensubdiv_updateEvaluatorCoarsePositions(CCGSubSurf *ss)
 {
 	float (*positions)[3];
 	int vertDataSize = ss->meshIFC.vertDataSize;
@@ -806,18 +810,11 @@ void ccgSubSurf__sync_opensubdiv(CCGSubSurf *ss)
 {
 	BLI_assert(ss->meshIFC.numLayers == 2 || ss->meshIFC.numLayers == 3);
 
-	/* TODO(sergey): Apparently it's not supported by OpenSubdiv. */
-	if (ss->fMap->numEntries == 0) {
-		return;
-	}
-
-	ss->osd_coords_invalid = true;
-
-	/* Make sure OSD evaluator is up-to-date. */
 	if (ss->skip_grids == false) {
+		/* Make sure OSD evaluator is up-to-date. */
 		if (opensubdiv_ensureEvaluator(ss)) {
 			/* Update coarse points in the OpenSubdiv evaluator. */
-			opensubdiv_updateCoarsePositions(ss);
+			opensubdiv_updateEvaluatorCoarsePositions(ss);
 
 			/* Evaluate opensubdiv mesh into the CCG grids. */
 			opensubdiv_evaluateGrids(ss);
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
index 2194264..2b41761 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
@@ -40,6 +40,10 @@
 #include "opensubdiv_capi.h"
 #include "opensubdiv_converter_capi.h"
 
+/**
+ * Converter from DerivedMesh.
+ */
+
 /* TODO(sergey): Optimize this by using mesh_map, so we don't
  * do full mesh lookup for every geometry primitive.
  */
@@ -266,6 +270,177 @@ void ccgSubSurf_converter_setup_from_derivedmesh(
 	converter->user_data = dm;
 }
 
-/* TODO(sergey): Implement converter from CCGSubSurf. */
+/**
+ * Converter from CCGSubSurf
+ */
+
+static OpenSubdiv_SchemeType conv_ccg_get_bilinear_type(
+        const OpenSubdiv_Converter *converter)
+{
+	CCGSubSurf *ss = converter->user_data;
+	if (ss->meshIFC.simpleSubdiv) {
+		return OSD_SCHEME_BILINEAR;
+	}
+	else {
+		return OSD_SCHEME_CATMARK;
+	}
+}
+
+static int conv_ccg_get_num_faces(const OpenSubdiv_Converter *converter)
+{
+	CCGSubSurf *ss = converter->user_data;
+	return ss->fMap->numEntries;
+}
+
+static int conv_ccg_get_num_edges(const OpenSubdiv_Converter *converter)
+{
+	CCGSubSurf *ss = converter->user_data;
+	return ss->eMap->numEntries;
+}
+
+static int conv_ccg_get_num_verts(const OpenSubdiv_Converter *converter)
+{
+	CCGSubSurf *ss = converter->user_data;
+	return ss->vMap->numEntries;
+}
+
+static int conv_ccg_get_num_face_verts(const OpenSubdiv_Converter *converter,
+                                       int face)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGFace *ccg_face = ccgSubSurf_getFace(ss, SET_INT_IN_POINTER(face));
+	return ccgSubSurf_getFaceNumVerts(ccg_face);
+}
+
+static void conv_ccg_get_face_verts(const OpenSubdiv_Converter *converter,
+                                    int face,
+                                    int *face_verts)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGFace *ccg_face = ccgSubSurf_getFace(ss, SET_INT_IN_POINTER(face));
+	int num_face_verts = ccgSubSurf_getFaceNumVerts(ccg_face);
+	int loop;
+	for(loop = 0; loop < num_face_verts; loop++) {
+		CCGVert *ccg_vert = ccgSubSurf_getFaceVert(ccg_face, loop);
+		face_verts[loop] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert));
+	}
+}
+
+static void conv_ccg_get_face_edges(const OpenSubdiv_Converter *converter,
+                                    int face,
+                                    int *face_edges)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGFace *ccg_face = ccgSubSurf_getFace(ss, SET_INT_IN_POINTER(face));
+	int num_face_verts = ccgSubSurf_getFaceNumVerts(ccg_face);
+	int loop;
+	for(loop = 0; loop < num_face_verts; loop++) {
+		CCGEdge *ccg_edge = ccgSubSurf_getFaceEdge(ccg_face, loop);
+		face_edges[loop] = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
+	}
+}
+
+static void conv_ccg_get_edge_verts(const OpenSubdiv_Converter *converter,
+                                    int edge,
+                                    int *edge_verts)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, SET_INT_IN_POINTER(edge));
+	CCGVert *ccg_vert0 = ccgSubSurf_getEdgeVert0(ccg_edge);
+	CCGVert *ccg_vert1 = ccgSubSurf_getEdgeVert1(ccg_edge);
+	edge_verts[0] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert0));
+	edge_verts[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert1));
+}
+
+static int conv_ccg_get_num_edge_faces(const OpenSubdiv_Converter *converter,
+                                       int edge)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, SET_INT_IN_POINTER(edge));
+	return ccgSubSurf_getEdgeNumFaces(ccg_edge);
+}
+
+static void conv_ccg_get_edge_faces(const OpenSubdiv_Converter *converter,
+                                    int edge,
+                                    int *edge_faces)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, SET_INT_IN_POINTER(edge));
+	int num_edge_faces = ccgSubSurf_getEdgeNumFaces(ccg_edge);
+	int face;
+	for (face = 0; face < num_edge_faces; face++) {
+		CCGFace *ccg_face = ccgSubSurf_getEdgeFace(ccg_edge, face);
+		edge_faces[face] = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ccg_face));
+	}
+}
+
+static int conv_ccg_get_num_vert_edges(const OpenSubdiv_Converter *converter,
+                                       int vert)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGVert *ccg_vert = ccgSubSurf_getVert(ss, SET_INT_IN_POINTER(vert));
+	return ccgSubSurf_getVertNumEdges(ccg_vert);
+}
+
+static void conv_ccg_get_vert_edges(const OpenSubdiv_Converter *converter,
+                                    int vert,
+                                    int *vert_edges)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGVert *ccg_vert = ccgSubSurf_getVert(ss, SET_INT_IN_POINTER(vert));
+	int num_vert_edges = ccgSubSurf_getVertNumEdges(ccg_vert);
+	int edge;
+	for (edge = 0; edge < num_vert_edges; edge++) {
+		CCGEdge *ccg_edge = ccgSubSurf_getVertEdge(ccg_vert, edge);
+		vert_edges[edge] = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
+	}
+}
+
+static int conv_ccg_get_num_vert_faces(const OpenSubdiv_Converter *converter,
+                                       int vert)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGVert *ccg_vert = ccgSubSurf_getVert(ss, SET_INT_IN_POINTER(vert));
+	return ccgSubSurf_getVertNumFaces(ccg_vert);
+}
+
+static void conv_ccg_get_vert_faces(const OpenSubdiv_Converter *converter,
+                                    int vert,
+                                    int *vert_faces)
+{
+	CCGSubSurf *ss = converter->user_data;
+	CCGVert *ccg_vert = ccgSubSurf_getVert(ss, SET_INT_IN_POINTER(vert));
+	int num_vert_faces = ccgSubSurf_getVertNumFaces(ccg_vert);
+	int face;
+	for (face = 0; face < num_vert_faces; face++) {
+		CCGFace *ccg_face = ccgSubSurf_getVertFace(ccg_vert, face);
+		vert_faces[face] = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ccg_face));
+	}
+}
+
+void ccgSubSurf_converter_setup_from_ccg(CCGSubSurf *ss,
+                     

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list