[Bf-blender-cvs] [0722e41f9ea] blender2.8: DWM: Use Gawain for sculpt drawing

Campbell Barton noreply at git.blender.org
Wed May 10 12:35:18 CEST 2017


Commit: 0722e41f9ea450be014d667417ff903510be2770
Author: Campbell Barton
Date:   Wed May 10 20:14:52 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB0722e41f9ea450be014d667417ff903510be2770

DWM: Use Gawain for sculpt drawing

Currently only uses the simple shader.

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

M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/sculpt_mode.c
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_buffers.c
M	source/blender/gpu/intern/gpu_shader.c
A	source/blender/gpu/shaders/gpu_shader_3D_normal_flat_color_vert.glsl
A	source/blender/gpu/shaders/gpu_shader_simple_lighting_flat_color_frag.glsl

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

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 831ffe528e0..427ebbab71e 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1690,9 +1690,16 @@ struct DRWTextStore *DRW_text_cache_ensure(void)
 bool DRW_object_is_renderable(Object *ob)
 {
 	Scene *scene = DST.draw_ctx.scene;
+	SceneLayer *sl = DST.draw_ctx.sl;
 	Object *obedit = scene->obedit;
+	Object *obact = OBACT_NEW;
 
 	if (ob->type == OB_MESH) {
+		if (ob == obact) {
+			if (ob->mode & OB_MODE_SCULPT) {
+				return false;
+			}
+		}
 		if (ob == obedit) {
 			IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_EDIT, "");
 			bool do_show_occlude_wire = BKE_collection_engine_property_value_get_bool(props, "show_occlude_wire");
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 97fa1fb7122..ff8118c6378 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -1192,7 +1192,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
 
 	if (do_outlines) {
 		Object *obedit = scene->obedit;
-		if (ob != obedit && !(OBACT_NEW == ob && ob->mode & (OB_MODE_WEIGHT_PAINT | OB_MODE_VERTEX_PAINT))) {
+		if (ob != obedit && !(OBACT_NEW == ob && ob->mode & OB_MODE_ALL_PAINT)) {
 			struct Batch *geom = DRW_cache_object_surface_get(ob);
 			if (geom) {
 				theme_id = DRW_object_wire_theme_get(ob, sl, NULL);
diff --git a/source/blender/draw/modes/sculpt_mode.c b/source/blender/draw/modes/sculpt_mode.c
index 015baf2a317..114bc8c96c4 100644
--- a/source/blender/draw/modes/sculpt_mode.c
+++ b/source/blender/draw/modes/sculpt_mode.c
@@ -26,8 +26,14 @@
 #include "DRW_engine.h"
 #include "DRW_render.h"
 
+#include "DNA_object_types.h"
+
+#include "BKE_pbvh.h"
+#include "BKE_paint.h"
+
 /* If builtin shaders are needed */
 #include "GPU_shader.h"
+#include "GPU_matrix.h"
 
 #include "draw_common.h"
 
@@ -192,7 +198,7 @@ static void SCULPT_cache_finish(void *vedata)
 /* Draw time ! Control rendering pipeline from here */
 static void SCULPT_draw_scene(void *vedata)
 {
-	SCULPT_PassList *psl = ((SCULPT_Data *)vedata)->psl;
+//	SCULPT_PassList *psl = ((SCULPT_Data *)vedata)->psl;
 	SCULPT_FramebufferList *fbl = ((SCULPT_Data *)vedata)->fbl;
 
 	/* Default framebuffer and texture */
@@ -211,7 +217,21 @@ static void SCULPT_draw_scene(void *vedata)
 	 */
 
 	/* ... or just render passes on default framebuffer. */
-	DRW_draw_pass(psl->pass);
+//	DRW_draw_pass(psl->pass);
+
+	{
+		const DRWContextState *draw_ctx = DRW_context_state_get();
+		SceneLayer *sl = draw_ctx->sl;
+		Object *ob = OBACT_NEW;
+
+		PBVH *pbvh = ob->sculpt->pbvh;
+
+		/* this shader is used inside draw call */
+		gpuPushMatrix();
+		gpuMultMatrix(ob->obmat);
+		BKE_pbvh_draw(pbvh, NULL, NULL, NULL, false, false);
+		gpuPopMatrix();
+	}
 
 	/* If you changed framebuffer, double check you rebind
 	 * the default one with its textures attached before finishing */
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index eaa0ec65d00..52c80448df1 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -128,6 +128,7 @@ data_to_c_simple(shaders/gpu_shader_uniform_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_checker_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_diag_stripes_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_simple_lighting_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_simple_lighting_flat_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_simple_lighting_smooth_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_simple_lighting_smooth_color_alpha_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_flat_color_frag.glsl SRC)
@@ -156,6 +157,7 @@ data_to_c_simple(shaders/gpu_shader_3D_flat_color_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_3D_line_dashed_legacy_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_3D_line_dashed_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_3D_smooth_color_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_3D_normal_flat_color_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_3D_normal_smooth_color_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_3D_smooth_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_3D_passthrough_vert.glsl SRC)
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index d6e3585b686..631970bf01a 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -105,6 +105,7 @@ typedef enum GPUBuiltinShader {
 	GPU_SHADER_EDGES_OVERLAY,
 	GPU_SHADER_KEYFRAME_DIAMOND,
 	GPU_SHADER_SIMPLE_LIGHTING,
+	GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR,
 	GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR,
 	GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA,
 	/* for simple 2D drawing */
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 054803f468a..7a5ed4784d4 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -35,8 +35,6 @@
 #include <stddef.h>
 #include <string.h>
 
-#include "GPU_glew.h"
-
 #include "MEM_guardedalloc.h"
 
 #include "BLI_bitmap.h"
@@ -53,13 +51,21 @@
 #include "BKE_mesh.h"
 #include "BKE_pbvh.h"
 
+#include "GPU_glew.h"
+#include "GPU_shader.h"
+
 #include "GPU_buffers.h"
 #include "GPU_draw.h"
 #include "GPU_basic_shader.h"
 #include "GPU_immediate.h"
 
+#include "GPU_batch.h"
+
 #include "bmesh.h"
 
+/* TODO: gawain support for baseelemarray */
+// #define USE_BASE_ELEM
+
 typedef enum {
 	GPU_BUFFER_VERTEX_STATE = (1 << 0),
 	GPU_BUFFER_NORMAL_STATE = (1 << 1),
@@ -107,9 +113,8 @@ static ThreadMutex buffer_mutex = BLI_MUTEX_INITIALIZER;
 
 /* multires global buffer, can be used for many grids having the same grid size */
 typedef struct GridCommonGPUBuffer {
-	GPUBuffer *mres_buffer;
+	ElementList *mres_buffer;
 	int mres_prev_gridsize;
-	GLenum mres_prev_index_type;
 	unsigned mres_prev_totquad;
 } GridCommonGPUBuffer;
 
@@ -958,12 +963,11 @@ typedef struct {
 } VertexBufferFormat;
 
 struct GPU_PBVH_Buffers {
-	/* opengl buffer handles */
-	GPUBuffer *vert_buf, *index_buf, *index_buf_fast;
-	GLenum index_type;
+	ElementList *index_buf, *index_buf_fast;
+	VertexBuffer *vert_buf;
 
-	int *baseelemarray;
-	void **baseindex;
+	Batch *triangles;
+	Batch *triangles_fast;
 
 	/* mesh pointers in case buffer allocation fails */
 	const MPoly *mpoly;
@@ -998,6 +1002,51 @@ struct GPU_PBVH_Buffers {
 	float diffuse_color[4];
 };
 
+typedef struct {
+	uint pos, nor, col;
+} VertexBufferAttrID;
+
+static void gpu_pbvh_vert_format_init__gwn(VertexFormat *format, VertexBufferAttrID *vbo_id)
+{
+	vbo_id->pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 3, KEEP_FLOAT);
+	vbo_id->nor = VertexFormat_add_attrib(format, "nor", COMP_I16, 3, NORMALIZE_INT_TO_FLOAT);
+	vbo_id->col = VertexFormat_add_attrib(format, "color", COMP_U8, 3, NORMALIZE_INT_TO_FLOAT);
+}
+
+static void gpu_pbvh_batch_init(GPU_PBVH_Buffers *buffers)
+{
+	GPUBuiltinShader shader_id =
+	        buffers->smooth ? GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR : GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR;
+	GPUShader *shader = GPU_shader_get_builtin_shader(shader_id);
+
+	/* force flushing to the GPU */
+	if (buffers->vert_buf->data) {
+		VertexBuffer_use(buffers->vert_buf);
+	}
+
+	BATCH_DISCARD_SAFE(buffers->triangles);
+	buffers->triangles = Batch_create(
+	        PRIM_TRIANGLES, buffers->vert_buf,
+	        /* can be NULL */
+	        buffers->index_buf);
+	Batch_set_program(
+	        buffers->triangles,
+	        GPU_shader_get_program(shader), GPU_shader_get_interface(shader));
+
+
+	BATCH_DISCARD_SAFE(buffers->triangles_fast);
+	if (buffers->index_buf_fast) {
+		buffers->triangles_fast = Batch_create(
+		        PRIM_TRIANGLES, buffers->vert_buf,
+		        /* can be NULL */
+		        buffers->index_buf_fast);
+
+		Batch_set_program(
+		        buffers->triangles_fast,
+		        GPU_shader_get_program(shader), GPU_shader_get_interface(shader));
+	}
+}
+
 static float gpu_color_from_mask(float mask)
 {
 	return 1.0f - mask * 0.75f;
@@ -1036,9 +1085,6 @@ void GPU_update_mesh_pbvh_buffers(
         const int *vert_indices, int totvert, const float *vmask,
         const int (*face_vert_indices)[3], bool show_diffuse_color)
 {
-	VertexBufferFormat *vert_data;
-	int i, j;
-
 	buffers->vmask = vmask;
 	buffers->show_diffuse_color = show_diffuse_color;
 	buffers->use_matcaps = GPU_material_use_matcaps_get();
@@ -1059,53 +1105,50 @@ void GPU_update_mesh_pbvh_buffers(
 		copy_v4_v4(buffers->diffuse_color, diffuse_color);
 
 		/* Build VBO */
-		if (buffers->vert_buf)
-			GPU_buffer_free(buffers->vert_buf);
-		buffers->vert_buf = GPU_buffer_alloc(sizeof(VertexBufferFormat) * totelem);
-		vert_data = GPU_buffer_lock(buffers->vert_buf, GPU_BINDING_ARRAY);
+		VERTEXBUFFER_DISCARD_SAFE(buffers->vert_buf);
+
+		/* match 'VertexBufferFormat' */
+		VertexFormat format = {0};
+		VertexBufferAttrID vbo_id;
+		gpu_pbvh_vert_format_init__gwn(&format, &vbo_id);
+
+		buffers->vert_buf = VertexBuffer_create_with_format(&format);
+		VertexBuffer_allocate_data(buffers->vert_buf, totelem);
 
-		if (vert_data) {
+		if (buffers->vert_buf->data) {
 			/* Vertex data is shared if smooth-shaded, but separate
 			 * copies are made for flat shading because normals
 			 * shouldn't be shared. */
 			if (buffers->smooth) {
-				for (i = 0; i < totvert; ++i) {
+				for (uint i = 0; i < totvert; ++i) {
 					const MVert *v = &mvert[vert_indices[i]];
-					VertexBufferFormat *out = vert_data + i;
-
-					copy_v3_v3(out->co, v->co);
-					memcpy(out->no, v->no, sizeof(short) * 3);
+					VertexBuffer_set_attrib(buffers->vert_buf, vbo_id.pos, i, v->co);
+					VertexBuffer_set_attrib(buffers->vert_buf, vbo_id.nor, i, v->no);
 				}
 
-#define UPDATE_VERTEX(face, vertex, index, diffuse_color) \
-				{ \
-					VertexBufferFormat *out = vert_data + face_vert_indices[face][index]; \
-					if (vmask) \
-						gpu_color_from_mask_copy(vmask[vertex], diffuse_color, out->color); \
-					else \
-						rgb_float_to_uchar(out->color, diffuse_color); \
-				} (void)0
-
-				for (i = 0; i

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list