[Bf-blender-cvs] [8d77fe8] strand_gpu: Cleanup: Move code for strand drawing buffers into its own file.

Lukas Tönne noreply at git.blender.org
Thu Jul 14 12:39:35 CEST 2016


Commit: 8d77fe834bf8d521d9f80cabccd3a75062453e86
Author: Lukas Tönne
Date:   Thu Jul 14 12:10:49 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB8d77fe834bf8d521d9f80cabccd3a75062453e86

Cleanup: Move code for strand drawing buffers into its own file.

The gpu_buffers.c file is becoming too large, and incorporates all the logic
from meshes and now strands, which should be separate from the API.

Making the strands buffer code separate also allows much more control,
e.g. for partially invalidating draw data and avoiding unnecessary buffer
uploads to the GPU.

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/GPU_strands.h
M	source/blender/gpu/intern/gpu_buffers.c
A	source/blender/gpu/intern/gpu_strands_buffer.c
R099	source/blender/gpu/intern/gpu_strands.c	source/blender/gpu/intern/gpu_strands_shader.c

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 72a3b76..f832bcd 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -58,7 +58,8 @@ set(SRC
 	intern/gpu_material.c
 	intern/gpu_select.c
 	intern/gpu_shader.c
-	intern/gpu_strands.c
+	intern/gpu_strands_buffer.c
+	intern/gpu_strands_shader.c
 	intern/gpu_texture.c
 
 	shaders/gpu_shader_fx_lib.glsl
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index d3666a0..cbff70f 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -203,6 +203,12 @@ void GPU_global_buffer_pool_free_unused(void);
 GPUBuffer *GPU_buffer_alloc(size_t size);
 void GPU_buffer_free(GPUBuffer *buffer);
 
+typedef void (*GPUBufferSetupCb)(void *varray, void *user);
+struct GPUBuffer *GPU_buffer_setup(int gl_target, size_t size, GPUBufferSetupCb copy_data, void *user, struct GPUBuffer *buffer);
+
+void GPU_enable_vertex_buffer(GPUBuffer *buffer, size_t elemsize);
+void GPU_enable_element_buffer(GPUBuffer *buffer);
+
 void GPU_drawobject_free(struct DerivedMesh *dm);
 
 /* flag that controls data type to fill buffer with, a modifier will prepare. */
@@ -313,24 +319,4 @@ bool GPU_pbvh_buffers_diffuse_changed(GPU_PBVH_Buffers *buffers, struct GSet *bm
 void GPU_free_pbvh_buffers(GPU_PBVH_Buffers *buffers);
 void GPU_free_pbvh_buffer_multires(struct GridCommonGPUBuffer **grid_common_gpu_buffer);
 
-/* strands */
-
-typedef struct GPUDrawStrandsParams {
-	struct Strands *strands;
-	struct BMEditStrands *edit;
-	struct DerivedMesh *root_dm;
-	int subdiv;
-	bool use_geomshader;
-} GPUDrawStrandsParams;
-
-struct GPUDrawStrands *GPU_strands_buffer_create(struct GPUDrawStrandsParams *params);
-
-void GPU_strands_setup_verts(struct GPUDrawStrands *gpu_buffer, struct GPUDrawStrandsParams *params);
-void GPU_strands_setup_edges(struct GPUDrawStrands *gpu_buffer, struct GPUDrawStrandsParams *params);
-void GPU_strands_setup_fibers(struct GPUDrawStrands *gpu_buffer, struct GPUDrawStrandsParams *params);
-
-void GPU_strands_buffer_unbind(void);
-
-void GPU_strands_buffer_free(struct GPUDrawStrands *gpu_buffer);
-
 #endif
diff --git a/source/blender/gpu/GPU_strands.h b/source/blender/gpu/GPU_strands.h
index 016bd4c..86cbdc3 100644
--- a/source/blender/gpu/GPU_strands.h
+++ b/source/blender/gpu/GPU_strands.h
@@ -37,9 +37,10 @@ extern "C" {
 #endif
 
 struct GPUAttrib;
-
 struct Strands;
 
+/* Shader */
+
 typedef struct GPUStrandsShader GPUStrandsShader;
 
 typedef enum GPUStrands_ShaderModel {
@@ -75,6 +76,28 @@ bool GPU_strand_shader_bound(GPUStrandsShader *gpu_shader);
 void GPU_strand_shader_get_fiber_attributes(struct GPUStrandsShader *gpu_shader,
                                             struct GPUAttrib **r_attrib, int *r_num);
 
+
+/* Strand Buffers */
+
+typedef struct GPUDrawStrandsParams {
+	struct Strands *strands;
+	struct BMEditStrands *edit;
+	struct DerivedMesh *root_dm;
+	int subdiv;
+	bool use_geomshader;
+} GPUDrawStrandsParams;
+
+struct GPUDrawStrands *GPU_strands_buffer_create(struct GPUDrawStrandsParams *params);
+
+void GPU_strands_setup_verts(struct GPUDrawStrands *gpu_buffer, struct GPUDrawStrandsParams *params);
+void GPU_strands_setup_edges(struct GPUDrawStrands *gpu_buffer, struct GPUDrawStrandsParams *params);
+void GPU_strands_setup_fibers(struct GPUDrawStrands *gpu_buffer, struct GPUDrawStrandsParams *params);
+
+void GPU_strands_buffer_unbind(void);
+
+void GPU_strands_buffer_free(struct GPUDrawStrands *gpu_buffer);
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 279fcd1..90d51d8 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -46,15 +46,12 @@
 #include "BLI_threads.h"
 
 #include "DNA_meshdata_types.h"
-#include "DNA_strand_types.h"
 
 #include "BKE_ccg.h"
 #include "BKE_DerivedMesh.h"
-#include "BKE_editstrands.h"
 #include "BKE_paint.h"
 #include "BKE_mesh.h"
 #include "BKE_pbvh.h"
-#include "BKE_strands.h"
 
 #include "GPU_buffers.h"
 #include "GPU_draw.h"
@@ -458,16 +455,10 @@ static GPUBuffer *gpu_try_realloc(GPUBufferPool *pool, GPUBuffer *buffer, size_t
 	return buffer;
 }
 
-static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, GPUDrawObject *object,
-                                   int type, void *user, GPUBuffer *buffer)
+GPUBuffer *GPU_buffer_setup(int gl_target, size_t size, GPUBufferSetupCb copy_data, void *user, GPUBuffer *buffer)
 {
 	GPUBufferPool *pool;
 	float *varray;
-	int *mat_orig_to_new;
-	int i;
-	const GPUBufferTypeSettings *ts = &gpu_buffer_type_settings[type];
-	GLenum target = ts->gl_buffer_type;
-	size_t size = gpu_mesh_buffer_size_from_type(dm, type);
 	GLboolean uploaded;
 
 	pool = gpu_get_global_buffer_pool();
@@ -482,25 +473,17 @@ static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, GPUDrawObject *object,
 		}
 	}
 
-	mat_orig_to_new = MEM_mallocN(sizeof(*mat_orig_to_new) * dm->totmat,
-	                              "GPU_buffer_setup.mat_orig_to_new");
-	for (i = 0; i < object->totmaterial; i++) {
-		/* map from original material index to new
-		 * GPUBufferMaterial index */
-		mat_orig_to_new[object->materials[i].mat_nr] = i;
-	}
-
 	/* bind the buffer and discard previous data,
 	 * avoids stalling gpu */
-	glBindBuffer(target, buffer->id);
-	glBufferData(target, buffer->size, NULL, GL_STATIC_DRAW);
+	glBindBuffer(gl_target, buffer->id);
+	glBufferData(gl_target, buffer->size, NULL, GL_STATIC_DRAW);
 
 	/* attempt to map the buffer */
-	if (!(varray = glMapBuffer(target, GL_WRITE_ONLY))) {
+	if (!(varray = glMapBuffer(gl_target, GL_WRITE_ONLY))) {
 		buffer = gpu_try_realloc(pool, buffer, size);
 
 		/* allocation still failed; unfortunately we need to exit */
-		if (!(buffer && (varray = glMapBuffer(target, GL_WRITE_ONLY)))) {
+		if (!(buffer && (varray = glMapBuffer(gl_target, GL_WRITE_ONLY)))) {
 			if (buffer)
 				gpu_buffer_free_intern(buffer);
 			BLI_mutex_unlock(&buffer_mutex);
@@ -512,21 +495,36 @@ static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, GPUDrawObject *object,
 
 	/* attempt to upload the data to the VBO */
 	while (uploaded == GL_FALSE) {
-		dm->copy_gpu_data(dm, type, varray, mat_orig_to_new, user);
+		copy_data(varray, user);
+		
 		/* glUnmapBuffer returns GL_FALSE if
 		 * the data store is corrupted; retry
 		 * in that case */
-		uploaded = glUnmapBuffer(target);
+		uploaded = glUnmapBuffer(gl_target);
 	}
-	glBindBuffer(target, 0);
-
-	MEM_freeN(mat_orig_to_new);
+	glBindBuffer(gl_target, 0);
 
 	BLI_mutex_unlock(&buffer_mutex);
 
 	return buffer;
 }
 
+void GPU_enable_vertex_buffer(GPUBuffer *buffer, size_t elemsize)
+{
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glBindBuffer(GL_ARRAY_BUFFER, buffer->id);
+	glVertexPointer(3, GL_FLOAT, elemsize, NULL);
+
+	GLStates |= (GPU_BUFFER_VERTEX_STATE);
+}
+
+void GPU_enable_element_buffer(GPUBuffer *buffer)
+{
+	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->id);
+
+	GLStates |= (GPU_BUFFER_ELEMENT_STATE);
+}
+
 /* get the GPUDrawObject buffer associated with a type */
 static GPUBuffer **gpu_drawobject_buffer_from_type(GPUDrawObject *gdo, GPUBufferType type)
 {
@@ -578,23 +576,57 @@ static size_t gpu_mesh_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type
 	}
 }
 
+typedef struct GPUDerivedMeshBufferInfo {
+	DerivedMesh *dm;
+	GPUDrawObject *object;
+	GPUBufferType type;
+	void *data_layer;
+	int *mat_orig_to_new;
+} GPUDerivedMeshBufferInfo;
+
+static void dm_copy_data_cb(void *varray, void *user)
+{
+	GPUDerivedMeshBufferInfo *info = user;
+	info->dm->copy_gpu_data(info->dm, info->type, varray, info->mat_orig_to_new, info->data_layer);
+}
+
 /* call gpu_buffer_setup with settings for a particular type of buffer */
 static GPUBuffer *gpu_buffer_setup_type(DerivedMesh *dm, GPUBufferType type, GPUBuffer *buf)
 {
-	void *user_data = NULL;
+	const GPUBufferTypeSettings *ts = &gpu_buffer_type_settings[type];
+	int gl_target = ts->gl_buffer_type;
+	size_t size = gpu_mesh_buffer_size_from_type(dm, type);
+	
+	GPUDerivedMeshBufferInfo info;
+	int i;
 
+	info.dm = dm;
+	info.object = dm->drawObject;
+	info.type = type;
+	
+	info.data_layer = NULL;
 	/* special handling for MCol and UV buffers */
 	if (type == GPU_BUFFER_COLOR) {
-		if (!(user_data = DM_get_loop_data_layer(dm, dm->drawObject->colType)))
+		if (!(info.data_layer = DM_get_loop_data_layer(dm, dm->drawObject->colType)))
 			return NULL;
 	}
 	else if (ELEM(type, GPU_BUFFER_UV, GPU_BUFFER_UV_TEXPAINT)) {
 		if (!DM_get_loop_data_layer(dm, CD_MLOOPUV))
 			return NULL;
 	}
+	
+	info.mat_orig_to_new = MEM_mallocN(sizeof(*info.mat_orig_to_new) * dm->totmat,
+	                                   "GPU_buffer_setup.mat_orig_to_new");
+	for (i = 0; i < info.object->totmaterial; i++) {
+		/* map from original material index to new
+		 * GPUBufferMaterial index */
+		info.mat_orig_to_new[info.object->materials[i].mat_nr] = i;
+	}
 
-	buf = gpu_buffer_setup(dm, dm->drawObject, type, user_data, buf);
-
+	buf = GPU_buffer_setup(gl_target, size, dm_copy_data_cb, &info, buf);
+	
+	MEM_freeN(info.mat_orig_to_new);
+	
 	return buf;
 }
 
@@ -2118,1015 +2150,3 @@ void GPU_end_draw_pbvh_BB(void)
 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 	glPopAttrib();
 }
-
-/* *************** */
-/* Strands Buffers */
-
-typedef struct GPUFiber {
-	/* object space location and orientation of the follicle */
-	float co[3];
-	float normal[3];
-	float tangent[3];
-	/* indices and weights for interpolating control strands */
-	unsigned int control_index[4];
-	float control_weight[4];
-	/* parametric distance from the primary control strand */
-	float root_distance[2];
-} GPUFiber;
-
-typedef struct GPUFiberVertex {
-	/* index of the fiber curve (for texture lookup) */
-	unsigned int fiber_index;
-	/* curve parameter for interpolation */
-	float curve_param;
-} GPUFiberVertex;
-
-typedef enum GPUStrandBufferType {
-	GPU_STRAND_BUFFER_STRAND_VERTEX = 0,
-	GPU_STRAND_BUFFER_STRAND_EDGE,
-	GPU_STRAND_BUFFER_CONTROL_VERTEX,
-	GPU_STRAND_BUFFER_CONTROL_CURVE,
-	GPU_STRAND_BUFFER_CONTROL_NORMAL,
-	GPU_STRAND_BUFFER_CONTROL_TANGENT,
-	/* fiber buffers */
-	GPU_STRAND_BUFFER_FIBER_VERTEX,
-	GPU_STRAND_BUFFER

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list