[Bf-blender-cvs] [50a46a5] master: GPU buffer materials:

Antony Riakiotakis noreply at git.blender.org
Sat Jul 25 14:44:35 CEST 2015


Commit: 50a46a5973d90787eaa37ea959b9035918a071af
Author: Antony Riakiotakis
Date:   Sat Jul 25 13:17:37 2015 +0200
Branches: master
https://developer.blender.org/rB50a46a5973d90787eaa37ea959b9035918a071af

GPU buffer materials:

Separate and reuse some shared code.

Also avoid counting for information we already know,
such as total loop triangles etc.

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

M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 4c94fe3..060ffff 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1652,12 +1652,6 @@ static void cdDM_drawobject_init_vert_points(
 	MEM_freeN(mat_orig_to_new);
 }
 
-typedef struct {
-	int elements;
-	int loops;
-	int polys;
-} GPUMaterialInfo;
-
 /* see GPUDrawObject's structure definition for a description of the
  * data being initialized here */
 static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
@@ -1666,8 +1660,8 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 	const MPoly *mpoly;
 	const MLoop *mloop;
 	int totmat = dm->totmat;
-	GPUMaterialInfo *mat_info;
-	int i, curmat, totelements, totloops, totpolys;
+	GPUBufferMaterial *mat_info;
+	int i, totloops, totpolys;
 
 	/* object contains at least one material (default included) so zero means uninitialized dm */
 	BLI_assert(totmat != 0);
@@ -1676,6 +1670,7 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 	mloop = dm->getLoopArray(dm);
 
 	totpolys = dm->getNumPolys(dm);
+	totloops = dm->getNumLoops(dm);
 
 	/* get the number of points used by each material, treating
 	 * each quad as two triangles */
@@ -1683,49 +1678,23 @@ static GPUDrawObject *cdDM_GPUobject_new(DerivedMesh *dm)
 
 	for (i = 0; i < totpolys; i++) {
 		const int mat_nr = mpoly[i].mat_nr;
-		mat_info[mat_nr].polys++;
-		mat_info[mat_nr].elements += 3 * ME_POLY_TRI_TOT(&mpoly[i]);
-		mat_info[mat_nr].loops += mpoly[i].totloop;
+		mat_info[mat_nr].totpolys++;
+		mat_info[mat_nr].totelements += 3 * ME_POLY_TRI_TOT(&mpoly[i]);
+		mat_info[mat_nr].totloops += mpoly[i].totloop;
 	}
 	/* create the GPUDrawObject */
 	gdo = MEM_callocN(sizeof(GPUDrawObject), "GPUDrawObject");
 	gdo->totvert = dm->getNumVerts(dm);
 	gdo->totedge = dm->getNumEdges(dm);
 
-	/* count the number of materials used by this DerivedMesh */
-	for (i = 0; i < totmat; i++) {
-		if (mat_info[i].elements > 0)
-			gdo->totmaterial++;
-	}
-
-	/* allocate an array of materials used by this DerivedMesh */
-	gdo->materials = MEM_mallocN(sizeof(GPUBufferMaterial) * gdo->totmaterial,
-	                             "GPUDrawObject.materials");
-
-	/* initialize the materials array */
-	for (i = 0, curmat = 0, totelements = 0, totloops = 0; i < totmat; i++) {
-		if (mat_info[i].elements > 0) {
-			gdo->materials[curmat].start = totelements;
-			/* can set it to points now but used in cdDM_drawobject_init_vert_points as counter */
-			gdo->materials[curmat].totelements = mat_info[i].elements;
-			gdo->materials[curmat].totloops = mat_info[i].loops;
-			gdo->materials[curmat].mat_nr = i;
-			gdo->materials[curmat].totpolys = mat_info[i].polys;
-			gdo->materials[curmat].polys = MEM_mallocN(sizeof(int) * mat_info[i].polys, "GPUBufferMaterial.polys");
-
-			totelements += mat_info[i].elements;
-			totloops += mat_info[i].loops;
-			curmat++;
-		}
-	}
+	GPU_buffer_material_finalize(gdo, mat_info, totmat);
 
 	gdo->tot_loop_verts = totloops;
 
 	/* store total number of points used for triangles */
