From 62a37d8e538abc6d0c67bd69b4eb2a724668cce0 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Wed, 11 Nov 2009 16:42:53 +0000 Subject: [PATCH] Use the GL_ARB_multitexture extension on GL 1.2 Cogl requires multi-texturing support. This is only available as an extension in GL 1.2 so we should check for it before accepting the driver. http://bugzilla.openedhand.com/show_bug.cgi?id=1875 --- clutter/cogl/cogl/driver/gl/cogl.c | 46 +++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/clutter/cogl/cogl/driver/gl/cogl.c b/clutter/cogl/cogl/driver/gl/cogl.c index 9403b94e3..bd6073f36 100644 --- a/clutter/cogl/cogl/driver/gl/cogl.c +++ b/clutter/cogl/cogl/driver/gl/cogl.c @@ -153,6 +153,7 @@ gboolean _cogl_check_driver_valid (GError **error) { int major, minor; + const gchar *gl_extensions; if (!_cogl_get_gl_version (&major, &minor)) { @@ -163,6 +164,24 @@ _cogl_check_driver_valid (GError **error) return FALSE; } + /* GL 1.3 supports all of the required functionality in core */ + if (COGL_CHECK_GL_VERSION (major, minor, 1, 3)) + return TRUE; + + gl_extensions = (const gchar*) glGetString (GL_EXTENSIONS); + + /* OpenGL 1.2 is only supported if we have the multitexturing + extension */ + if (!cogl_check_extension ("GL_ARB_multitexture", gl_extensions)) + { + g_set_error (error, + COGL_DRIVER_ERROR, + COGL_DRIVER_ERROR_INVALID_VERSION, + "The OpenGL driver is missing " + "the GL_ARB_multitexture extension"); + return FALSE; + } + /* OpenGL 1.2 is required */ if (!COGL_CHECK_GL_VERSION (major, minor, 1, 2)) { @@ -484,13 +503,6 @@ _cogl_features_init (void) ctx->drv.pf_glDrawRangeElements = (COGL_PFNGLDRAWRANGEELEMENTSPROC) cogl_get_proc_address ("glDrawRangeElements"); - ctx->drv.pf_glActiveTexture = - (COGL_PFNGLACTIVETEXTUREPROC) - cogl_get_proc_address ("glActiveTexture"); - ctx->drv.pf_glClientActiveTexture = - (COGL_PFNGLCLIENTACTIVETEXTUREPROC) - cogl_get_proc_address ("glClientActiveTexture"); - ctx->drv.pf_glBlendEquation = (COGL_PFNGLBLENDEQUATIONPROC) cogl_get_proc_address ("glBlendEquation"); @@ -498,6 +510,26 @@ _cogl_features_init (void) (COGL_PFNGLBLENDCOLORPROC) cogl_get_proc_address ("glBlendColor"); + /* Available in 1.3 or in the GL_ARB_multitexture extension */ + if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 1, 3)) + { + ctx->drv.pf_glActiveTexture = + (COGL_PFNGLACTIVETEXTUREPROC) + cogl_get_proc_address ("glActiveTexture"); + ctx->drv.pf_glClientActiveTexture = + (COGL_PFNGLCLIENTACTIVETEXTUREPROC) + cogl_get_proc_address ("glClientActiveTexture"); + } + else if (cogl_check_extension ("GL_ARB_multitexture", gl_extensions)) + { + ctx->drv.pf_glActiveTexture = + (COGL_PFNGLACTIVETEXTUREPROC) + cogl_get_proc_address ("glActiveTextureARB"); + ctx->drv.pf_glClientActiveTexture = + (COGL_PFNGLCLIENTACTIVETEXTUREPROC) + cogl_get_proc_address ("glClientActiveTextureARB"); + } + /* Available in 1.4 */ if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 1, 4)) ctx->drv.pf_glBlendFuncSeparate =