[Bf-blender-cvs] [0ba3a1a6863] blender2.8: Sculpt: Optimize Mask Overlay drawing

Clément Foucault noreply at git.blender.org
Fri Aug 24 16:47:03 CEST 2018


Commit: 0ba3a1a6863a4b5960933df7d5a12d158da5d0d0
Author: Clément Foucault
Date:   Fri Aug 24 16:46:42 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB0ba3a1a6863a4b5960933df7d5a12d158da5d0d0

Sculpt: Optimize Mask Overlay drawing

* Remove support for diffuse color in the pbvh buffers.
* Upload raw data to GPU.
* Only draw nodes that have mask data when drawing the overlay.

This should fix T56466

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

M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/modes/sculpt_mode.c
A	source/blender/draw/modes/shaders/sculpt_mask_vert.glsl
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 095f442ca50..a0c8cab10fc 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -130,7 +130,7 @@ bool BKE_pbvh_node_find_nearest_to_ray(
 /* Drawing */
 
 void BKE_pbvh_draw_cb(
-        PBVH *bvh, float (*planes)[4], float (*fnors)[3], bool fast,
+        PBVH *bvh, float (*planes)[4], float (*fnors)[3], bool fast, bool only_mask,
         void (*draw_fn)(void *user_data, struct GPUBatch *batch), void *user_data);
 
 /* PBVH Access */
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 3e7a9b7ce24..00d6fa96856 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -1107,7 +1107,6 @@ void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int totnode, int flag)
 static int pbvh_get_buffers_update_flags(PBVH *bvh)
 {
 	int update_flags = 0;
-	update_flags |= bvh->show_diffuse_color ? GPU_PBVH_BUFFERS_SHOW_DIFFUSE_COLOR : 0;
 	update_flags |= bvh->show_mask ? GPU_PBVH_BUFFERS_SHOW_MASK : 0;
 	return update_flags;
 }
@@ -2053,33 +2052,11 @@ bool BKE_pbvh_node_planes_exclude_AABB(PBVHNode *node, void *data)
 	return test_planes_aabb(bb_min, bb_max, data) != ISECT_INSIDE;
 }
 
-static void pbvh_node_check_diffuse_changed(PBVH *bvh, PBVHNode *node)
-{
-	if (!node->draw_buffers)
-		return;
-
-	if (GPU_pbvh_buffers_diffuse_changed(node->draw_buffers, node->bm_faces, bvh->show_diffuse_color))
-		node->flag |= PBVH_UpdateDrawBuffers;
-}
-
-/* TODO: not needed anymore in 2.8? */
-#if 0
-static void pbvh_node_check_mask_changed(PBVH *bvh, PBVHNode *node)
-{
-	if (!node->draw_buffers) {
-		return;
-	}
-	if (GPU_pbvh_buffers_mask_changed(node->draw_buffers, bvh->show_mask)) {
-		node->flag |= PBVH_UpdateDrawBuffers;
-	}
-}
-#endif
-
 struct PBVHNodeDrawCallbackData {
-
 	void (*draw_fn)(void *user_data, GPUBatch *batch);
 	void *user_data;
 	bool fast;
+	bool only_mask; /* Only draw nodes that have mask data. */
 };
 
 static void pbvh_node_draw_cb(PBVHNode *node, void *data_v)
@@ -2088,8 +2065,11 @@ static void pbvh_node_draw_cb(PBVHNode *node, void *data_v)
 
 	if (!(node->flag & PBVH_FullyHidden)) {
 		GPUBatch *triangles = GPU_pbvh_buffers_batch_get(node->draw_buffers, data->fast);
-		if (triangles != NULL) {
-			data->draw_fn(data->user_data, triangles);
+		bool show_mask = GPU_pbvh_buffers_has_mask(node->draw_buffers);
+		if (!data->only_mask || show_mask) {
+			if (triangles != NULL) {
+				data->draw_fn(data->user_data, triangles);
+			}
 		}
 	}
 }
