浏览代码

I removed GL-specific extension checking to a platform independent file.
I also fixed autoconf to find wxWidgets 2.9 without user intervention
Removed unused code and added more organization

Zachary Lund 11 年之前
父节点
当前提交
840c1cfd65
共有 5 个文件被更改,包括 50 次插入99 次删除
  1. 1 1
      configure.ac
  2. 0 26
      libobs-opengl/gl-cocoa.m
  3. 45 13
      libobs-opengl/gl-subsystem.c
  4. 3 48
      libobs-opengl/gl-windows.c
  5. 1 11
      libobs-opengl/gl-x11.c

+ 1 - 1
configure.ac

@@ -91,7 +91,7 @@ WX_CONFIG_CHECK(
 		is in LD_LIBRARY_PATH or equivalent variable and
 		wxWidgets version is $wxVersion or above.
 		]) ],
-	[core], )
+	[core], [--version=2.9])
 
 CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS"
 CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY"

+ 0 - 26
libobs-opengl/gl-cocoa.m

@@ -97,11 +97,6 @@ static NSOpenGLContext *gl_context_create(struct gs_init_data *info)
 	return context;
 }
 
-static inline void required_extension_error(const char *extension)
-{
-	blog(LOG_ERROR, "OpenGL extension %s is required", extension);
-}
-
 static bool gl_init_extensions(device_t device)
 {
 	glewExperimental=true;
@@ -112,27 +107,6 @@ static bool gl_init_extensions(device_t device)
 	       return false;
 	}
 
-	if(!GLEW_VERSION_2_1) {
-	       blog(LOG_ERROR, "OpenGL 2.1 minimum required by the graphics "
-	                       "adapter");
-	       return false;
-	}
-
-	if(!GLEW_ARB_framebuffer_object) {
-		required_extension_error("GL_ARB_framebuffer_object");
-		return false;
-	}
-
-	if(!GLEW_ARB_separate_shader_objects) {
-		required_extension_error("GL_ARB_separate_shader_objects");
-		return false;
-	}
-
-	//something inside glew produces error code 1280 (invalid enum)
-	glGetError();
-
-	device->copy_type = COPY_TYPE_FBO_BLIT;
-
 	return true;
 }
 

+ 45 - 13
libobs-opengl/gl-subsystem.c

