[Bf-blender-cvs] [2e8a840] master: OpenGL: GPU_legacy_support workaround for nVidia

Mike Erwin noreply at git.blender.org
Mon Jan 4 07:28:28 CET 2016


Commit: 2e8a8403079ead2e9fd6a9cb1fc3f5cbf405a2bd
Author: Mike Erwin
Date:   Mon Jan 4 01:03:47 2016 -0500
Branches: master
https://developer.blender.org/rB2e8a8403079ead2e9fd6a9cb1fc3f5cbf405a2bd

OpenGL: GPU_legacy_support workaround for nVidia

nVidia Linux driver reports GL_CONTEXT_PROFILE_MASK = 0, which is a bug.
In that case check for the ARB_compatibility extension.

Non-buggy drivers will continue to use
GL_CONTEXT_COMPATIBILITY_PROFILE_BIT.

Thx to Dr Hackerman for reporting.

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

M	source/blender/gpu/intern/gpu_extensions.c

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

diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index ab0e49e..b0ecf35 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -230,23 +230,39 @@ void gpu_extensions_exit(void)
 
 bool GPU_legacy_support(void)
 {
-	// return whether or not current GL context is compatible with legacy OpenGL
+	/* return whether or not current GL context is compatible with legacy OpenGL */
+	static bool checked = false;
+	static bool support = true;
 
-	if (GLEW_VERSION_3_2) {
-		static GLint profile = 0;
-
-		if (profile == 0) {
+	if (!checked) {
+		if (GLEW_VERSION_3_2) {
+			GLint profile;
 			glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
+
+			if (G.debug & G_DEBUG_GPU) {
+				printf("GL_CONTEXT_PROFILE_MASK = %#x (%s profile)\n", profile,
+				       profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT ? "compatibility" :
+				       profile & GL_CONTEXT_CORE_PROFILE_BIT ? "core" : "unknown");
+			}
+
+			if (profile == 0) {
+				/* workaround for nVidia's Linux driver */
+				support = GLEW_ARB_compatibility;
+			}
+			else {
+				support = profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
+			}
+		}
+		else if (GLEW_VERSION_3_1) {
+			support = GLEW_ARB_compatibility;
 		}
 
-		return profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
-	}
-	else if (GLEW_VERSION_3_1) {
-		return GLEW_ARB_compatibility;
-	}
-	else {
-		return true;
+		/* any OpenGL version <= 3.0 is legacy, so support remains true */
+
+		checked = true;
 	}
+
+	return support;
 }
 
 bool GPU_glsl_support(void)




More information about the Bf-blender-cvs mailing list