@@ -2098,10 +2078,11 @@ static void pbvh_node_draw_cb(PBVHNode *node, void *data_v)
  * Version of #BKE_pbvh_draw that runs a callback.
  */
 void BKE_pbvh_draw_cb(
-        PBVH *bvh, float (*planes)[4], float (*fnors)[3], bool fast,
+        PBVH *bvh, float (*planes)[4], float (*fnors)[3], bool fast, bool only_mask,
         void (*draw_fn)(void *user_data, GPUBatch *batch), void *user_data)
 {
 	struct PBVHNodeDrawCallbackData draw_data = {
+		.only_mask = only_mask,
 		.fast = fast,
 		.draw_fn = draw_fn,
 		.user_data = user_data,
@@ -2109,9 +2090,6 @@ void BKE_pbvh_draw_cb(
 	PBVHNode **nodes;
 	int totnode;
 
-	for (int a = 0; a < bvh->totnode; a++)
-		pbvh_node_check_diffuse_changed(bvh, &bvh->nodes[a]);
-
 	BKE_pbvh_search_gather(bvh, update_search_cb, SET_INT_IN_POINTER(PBVH_UpdateNormals | PBVH_UpdateDrawBuffers),
 	                       &nodes, &totnode);
 
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 035a5b9295b..bac3a2f02fb 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -311,6 +311,7 @@ data_to_c_simple(modes/shaders/paint_wire_vert.glsl SRC)
 data_to_c_simple(modes/shaders/paint_vert_frag.glsl SRC)
 data_to_c_simple(modes/shaders/particle_strand_frag.glsl SRC)
 data_to_c_simple(modes/shaders/particle_strand_vert.glsl SRC)
+data_to_c_simple(modes/shaders/sculpt_mask_vert.glsl SRC)
 data_to_c_simple(modes/shaders/volume_velocity_vert.glsl SRC)
 
 data_to_c_simple(engines/gpencil/shaders/gpencil_fill_vert.glsl SRC)
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 08045687795..96e862d2439 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -539,7 +539,7 @@ static void sculpt_draw_cb(
 
 	if (pbvh) {
 		BKE_pbvh_draw_cb(
-		        pbvh, NULL, NULL, false,
+		        pbvh, NULL, NULL, false, false,
 		        (void (*)(void *, GPUBatch *))draw_fn, shgroup);
 	}
 }
diff --git a/source/blender/draw/modes/sculpt_mode.c b/source/blender/draw/modes/sculpt_mode.c
index 56b5898a6cf..c80fd40cf27 100644
--- a/source/blender/draw/modes/sculpt_mode.c
+++ b/source/blender/draw/modes/sculpt_mode.c
@@ -43,6 +43,10 @@
 
 #include "draw_mode_engines.h"
 
+extern char datatoc_sculpt_mask_vert_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
+extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
+
 /* *********** LISTS *********** */
 /* All lists are per viewport specific datas.
  * They are all free when viewport changes engines
@@ -121,26 +125,14 @@ static void SCULPT_engine_init(void *vedata)
 
 	UNUSED_VARS(txl, fbl, stl);
 
-	/* Init Framebuffers like this: order is attachment order (for color texs) */
-	/*
-	 * DRWFboTexture tex[2] = {{&txl->depth, GPU_DEPTH_COMPONENT24, 0},
-	 *                         {&txl->color, GPU_RGBA8, DRW_TEX_FILTER}};
-	 */
-
-	/* DRW_framebuffer_init takes care of checking if
-	 * the framebuffer is valid and has the right size*/
-	/*
-	 * float *viewport_size = DRW_viewport_size_get();
-	 * DRW_framebuffer_init(&fbl->occlude_wire_fb,
-	 *                     (int)viewport_size[0], (int)viewport_size[1],
-	 *                     tex, 2);
-	 */
-
 	if (!e_data.shader_flat) {
-		e_data.shader_flat = GPU_shader_get_builtin_shader(GPU_SHADER_3D_FLAT_COLOR);
+		e_data.shader_flat = DRW_shader_create(datatoc_sculpt_mask_vert_glsl, NULL,
+		                                       datatoc_gpu_shader_flat_color_frag_glsl,
+		                                       "#define SHADE_FLAT");
 	}
 	if (!e_data.shader_smooth) {
-		e_data.shader_smooth = GPU_shader_get_builtin_shader(GPU_SHADER_3D_SMOOTH_COLOR);
+		e_data.shader_smooth = DRW_shader_create(datatoc_sculpt_mask_vert_glsl, NULL,
+		                                         datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL);
 	}
 }
 
@@ -183,6 +175,21 @@ static bool object_is_flat(const Object *ob)
 	}
 }
 