@@ -50,12 +50,12 @@ static const char* debug_severity_table[] = {
 #define GL_DEBUG_TYPE_OFFSET(x) (x - GL_DEBUG_TYPE_ERROR_ARB)
 #define GL_DEBUG_SEVERITY_OFFSET(x) (x - GL_DEBUG_SEVERITY_HIGH_ARB)
 
-static void gl_debug_proc(
+static APIENTRY void gl_debug_proc(
 	GLenum source, GLenum type, GLuint id, GLenum severity, 
 	GLsizei length, const GLchar *message, GLvoid *data )
 {
 	blog(	LOG_DEBUG,
-		"[%s][%s]{%}: %.*s",
+		"[%s][%s]{%s}: %.*s",
 		debug_source_table[GL_DEBUG_SOURCE_OFFSET(source)],
 		debug_type_table[GL_DEBUG_TYPE_OFFSET(type)],
 		debug_severity_table[GL_DEBUG_SEVERITY_OFFSET(severity)],
@@ -76,16 +76,49 @@ static void gl_enable_debug()
 		return;
 	}
 
-	glEnable(GL_DEBUG_OUTPUT);
-	if (glGetError() == GL_INVALID_ENUM)
-		blog(LOG_DEBUG, "OpenGL debug information not available"); /* Debug callback simply won't be called. */
-	else
-		blog(LOG_DEBUG, "Successfully hooked into OpenGL debug message callback.");
+	gl_enable(GL_DEBUG_OUTPUT);
 }
 #else
 static void gl_enable_debug() {}
 #endif
 
+static inline void required_extension_error(const char *extension)
+{
+}
+
+static bool gl_init_extensions(struct gs_device* device) 
+{
+	if (!GLEW_VERSION_2_1) {
+		blog(LOG_ERROR, "obs-studio requires OpenGL version 2.1 or higher.");
+		return false;
+	}
+
+	gl_enable_debug();
+
+	if (!GLEW_VERSION_3_0 && !GLEW_ARB_framebuffer_object) {
+		blog(LOG_ERROR, "OpenGL extension ARB_framebuffer_object is required.");
+		return false;
+	}
+
+	if (GLEW_VERSION_3_1 || GLEW_ARB_seamless_cube_map) {
+		gl_enable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+	}
+
+	if (!GLEW_VERSION_4_1 && !GLEW_ARB_separate_shader_objects) {
+		blog(LOG_ERROR, "OpenGL extension ARB_separate_shader_objects is required.");
+		return false;
+	}
+
+	if (GLEW_ARB_copy_image || GLEW_VERSION_4_2)
+		device->copy_type = COPY_TYPE_ARB;
+	else if (GLEW_NV_copy_image)
+		device->copy_type = COPY_TYPE_NV;
+	else
+		device->copy_type = COPY_TYPE_FBO_BLIT; /* ?? */
+
+	return true;
+}
+
 static void clear_textures(struct gs_device *device)
 {
 	GLenum i;
@@ -137,8 +170,10 @@ device_t device_create(struct gs_init_data *info)
 	if (!device->plat)
 		goto fail;
 
-	/* We expect platform specific code to initialize GLEW as they might use it themselves anyways. */
-	/* Also, that code needs to set glewExperimental to true (since it fails to set core functionality like a dum dum) */
+	if (!gl_init_extensions(device))
+		goto fail;
+	
+	gl_enable(GL_CULL_FACE);
 	
 	glGenProgramPipelines(1, &device->pipeline);
 	if (!gl_success("glGenProgramPipelines"))
@@ -148,9 +183,6 @@ device_t device_create(struct gs_init_data *info)
 	if (!gl_success("glBindProgramPipeline"))
 		goto fail;
 
-	gl_enable_debug();
-	gl_enable(GL_CULL_FACE);
-
 	device_leavecontext(device);
 	device->cur_swap = gl_platform_getswap(device->plat);
 
@@ -1111,7 +1143,7 @@ void device_frustum(device_t device, float left, float right,
 
 	dst->x.x =            nearx2 / rml;
 	dst->z.x =      (left+right) / rml;
-                       
+					   
 	dst->y.y =            nearx2 / tmb;
 	dst->z.y =      (bottom+top) / tmb;
 

+ 3 - 48
libobs-opengl/gl-windows.c

@@ -155,10 +155,9 @@ static inline HGLRC gl_init_basic_context(HDC hdc)
 
 static const int attribs[] = 
 {
-	WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
-	WGL_CONTEXT_MINOR_VERSION_ARB, 2,
-	WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB |
-	                       WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
+#ifdef _DEBUG
+    WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB,
+#endif
 	WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
 	0, 0
 };
@@ -244,29 +243,11 @@ static bool gl_init_extensions(device_t device)
 		return false;
 	}
 
-	if (!GLEW_VERSION_2_1) {
-		blog(LOG_ERROR, "OpenGL 2.1 minimum required by the graphics "
-		                "adapter");
-		return false;
-	}
-
-	if (!GLEW_ARB_framebuffer_object) {
-		required_extension_error("GL_ARB_framebuffer_object");
-		return false;
-	}
-
 	if (!WGLEW_ARB_pixel_format) {
 		required_extension_error("WGL_ARB_pixel_format");
 		return false;
 	}
 
-	if (GLEW_ARB_copy_image)
-		device->copy_type = COPY_TYPE_ARB;
-	else if (GLEW_NV_copy_image)
-		device->copy_type = COPY_TYPE_NV;
-	else
-		device->copy_type = COPY_TYPE_FBO_BLIT;
-
 	return true;
 }
 
@@ -377,19 +358,6 @@ static bool init_default_swap(struct gl_platform *plat, device_t device,
 	return true;
 }
 
-#ifdef _DEBUG
-static void APIENTRY gl_debug_message_amd(GLuint id,
-                                          GLenum category,
-                                          GLenum severity,
-                                          GLsizei length,
-                                          const GLchar *msg,
-                                          void *param)
-{
-	OutputDebugStringA(msg);
-	OutputDebugStringA("\n");
-}
-#endif
-
 void gl_update(device_t device)
 {
 	/* does nothing on windows */
@@ -425,19 +393,6 @@ struct gl_platform *gl_platform_create(device_t device,
 	if (!plat->hrc)
 		goto fail;
 
-	if (GLEW_ARB_seamless_cube_map) {
-		glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
-		gl_success("GL_TEXTURE_CUBE_MAP_SEAMLESS");
-	}
-
-#ifdef _DEBUG
-	if (GLEW_AMD_debug_output) {
-		glDebugMessageEnableAMD(0, 0, 0, NULL, true);
-		glDebugMessageCallbackAMD(gl_debug_message_amd, device);
-		gl_success("glDebugMessageCallback");
-	}
-#endif
-
 	return plat;
 
 fail:

+ 1 - 11
libobs-opengl/gl-x11.c

@@ -105,24 +105,14 @@ static void print_info_stuff(struct gs_init_data *info)
 struct gl_platform *gl_platform_create(device_t device,
 		struct gs_init_data *info)
 {	
-	/* X11 */
 	int num_configs = 0;
 	int error_base = 0, event_base = 0;
 	Display *display = XOpenDisplay(NULL); /* Open default screen */
-	
-	/* OBS */
 	struct gl_platform *plat = bmalloc(sizeof(struct gl_platform));
-	
-	/* GLX */
 	GLXFBConfig* configs;
 	
 	print_info_stuff(info);
 	
-	if (!plat) { 
-		blog(LOG_ERROR, "Out of memory");
-		return NULL;
-	}
-	
 	memset(plat, 0, sizeof(struct gl_platform));
 	
 	if (!display) {
@@ -144,7 +134,7 @@ struct gl_platform *gl_platform_create(device_t device,
 		
 		glXQueryVersion(display, &major, &minor);
 		if (major < 1 || minor < 4) {
-			blog(LOG_ERROR, "GLX version isn't high enough.");
+			blog(LOG_ERROR, "GLX version found: %i.%i\nRequired: 1.4", major, minor);
 			goto fail0;
 		}
 	}