[Bf-blender-cvs] [efd547f] master: GPU: avoid multiple bind calls in GPU_draw_pbvh_buffers

Campbell Barton noreply at git.blender.org
Thu Jun 9 22:10:01 CEST 2016


Commit: efd547f3da10a247fdcff66e74f9b98ec3abdd39
Author: Campbell Barton
Date:   Fri Jun 10 06:08:39 2016 +1000
Branches: master
https://developer.blender.org/rBefd547f3da10a247fdcff66e74f9b98ec3abdd39

GPU: avoid multiple bind calls in GPU_draw_pbvh_buffers

Also add utility functions: GPU_basic_shader_bind_enable/disable
so we don't have to get the previous state every time and manipulate it

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

M	source/blender/editors/interface/interface_draw.c
M	source/blender/gpu/GPU_basic_shader.h
M	source/blender/gpu/intern/gpu_basic_shader.c
M	source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index d78b418..3afea54 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -1205,8 +1205,7 @@ void ui_draw_but_UNITVEC(uiBut *but, uiWidgetColors *wcol, const rcti *rect)
 		
 		qobj = gluNewQuadric();
 		gluQuadricDrawStyle(qobj, GLU_FILL);
-		int bound_options = GPU_basic_shader_bound_options();
-		GPU_basic_shader_bind(bound_options);
+		GPU_basic_shader_bind(GPU_basic_shader_bound_options());
 		gluSphere(qobj, 100.0, 32, 24);
 		gluDeleteQuadric(qobj);
 		
diff --git a/source/blender/gpu/GPU_basic_shader.h b/source/blender/gpu/GPU_basic_shader.h
index 6c78aec..d9bf3d1 100644
--- a/source/blender/gpu/GPU_basic_shader.h
+++ b/source/blender/gpu/GPU_basic_shader.h
@@ -76,6 +76,9 @@ void GPU_basic_shaders_init(void);
 void GPU_basic_shaders_exit(void);
 
 void GPU_basic_shader_bind(int options);
+void GPU_basic_shader_bind_enable(int options);
+void GPU_basic_shader_bind_disable(int options);
+
 int GPU_basic_shader_bound_options(void);
 
 /* Only use for small blocks of code that don't support glsl shader. */
diff --git a/source/blender/gpu/intern/gpu_basic_shader.c b/source/blender/gpu/intern/gpu_basic_shader.c
index c5a2d07..1e60944 100644
--- a/source/blender/gpu/intern/gpu_basic_shader.c
+++ b/source/blender/gpu/intern/gpu_basic_shader.c
@@ -520,6 +520,16 @@ void GPU_basic_shader_bind(int options)
 	GPU_MATERIAL_STATE.bound_options = options;
 }
 
+void GPU_basic_shader_bind_enable(int options)
+{
+	GPU_basic_shader_bind(GPU_MATERIAL_STATE.bound_options | options);
+}
+
+void GPU_basic_shader_bind_disable(int options)
+{
+	GPU_basic_shader_bind(GPU_MATERIAL_STATE.bound_options & ~options);
+}
+
 int GPU_basic_shader_bound_options(void)
 {
 	/* ideally this should disappear, anything that uses this is making fragile
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 35bfc68..36d297f 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -1843,15 +1843,15 @@ void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
 	if (buffers->vert_buf) {
 		char *base = NULL;
 		char *index_base = NULL;
-		int bound_options = 0;
+		/* weak inspection of bound options, should not be necessary ideally */
+		const int bound_options_old = GPU_basic_shader_bound_options();
+		int bound_options_new = 0;
 		glEnableClientState(GL_VERTEX_ARRAY);
 		if (!wireframe) {
 			glEnableClientState(GL_NORMAL_ARRAY);
 			glEnableClientState(GL_COLOR_ARRAY);
 
-			/* weak inspection of bound options, should not be necessary ideally */
-			bound_options = GPU_basic_shader_bound_options();
-			GPU_basic_shader_bind(bound_options | GPU_SHADER_USE_COLOR);
+			bound_options_new |= GPU_SHADER_USE_COLOR;
 		}
 
 		GPU_buffer_bind(buffers->vert_buf, GPU_BINDING_ARRAY);
@@ -1867,9 +1867,13 @@ void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
 			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 		}
 		else {
-			bound_options = GPU_basic_shader_bound_options();
-			GPU_basic_shader_bind(bound_options | ((buffers->smooth || buffers->face_indices_len) ?
-			                      0 : GPU_SHADER_FLAT_NORMAL));
+			if ((buffers->smooth == false) && (buffers->face_indices_len == 0)) {
+				bound_options_new |= GPU_SHADER_FLAT_NORMAL;
+			}
+		}
+
+		if (bound_options_new & ~bound_options_old) {
+			GPU_basic_shader_bind(bound_options_old | bound_options_new);
 		}
 
 		if (buffers->tot_quad) {
@@ -1944,7 +1948,10 @@ void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
 		if (!wireframe) {
 			glDisableClientState(GL_NORMAL_ARRAY);
 			glDisableClientState(GL_COLOR_ARRAY);
-			GPU_basic_shader_bind(bound_options);
+		}
+
+		if (bound_options_new & ~bound_options_old) {
+			GPU_basic_shader_bind(bound_options_old);
 		}
 	}
 }




More information about the Bf-blender-cvs mailing list