+static void sculpt_draw_mask_cb(
+        DRWShadingGroup *shgroup,
+        void (*draw_fn)(DRWShadingGroup *shgroup, struct GPUBatch *geom),
+        void *user_data)
+{
+	Object *ob = user_data;
+	PBVH *pbvh = ob->sculpt->pbvh;
+
+	if (pbvh) {
+		BKE_pbvh_draw_cb(
+		        pbvh, NULL, NULL, false, true,
+		        (void (*)(void *, struct GPUBatch *))draw_fn, shgroup);
+	}
+}
+
 /* Add geometry to shadingGroups. Execute for each objects */
 static void SCULPT_cache_populate(void *vedata, Object *ob)
 {
@@ -210,8 +217,7 @@ static void SCULPT_cache_populate(void *vedata, Object *ob)
 				/* Get geometry cache */
 				DRWShadingGroup *shgroup = object_is_flat(ob) ? stl->g_data->group_flat : stl->g_data->group_smooth;
 
-				/* Add geom to a shading group */
-				DRW_shgroup_call_sculpt_add(shgroup, ob, ob->obmat);
+				DRW_shgroup_call_generate_add(shgroup, sculpt_draw_mask_cb, ob, ob->obmat);
 			}
 		}
 	}
@@ -260,7 +266,8 @@ static void SCULPT_draw_scene(void *vedata)
  * Mostly used for freeing shaders */
 static void SCULPT_engine_free(void)
 {
-	// DRW_SHADER_FREE_SAFE(custom_shader);
+	DRW_SHADER_FREE_SAFE(e_data.shader_flat);
+	DRW_SHADER_FREE_SAFE(e_data.shader_smooth);
 }
 
 static const DrawEngineDataSize SCULPT_data_size = DRW_VIEWPORT_DATA_SIZE(SCULPT_Data);
diff --git a/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl b/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl
new file mode 100644
index 00000000000..e76d21eb43a
--- /dev/null
+++ b/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl
@@ -0,0 +1,19 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+
+in vec3 pos;
+in float msk;
+
+#ifdef SHADE_FLAT
+flat out vec4 finalColor;
+#else
+out vec4 finalColor;
+#endif
+
+void main()
+{
+	gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+
+	float mask = 1.0 - msk * 0.75;
+	finalColor = vec4(mask, mask, mask, 1.0);
+}
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 77801256463..e60b5d60c30 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -66,7 +66,6 @@ GPU_PBVH_Buffers *GPU_pbvh_bmesh_buffers_build(bool smooth_shading);
 /* update */
 
 enum {
-	GPU_PBVH_BUFFERS_SHOW_DIFFUSE_COLOR = (1 << 0),
 	GPU_PBVH_BUFFERS_SHOW_MASK = (1 << 1),
 };
 
@@ -93,12 +92,11 @@ void GPU_pbvh_grid_buffers_update(
 /* draw */
 struct GPUBatch *GPU_pbvh_buffers_batch_get(GPU_PBVH_Buffers *buffers, bool fast);
 
+bool GPU_pbvh_buffers_has_mask(GPU_PBVH_Buffers *buffers);
+
 /* debug PBVH draw */
 void GPU_pbvh_BB_draw(float min[3], float max[3], bool leaf, unsigned int pos);
 
-bool GPU_pbvh_buffers_diffuse_changed(GPU_PBVH_Buffers *buffers, struct GSet *bm_faces, bool show_diffuse_color);
-bool GPU_pbvh_buffers_mask_changed(GPU_PBVH_Buffers *buffers, bool show_mask);
-
 void GPU_pbvh_buffers_free(GPU_PBVH_Buffers *buffers);
 void GPU_pbvh_multires_buffers_free(struct GridCommonGPUBuffer **grid_common_gpu_buffer);
 
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 16590785af6..458486584a7 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -85,7 +85,6 @@ struct GPU_PBVH_Buffers {
 
 	const int *face_indices;
 	int        face_indices_len;
-	const float *vmask;
 
 	/* grid pointers */
 	CCGKey gridkey;
@@ -105,25 +104,13 @@ struct GPU_PBVH_Buffers {
 	 * smooth-shaded or all faces are flat-shaded */
 	bool smooth;
 
-	bool show_diffuse_color;
 	bool show_mask;
-
-	float diffuse_color[4];
 };
 
 static struct {
-	uint pos, nor, col;
+	uint pos, nor, msk;
 } g_vbo_id = {0};
 
-st

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list