[Bf-blender-cvs] [708779e] master: OpenGL: bump gpu_extensions to GL 2.1, prepare for 3.x

Mike Erwin noreply at git.blender.org
Mon Nov 23 05:43:49 CET 2015


Commit: 708779e60b6780091f83ae35f4ae84f43f0e90be
Author: Mike Erwin
Date:   Sun Nov 22 13:22:47 2015 -0500
Branches: master
https://developer.blender.org/rB708779e60b6780091f83ae35f4ae84f43f0e90be

OpenGL: bump gpu_extensions to GL 2.1, prepare for 3.x

Several changes. Tested working on Windows 10 GL 4.3 and MacOS 10.11 GL
2.1.

- document extensions used in this file
- some simple ARB/EXT suffix deletion
- stop checking for pre-2.1 features — they’re available!
- convert old ARB shader API to the one adopted in GL 2.0
- remove checks for old (pre-R600) ATI cards
- choose GLSL version at runtime, between 1.2 and 1.5
- prefer GLSL 1.5 for geometry shaders, fall back to
EXT_geometry_shader4 if needed

Differential Revision: https://developer.blender.org/D1632

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

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
old mode 100644
new mode 100755
index 1edbc90..c0ada3c
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -67,14 +67,16 @@
 
 /* Extensions support */
 
-/* extensions used:
- * - texture border clamp: 1.3 core
- * - fragment shader: 2.0 core
- * - framebuffer object: ext specification
- * - multitexture 1.3 core
- * - arb non power of two: 2.0 core
- * - pixel buffer objects? 2.1 core
- * - arb draw buffers? 2.0 core
+/* -- extension: version of GL that absorbs it
+ * ARB_fragment_program: 2.0
+ * ARB_framebuffer object: 3.0
+ * EXT_framebuffer_multisample: 3.0
+ * EXT_framebuffer_blit: 3.0
+ * EXT_framebuffer_multisample_blit_scaled: ???
+ * ARB_draw_instanced: 3.1
+ * ARB_texture_multisample: 3.2
+ * EXT_geometry_shader4: 3.2
+ * ARB_texture_query_lod: 4.0
  */
 
 /* Non-generated shaders */
@@ -164,24 +166,21 @@ void gpu_extensions_init(void)
 	GLint r, g, b;
 	const char *vendor, *renderer, *version;
 
-	/* glewIsSupported("GL_VERSION_2_0") */
+	/* BLI_assert(GLEW_VERSION_2_1); */
+	/* ^-- maybe a bit extreme? */
 
-	if (GLEW_ARB_multitexture)
-		glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &GG.maxtextures);
+	glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &GG.maxtextures);
 
 	glGetIntegerv(GL_MAX_TEXTURE_SIZE, &GG.maxtexsize);
 
 	GG.glslsupport = 1;
-	if (!GLEW_ARB_multitexture) GG.glslsupport = 0;
-	if (!GLEW_ARB_vertex_shader) GG.glslsupport = 0;
-	if (!GLEW_ARB_fragment_shader) GG.glslsupport = 0;
 
 	glGetIntegerv(GL_RED_BITS, &r);
 	glGetIntegerv(GL_GREEN_BITS, &g);
 	glGetIntegerv(GL_BLUE_BITS, &b);
 	GG.colordepth = r + g + b; /* assumes same depth for RGB */
 
-	if (GLEW_ARB_texture_multisample) {
+	if (GLEW_VERSION_3_2 || GLEW_ARB_texture_multisample) {
 		glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES , &GG.samples_color_texture_max);
 	}
 
@@ -229,28 +228,6 @@ void gpu_extensions_init(void)
 		GG.driver = GPU_DRIVER_ANY;
 	}
 
-	if (GG.device == GPU_DEVICE_ATI) {
-		/* ATI 9500 to X2300 cards support NPoT textures poorly
-		 * Incomplete list http://dri.freedesktop.org/wiki/ATIRadeon
-		 * New IDs from MESA's src/gallium/drivers/r300/r300_screen.c
-		 */
-		/* This list is close enough to those using the legacy driver which
-		 * has a bug with display lists and glVertexAttrib 
-		 */
-		if (strstr(renderer, "R3") || strstr(renderer, "RV3") ||
-		    strstr(renderer, "R4") || strstr(renderer, "RV4") ||
-		    strstr(renderer, "RS4") || strstr(renderer, "RC4") ||
-		    strstr(renderer, "R5") || strstr(renderer, "RV5") ||
-		    strstr(renderer, "RS600") || strstr(renderer, "RS690") ||
-		    strstr(renderer, "RS740") || strstr(renderer, "X1") ||
-		    strstr(renderer, "X2") || strstr(renderer, "Radeon 9") ||
-		    strstr(renderer, "RADEON 9"))
-		{
-			GG.npotdisabled = 1;
-			GG.dlistsdisabled = 1;
-		}
-	}
-
 	/* make sure double side isn't used by default and only getting enabled in places where it's
 	 * really needed to prevent different unexpected behaviors like with intel gme965 card (sergey) */
 	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