-	gdo->tot_triangle_point = totelements;
+	gdo->tot_triangle_point = dm->getNumLoopTri(dm) * 3;
 
 	cdDM_drawobject_init_vert_points(gdo, mpoly, mloop, totpolys, totmat);
-	MEM_freeN(mat_info);
 
 	return gdo;
 }
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 7e5d00a..2a69ba4 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2458,12 +2458,6 @@ static void ccgDM_copy_gpu_data(
 	}
 }
 
-typedef struct {
-	int elements;
-	int loops;
-	int polys;
-} GPUMaterialInfo;
-
 static GPUDrawObject *ccgDM_GPUObjectNew(DerivedMesh *dm)
 {
 	GPUBufferMaterial *mat;
@@ -2474,8 +2468,8 @@ static GPUDrawObject *ccgDM_GPUObjectNew(DerivedMesh *dm)
 	DMFlagMat *faceFlags = ccgdm->faceFlags;
 	int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
 	int totmat = (faceFlags) ? dm->totmat : 1;
-	GPUMaterialInfo *matinfo;
-	int i, curmat, curelement;
+	GPUBufferMaterial *matinfo;
+	int i;
 	unsigned int tot_internal_edges = 0;
 	int edgeVerts = ccgSubSurf_getEdgeSize(ss);
 	int edgeSize = edgeVerts - 1;
@@ -2494,9 +2488,9 @@ static GPUDrawObject *ccgDM_GPUObjectNew(DerivedMesh *dm)
 			int numVerts = ccgSubSurf_getFaceNumVerts(f);
 			int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
 			int new_matnr = faceFlags[index].mat_nr;
-			matinfo[new_matnr].elements += numVerts * gridFaces * gridFaces * 6;
-			matinfo[new_matnr].loops += numVerts * gridFaces * gridFaces * 4;
-			matinfo[new_matnr].polys++;
+			matinfo[new_matnr].totelements += numVerts * gridFaces * gridFaces * 6;
+			matinfo[new_matnr].totloops += numVerts * gridFaces * gridFaces * 4;
+			matinfo[new_matnr].totpolys++;
 			tot_internal_edges += numVerts * gridFaces * (2 * gridFaces - 1);
 		}
 	}
@@ -2504,9 +2498,9 @@ static GPUDrawObject *ccgDM_GPUObjectNew(DerivedMesh *dm)
 		for (i = 0; i < totface; i++) {
 			CCGFace *f = ccgdm->faceMap[i].face;
 			int numVerts = ccgSubSurf_getFaceNumVerts(f);
-			matinfo[0].elements += numVerts * gridFaces * gridFaces * 6;
-			matinfo[0].loops += numVerts * gridFaces * gridFaces * 4;
-			matinfo[0].polys++;
+			matinfo[0].totelements += numVerts * gridFaces * gridFaces * 6;
+			matinfo[0].totloops += numVerts * gridFaces * gridFaces * 4;
+			matinfo[0].totpolys++;
 			tot_internal_edges += numVerts * gridFaces * (2 * gridFaces - 1);
 		}
 	}
@@ -2516,33 +2510,10 @@ static GPUDrawObject *ccgDM_GPUObjectNew(DerivedMesh *dm)
 	gdo->totvert = 0; /* used to count indices, doesn't really matter for ccgsubsurf */
 	gdo->totedge = (totedge * edgeSize + tot_internal_edges);
 
