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
This commit is contained in:
Zachary Lund
2014-01-05 21:05:17 -06:00
parent 4aef1d00d1
commit 840c1cfd65
5 changed files with 50 additions and 99 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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:

View File

@@ -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;
}
}