@@ -297,20 +274,18 @@ void gpu_extensions_exit(void)
 
 bool GPU_glsl_support(void)
 {
-	return !GG.extdisabled && GG.glslsupport;
+	return GG.glslsupport;
 }
 
 bool GPU_non_power_of_two_support(void)
 {
-	if (GG.npotdisabled)
-		return false;
-
-	return GLEW_ARB_texture_non_power_of_two;
+	/* still relevant for OpenGL ES */
+	return !GG.npotdisabled;
 }
 
 bool GPU_vertex_buffer_support(void)
 {
-	return GLEW_ARB_vertex_buffer_object || GLEW_VERSION_1_5;
+	return true;
 }
 
 bool GPU_display_list_support(void)
@@ -320,17 +295,26 @@ bool GPU_display_list_support(void)
 
 bool GPU_bicubic_bump_support(void)
 {
-	return GLEW_ARB_texture_query_lod && GLEW_VERSION_3_0;
+	return GLEW_VERSION_4_0 || (GLEW_ARB_texture_query_lod && GLEW_VERSION_3_0);
 }
 
+
 bool GPU_geometry_shader_support(void)
 {
-	return GLEW_EXT_geometry_shader4 || GLEW_VERSION_3_2;
+	return GLEW_VERSION_3_2 || GLEW_EXT_geometry_shader4;
+}
+
+static bool GPU_geometry_shader_support_via_extension(void)
+{
+	/* in GL 3.2 geometry shaders are fully supported
+	 * GL < 3.2 can use EXT_geometry_shader4 if available
+	 */
+	return !GLEW_VERSION_3_2 && GLEW_EXT_geometry_shader4;
 }
 
 bool GPU_instanced_drawing_support(void)
 {
-	return GLEW_ARB_draw_instanced;
+	return GLEW_VERSION_3_1 || GLEW_ARB_draw_instanced;
 }
 
 int GPU_color_depth(void)
