[Bf-blender-cvs] [a3762f1] temp_display_optimization: Define GPU buffer streams for material/ui data.

Antony Riakiotakis noreply at git.blender.org
Sat Mar 12 12:40:15 CET 2016


Commit: a3762f1fabf7f45045111f0cc5cc5a9e179bf4e3
Author: Antony Riakiotakis
Date:   Mon Dec 28 17:22:35 2015 +0100
Branches: temp_display_optimization
https://developer.blender.org/rBa3762f1fabf7f45045111f0cc5cc5a9e179bf4e3

Define GPU buffer streams for material/ui data.

Declare UV/Normal/Color buffers as deprecated. We will prefer
unified interleaved formats if we need to.

vertex format stays separate because it is needed for passes
like shadow map or edge pass or uv drawing.

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

M	source/blender/blenkernel/BKE_DerivedMesh.h
M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/editderivedmesh.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/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index d7d6daa..448f309 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -152,7 +152,7 @@ typedef enum DMDrawFlag {
 	DM_DRAW_SKIP_HIDDEN         = (1 << 4),
 	DM_DRAW_SKIP_SELECT         = (1 << 5),
 	DM_DRAW_SELECT_USE_EDITMODE = (1 << 6),
-	DM_DRAW_NEED_NORMALS        = (1 << 7)
+	DM_DRAW_NEED_NORMALS        = (1 << 7),
 } DMDrawFlag;
 
 typedef enum DMForeachFlag {
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 519b7b4..91a05b9 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -418,7 +418,7 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg
 	
 	GPU_edge_setup(dm);
 	gdo = dm->drawObject;
-	if (gdo->edges && gdo->points) {
+	if (gdo->edges && gdo->vertices) {
 		if (drawAllEdges && drawLooseEdges) {
 			GPU_buffer_draw_elements(gdo->edges, GL_LINES, 0, gdo->totedge * 2);
 		}
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 05cac25..7dc1fc4 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -782,6 +782,7 @@ static void emDM_buffer_copy_normal(
 }
 
 typedef struct FaceCount {
+	unsigned int i_selected;
 	unsigned int i_visible;
 	unsigned int i_hidden;
 	unsigned int i_tri_visible;
@@ -808,6 +809,7 @@ static void emDM_buffer_copy_triangles(
 	FaceCount *fc = MEM_mallocN(sizeof(*fc) * totmat, "gpumaterial.facecount");
 
 	for (i = 0; i < totmat; i++) {
+		fc[i].i_selected = 0;
 		fc[i].i_visible = 0;
 		fc[i].i_tri_visible = 0;
 		fc[i].i_hidden = gpumaterials[i].totpolys - 1;
@@ -1172,7 +1174,7 @@ static void emDM_drawMappedFaces(
 		/* weak, this logic should really be moved higher up */
 		setMaterial = NULL;
 	}
-
+#if 1
 	GPU_vertex_setup(dm);
 
 	/* if we do selection, fill the selection buffer color */
@@ -1210,6 +1212,7 @@ static void emDM_drawMappedFaces(
 	}
 	GPU_triangle_setup(dm);
 	glShadeModel(GL_SMOOTH);
+
 	for (i = 0; i < dm->drawObject->totmaterial; i++) {
 		if (!setMaterial || setMaterial(dm->drawObject->materials[i].mat_nr + 1, NULL)) {
 			unsigned int totalelem = (skip_hidden) ? dm->drawObject->materials[i].totvisibleelems :
@@ -1218,13 +1221,14 @@ static void emDM_drawMappedFaces(
 			                         dm->drawObject->materials[i].start, totalelem);
 		}
 	}
+
 	glShadeModel(GL_FLAT);
 	GPU_buffers_unbind();
 
 	if (findex_buffer)
 		GPU_buffer_free(findex_buffer);
 	return;
-
+#endif
 	if (bmdm->vertexCos) {
 		short prev_mat_nr = -1;
 
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 9799433..175f807 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1828,7 +1828,7 @@ static void ccgDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEd
 
 	GPU_edge_setup(dm);
 	gdo = dm->drawObject;
-	if (gdo->edges && gdo->points) {
+	if (gdo->edges && gdo->vertices) {
 		if (drawAllEdges && drawLooseEdges) {
 			GPU_buffer_draw_elements(gdo->edges, GL_LINES, 0, (gdo->totedge - gdo->totinterior) * 2);
 		}
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 6481747..5bcfa4b 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -90,16 +90,30 @@ void GPU_buffer_material_finalize(struct GPUDrawObject *gdo, GPUBufferMaterial *
  * for MFaces are referred to as triangles rather than faces.
  */
 typedef struct GPUDrawObject {
-	GPUBuffer *points;
+	/* vertices are kept in a separate buffer to ensure better cache coherence for edge drawing or
+	 * for passes not reliant to other formats, such as, for example, depth pass or shadow maps */
+	GPUBuffer *vertices;
+
+	/* legacy buffers, do not reuse */
 	GPUBuffer *normals;
 	GPUBuffer *uv;
 	GPUBuffer *uv_tex;
 	GPUBuffer *colors;
+
+	/* index buffers */
 	GPUBuffer *edges;
 	GPUBuffer *uvedges;
 	GPUBuffer *triangles; /* triangle index buffer */
 
-	GPUBuffer *editfacecolors; /* colors for edit mode */
+	/* material display data needed for the object. The resident data inside the buffer varies depending
+	 * on the material that is assigned to each polygon. Vertex stride is the maximum vertex stride needed
+	 * to accomodate the most fat material vertex format
+	 * NOTE: For future deferred rendering we might want to separate data that are needed for normals as well */
+	GPUBuffer *materialData;
+
+	/* These data exist only to display UI helpers for the mesh that are not relevant to materials. Examples
+	 * include selection state, weights and mode dependent visual debugging variables, uvs for uveditor */
+	GPUBuffer *workflowData;
 
 	/* for each original vertex, the list of related points */
 	struct GPUVertPointLink *vert_points;
@@ -159,33 +173,33 @@ typedef struct GPUAttrib {
  * This corresponds in a single interleaved buffer */
 typedef struct GPUMeshVertexAttribute
 {
-    /* char is sufficient here, we have less than 255 customdata types */
-    char customdatatype;
-    /* layer number, for layers that need it */
-    char layer;
+	/* char is sufficient here, we have less than 255 customdata types */
+	char customdatatype;
+	/* layer number, for layers that need it */
+	char layer;
 } GPUMeshVertexAttribute;
 
 typedef struct GPUMeshVertexFormat
 {
-    /* which customdata exist in the current vertex format */
-    long long customdataflag;
+	/* which customdata exist in the current vertex format */
+	long customdataflag;
 
-    /* number of customData in format */
-    char numData;
+	/* number of customData in format */
+	char numData;
 
-    /* actual current data existing in buffer */
-    GPUMeshVertexAttribute *layout;
+	/* actual current data existing in buffer */
+	GPUMeshVertexAttribute *layout;
 } GPUMeshVertexFormat;
 
 /* create a vertex format with the specified formats */
-GPUMeshVertexFormat *GPU_vertex_format_alloc(long long iformat);
+GPUMeshVertexFormat *GPU_vertex_format_alloc(long iformat);
 
 /* check if reusing the vertex format is possible */
-bool GPU_vertex_format_reuse(GPUMeshVertexFormat *vformat, long long iformat);
+bool GPU_vertex_format_reuse(GPUMeshVertexFormat *vformat, long iformat);
 
 /* bind the vertex format existing in the currently bound buffer object,
- * according to the format specified here */
-void GPU_vertex_format_bind(GPUMeshVertexFormat *vformat, long long iformat);
+ * according to the format specified here (should be a subset of the format of the buffer) */
+void GPU_vertex_format_bind(GPUMeshVertexFormat *vformat, long iformat);
 
 /* get the size of the vertex format */
 int GPU_vertex_format_size(GPUMeshVertexFormat *vformat);
@@ -211,8 +225,6 @@ typedef enum {
 	GPU_BUFFER_EDGE,
 	GPU_BUFFER_UVEDGE,
 	GPU_BUFFER_TRIANGLES,
-
-	GPU_BUFFER_EDITFACE_COLORS,
 } GPUBufferType;
 
 typedef enum {
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index c55554c..ddd7d71 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -455,7 +455,7 @@ void GPU_drawobject_free(DerivedMesh *dm)
 #ifdef USE_GPU_POINT_LINK
 	MEM_freeN(gdo->vert_points_mem);
 #endif
-	GPU_buffer_free(gdo->points);
+	GPU_buffer_free(gdo->vertices);
 	GPU_buffer_free(gdo->normals);
 	GPU_buffer_free(gdo->uv);
 	GPU_buffer_free(gdo->uv_tex);
@@ -463,7 +463,6 @@ void GPU_drawobject_free(DerivedMesh *dm)
 	GPU_buffer_free(gdo->edges);
 	GPU_buffer_free(gdo->uvedges);
 	GPU_buffer_free(gdo->triangles);
-	GPU_buffer_free(gdo->editfacecolors);
 
 	MEM_freeN(gdo);
 	dm->drawObject = NULL;
@@ -559,7 +558,7 @@ static GPUBuffer **gpu_drawobject_buffer_from_type(GPUDrawObject *gdo, GPUBuffer
 {
 	switch (type) {
 		case GPU_BUFFER_VERTEX:
-			return &gdo->points;
+			return &gdo->vertices;
 		case GPU_BUFFER_NORMAL:
 			return &gdo->normals;
 		case GPU_BUFFER_COLOR:
@@ -574,8 +573,6 @@ static GPUBuffer **gpu_drawobject_buffer_from_type(GPUDrawObject *gdo, GPUBuffer
 			return &gdo->uvedges;
 		case GPU_BUFFER_TRIANGLES:
 			return &gdo->triangles;
-		case GPU_BUFFER_EDITFACE_COLORS:
-			return &gdo->editfacecolors;
 		default:
 			return NULL;
 	}
@@ -591,9 +588,7 @@ static size_t gpu_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type)
 		case GPU_BUFFER_NORMAL:
 			return sizeof(short) * components * dm->drawObject->tot_loop_verts;
 		case GPU_BUFFER_COLOR:
-            return sizeof(char) * components * dm->drawObject->tot_loop_verts;
-		case GPU_BUFFER_EDITFACE_COLORS:
-            return sizeof(char) * components * dm->drawObject->tot_loop_verts;
+			return sizeof(char) * components * dm->drawObject->tot_loop_verts;
 		case GPU_BUFFER_UV:
 			return sizeof(float) * components * dm->drawObject->tot_loop_verts;
 		case GPU_BUFFER_UV_TEXPAINT:
@@ -653,7 +648,7 @@ void GPU_vertex_setup(DerivedMesh *dm)
 		return;
 
 	glEnableClientState(GL_VERTEX_ARRAY);
-	glBindBuffer(GL_ARRAY_BUFFER, dm->drawObject->points->id);
+	glBindBuffer(GL_ARRAY_BUFFER, dm->drawObject->vertices->id);
 	glVertexPointer(3, GL_FLOAT, 0, 0);
 	
 	GLStates |= GPU_BUFFER_VERTEX_STATE;
@@ -748,7 +743,7 @@ void GPU_edge_setup(DerivedMesh *dm)
 		return;
 
 	glEnableClientState(GL_VERTEX_ARRAY);
-	glBindBuffer(GL_ARRAY_BUFFER, dm->drawObject->points->id);
+	glBindBuffer(GL_ARRAY_BUFFER, dm->drawObject->vertices->id);
 	glVertexPointer(3, GL_FLOAT, 0, 0);
 	
 	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dm->drawObject->edges->id);




More information about the Bf-blender-cvs mailing list