-	/* count the number of materials used by this DerivedMesh */
-	for (i = 0; i < totmat; i++) {
-		if (matinfo[i].elements > 0)
-			gdo->totmaterial++;
-	}
-
-	/* allocate an array of materials used by this DerivedMesh */
-	gdo->materials = MEM_mallocN(sizeof(GPUBufferMaterial) * gdo->totmaterial,
-	                             "GPUDrawObject.materials");
-
-	/* initialize the materials array */
-	for (i = 0, curmat = 0, curelement = 0; i < totmat; i++) {
-		if (matinfo[i].elements > 0) {
-			gdo->materials[curmat].start = curelement;
-			gdo->materials[curmat].totelements = matinfo[i].elements;
-			gdo->materials[curmat].totloops = matinfo[i].loops;
-			gdo->materials[curmat].mat_nr = i;
-			gdo->materials[curmat].totpolys = matinfo[i].polys;
-			gdo->materials[curmat].polys = MEM_mallocN(sizeof(int) * matinfo[i].polys, "GPUBufferMaterial.polys");
-
-			curelement += matinfo[i].elements;
-			curmat++;
-		}
-	}
+	GPU_buffer_material_finalize(gdo, matinfo, totmat);
 
 	/* store total number of points used for triangles */
-	gdo->tot_triangle_point = curelement;
+	gdo->tot_triangle_point = ccgSubSurf_getNumFinalFaces(ss) * 6;
 
 	gdo->tot_loop_verts = ccgSubSurf_getNumFinalFaces(ss) * 4;
 
@@ -2582,7 +2553,6 @@ static GPUDrawObject *ccgDM_GPUObjectNew(DerivedMesh *dm)
 	}
 
 	MEM_freeN(mat_orig_to_new);
-	MEM_freeN(matinfo);
 
 	return gdo;
 }
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index a50d63d..8bb3ef4 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -48,6 +48,7 @@ struct DMFlagMat;
 struct DerivedMesh;
 struct GSet;
 struct GPUVertPointLink;
+struct GPUDrawObject;
 struct PBVH;
 struct MVert;
 
@@ -71,6 +72,8 @@ typedef struct GPUBufferMaterial {
 	short mat_nr;
 } GPUBufferMaterial;
 
+void GPU_buffer_material_finalize(struct GPUDrawObject *gdo, GPUBufferMaterial *matinfo, int totmat);
+
 /* meshes are split up by material since changing materials requires
  * GL state changes that can't occur in the middle of drawing an
  * array.
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index b2bfb0b..bbffa5a 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -114,6 +114,36 @@ static int mres_prev_gridsize = -1;
 static GLenum mres_prev_index_type = 0;
 static unsigned mres_prev_totquad = 0;
 
+void GPU_buffer_material_finalize(GPUDrawObject *gdo, GPUBufferMaterial *matinfo, int totmat)
+{
+	int i, curmat, curelement;
+
+	/* count the number of materials used by this DerivedMesh */
+	for (i = 0; i < totmat; i++) {
+		if (matinfo[i].totelements > 0)
+			gdo->totmaterial++;
+	}
+
+	/* allocate an array of materials used by this DerivedMesh */
+	gdo->materials = MEM_mallocN(sizeof(GPUBufferMaterial) * gdo->totmaterial,
+	                             "GPUDrawObject.materials");
+
+	/* initialize the materials array */
+	for (i = 0, curmat = 0, curelement = 0; i < totmat; i++) {
+		if (matinfo[i].totelements > 0) {
+			gdo->materials[curmat] = matinfo[i];
+			gdo->materials[curmat].start = curelement;
+			gdo->materials[curmat].mat_nr = i;
+			gdo->materials[curmat].polys = MEM_mallocN(sizeof(int) * matinfo[i].totpolys, "GPUBufferMaterial.polys");
+
+			curelement += matinfo[i].totelements;
+			curmat++;
+		}
+	}
+
+	MEM_freeN(matinfo);
+}
+
 
 /* stores recently-deleted buffers so that new buffers won't have to
  * be recreated as often




More information about the Bf-blender-cvs mailing list