@@ -435,9 +419,6 @@ static GPUTexture *GPU_texture_create_nD(
 	GLenum type, format, internalformat;
 	void *pixels = NULL;
 
-	if (depth && !GLEW_ARB_depth_texture)
-		return NULL;
-
 	if (samples) {
 		CLAMP_MAX(samples, GG.samples_color_texture_max);
 	}
@@ -560,9 +541,9 @@ static GPUTexture *GPU_texture_create_nD(
 	if (depth) {
 		glTexParameteri(tex->target_base, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 		glTexParameteri(tex->target_base, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-		glTexParameteri(tex->target_base, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);
-		glTexParameteri(tex->target_base, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
-		glTexParameteri(tex->target_base, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);
+		glTexParameteri(tex->target_base, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
+		glTexParameteri(tex->target_base, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
+		glTexParameteri(tex->target_base, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
 	}
 	else {
 		glTexParameteri(tex->target_base, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -971,15 +952,15 @@ void GPU_texture_bind(GPUTexture *tex, int number)
 
 	GPU_ASSERT_NO_GL_ERRORS("Pre Texture Bind");
 
-	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + number);
-	if (number != 0) glActiveTextureARB(arbnumber);
+	arbnumber = (GLenum)((GLuint)GL_TEXTURE0 + number);
+	if (number != 0) glActiveTexture(arbnumber);
 	if (tex->bindcode != 0) {
 		glBindTexture(tex->target, tex->bindcode);
 	}
 	else
 		GPU_invalid_tex_bind(tex->target);
 	glEnable(tex->target);
-	if (number != 0) glActiveTextureARB(GL_TEXTURE0_ARB);
+	if (number != 0) glActiveTexture(GL_TEXTURE0);
 
 	tex->number = number;
 
@@ -1000,11 +981,11 @@ void GPU_texture_unbind(GPUTexture *tex)
 	
 	GPU_ASSERT_NO_GL_ERRORS("Pre Texture Unbind");
 
-	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);
-	if (tex->number != 0) glActiveTextureARB(arbnumber);
+	arbnumber = (GLenum)((GLuint)GL_TEXTURE0 + tex->number);
+	if (tex->number != 0) glActiveTexture(arbnumber);
 	glBindTexture(tex->target, 0);
 	glDisable(tex->target_base);
-	if (tex->number != 0) glActiveTextureARB(GL_TEXTURE0_ARB);
+	if (tex->number != 0) glActiveTexture(GL_TEXTURE0);
 
 	tex->number = -1;
 
@@ -1025,8 +1006,8 @@ void GPU_texture_filter_mode(GPUTexture *tex, bool compare, bool use_filter)
 
 	GPU_ASSERT_NO_GL_ERRORS("Pre Texture Unbind");
 
-	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);
-	if (tex->number != 0) glActiveTextureARB(arbnumber);
+	arbnumber = (GLenum)((GLuint)GL_TEXTURE0 + tex->number);
+	if (tex->number != 0) glActiveTexture(arbnumber);
 
 	if (tex->depth) {
 		if (compare)
@@ -1043,7 +1024,7 @@ void GPU_texture_filter_mode(GPUTexture *tex, bool compare, bool use_filter)
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 	}
-	if (tex->number != 0) glActiveTextureARB(GL_TEXTURE0_ARB);
+	if (tex->number != 0) glActiveTexture(GL_TEXTURE0);
 
 	GPU_ASSERT_NO_GL_ERRORS("Post Texture Unbind");
 }
@@ -1232,7 +1213,7 @@ void GPU_texture_bind_as_framebuffer(GPUTexture *tex)
 	}
 	
 	if (tex->target == GL_TEXTURE_2D_MULTISAMPLE) {
-		glEnable(GL_MULTISAMPLE_ARB);
+		glEnable(GL_MULTISAMPLE);
 	}
 
 	/* push matrices and set default viewport and matrix */
@@ -1628,13 +1609,14 @@ int GPU_offscreen_color_texture(const GPUOffScreen *ofs)
 /* GPUShader */
 
 struct GPUShader {
-	GLhandleARB object;   /* handle for full shader */
-	GLhandleARB vertex;   /* handle for vertex shader */
-	GLhandleARB fragment; /* handle for fragment shader */
-	GLhandleARB geometry; /* handle for geometry shader */
-	GLhandleARB lib;      /* handle for libment shader */
-	int totattrib;        /* total number of attributes */
-	int uniforms;         /* required uniforms */
+	GLuint program;  /* handle for full program (links shader stages below) */
+
+	GLuint vertex;   /* handle for vertex shader */
+	GLuint geometry; /* handle for geometry shader */
+	GLuint fragment; /* handle for fragment shader */
+
+	int totattrib;   /* total number of attributes */
+	int uniforms;    /* required uniforms */
 };
 
 struct GPUProgram {
@@ -1653,7 +1635,7 @@ static void shader_print_errors(const char *task, const char *log, const char **
 	for (i = 0; i < totcode; i++) {
 		const char *c, *pos, *end = code[i] + strlen(code[i]);
 
-		if ((G.debug & G_DEBUG)) {
+		if (G.debug & G_DEBUG) {
 			fprintf(stderr, "===== shader string %d ====\n", i + 1);
 
 			c = code[i];
@@ -1671,61 +1653,72 @@ static void shader_print_errors(const char *task, const char *log, const char **
 	fprintf(stderr, "%s\n", log);
 }
 
-static const char *gpu_shader_version(bool use_opensubdiv)
+static const char *gpu_shader_version()
 {
-#ifdef WITH_OPENSUBDIV
-	if (use_opensubdiv) {
-		return "#version 130\n";
+	if (GLEW_VERSION_3_2) {
+		return "#version 150 compatibility\n";
+		/* highest version that is widely supported
+		 * gives us native geometry shaders!
+		 * use compatibility profile so we can continue using builtin shader input/output names
+		 */
 	}
-#else
-	UNUSED_VARS(use_opensubdiv);
-#endif
-
-	/* turn on glsl 1.30 for bicubic bump mapping and ATI clipping support */
-	if (GLEW_VERSION_3_0 &&
-	    (GPU_bicubic_bump_support() || GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_ANY, GPU_DRIVER_ANY)))
-	{
+	else if (GLEW_VERSION_3_1) {
+		return "#version 140\n";
+		/* also need the ARB_compatibility extension, handled below */
+	}
+	else if (GLEW_VERSION_3_0) {
 		return "#version 130\n";
+		/* GLSL 1.3 has modern syntax/keywords/datatypes so use if available
+		 * older features are deprecated but still available without compatibility extension or profile
+		 */
+	}
+	else {
+		return "#version 120\n";
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list