[Bf-blender-cvs] [e03e977385c] blender2.8: OpenGL: call glProgramUniform only if version >= 4.1

Mike Erwin noreply at git.blender.org
Fri May 19 00:31:49 CEST 2017


Commit: e03e977385c9285ec13695f93e43bb805c4dd0af
Author: Mike Erwin
Date:   Thu May 18 18:30:09 2017 -0400
Branches: blender2.8
https://developer.blender.org/rBe03e977385c9285ec13695f93e43bb805c4dd0af

OpenGL: call glProgramUniform only if version >= 4.1

Otherwise crash! Called from OpenSubdiv setup code. Might start using this in more places...

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

M	intern/opensubdiv/opensubdiv_gpu_capi.cc
M	source/blender/gpu/intern/gpu_shader.c

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

diff --git a/intern/opensubdiv/opensubdiv_gpu_capi.cc b/intern/opensubdiv/opensubdiv_gpu_capi.cc
index 681fc319dce..32474d7cb60 100644
--- a/intern/opensubdiv/opensubdiv_gpu_capi.cc
+++ b/intern/opensubdiv/opensubdiv_gpu_capi.cc
@@ -296,18 +296,26 @@ GLuint linkProgram(const char *version, const char *define)
 	                      glGetUniformBlockIndex(program, "Lighting"),
 	                      0);
 
-	/* TODO: use glUseProgram, glUniform */
-	glProgramUniform1i(program,
-	                   glGetUniformLocation(program, "texture_buffer"),
-	                   0);  /* GL_TEXTURE0 */
-
-	glProgramUniform1i(program,
-	                   glGetUniformLocation(program, "FVarDataOffsetBuffer"),
-	                   30);  /* GL_TEXTURE30 */
-
-	glProgramUniform1i(program,
-	                   glGetUniformLocation(program, "FVarDataBuffer"),
-	                   31);  /* GL_TEXTURE31 */
+	if (GLEW_VERSION_4_1) {
+		glProgramUniform1i(program,
+		                   glGetUniformLocation(program, "texture_buffer"),
+		                   0);  /* GL_TEXTURE0 */
+
+		glProgramUniform1i(program,
+		                   glGetUniformLocation(program, "FVarDataOffsetBuffer"),
+		                   30);  /* GL_TEXTURE30 */
+
+		glProgramUniform1i(program,
+		                   glGetUniformLocation(program, "FVarDataBuffer"),
+		                   31);  /* GL_TEXTURE31 */
+	}
+	else {
+		glUseProgram(program);
+		glUniform1i(glGetUniformLocation(program, "texture_buffer"), 0);  /* GL_TEXTURE0 */
+		glUniform1i(glGetUniformLocation(program, "FVarDataOffsetBuffer"), 30);  /* GL_TEXTURE30 */
+		glUniform1i(glGetUniformLocation(program, "FVarDataBuffer"), 31);  /* GL_TEXTURE31 */
+		glUseProgram(0);
+	}
 
 	return program;
 }
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 58610ee7f4b..83e126bd39f 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -435,14 +435,22 @@ GPUShader *GPU_shader_create_ex(const char *vertexcode,
 
 #ifdef WITH_OPENSUBDIV
 	/* TODO(sergey): Find a better place for this. */
-	if (use_opensubdiv && GLEW_VERSION_4_1) {
-		glProgramUniform1i(shader->program,
-		                   ShaderInterface_uniform(shader->interface, "FVarDataOffsetBuffer")->location,
-		                   30);  /* GL_TEXTURE30 */
-
-		glProgramUniform1i(shader->program,
-		                   ShaderInterface_uniform(shader->interface, "FVarDataBuffer")->location,
-		                   31);  /* GL_TEXTURE31 */
+	if (use_opensubdiv) {
+		if (GLEW_VERSION_4_1) {
+			glProgramUniform1i(shader->program,
+			                   ShaderInterface_uniform(shader->interface, "FVarDataOffsetBuffer")->location,
+			                   30);  /* GL_TEXTURE30 */
+
+			glProgramUniform1i(shader->program,
+			                   ShaderInterface_uniform(shader->interface, "FVarDataBuffer")->location,
+			                   31);  /* GL_TEXTURE31 */
+		}
+		else {
+			glUseProgram(shader->program);
+			glUniform1i(ShaderInterface_uniform(shader->interface, "FVarDataOffsetBuffer")->location, 30);
+			glUniform1i(ShaderInterface_uniform(shader->interface, "FVarDataBuffer")->location, 31);
+			glUseProgram(0);
+		}
 	}
 #endif




More information about the Bf-blender-cvs mailing list