summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2011-07-13 18:29:56 +0100
committerNeil Roberts <neil@linux.intel.com>2011-07-18 15:41:35 +0100
commit231be91fb0abc2202d2209554bdb0a5fed58dd3f (patch)
treebd8daf5e966c78a5c9ec2f4438d99c5cbd726eae
parent2fc069888fa75aa77368136a68ccf734d213dcf2 (diff)
downloadcogl-231be91fb0abc2202d2209554bdb0a5fed58dd3f.tar.gz
Combine _cogl_context_check_gl_version and update_features into one
The _cogl_context_check_gl_version function is meant to be called once Cogl has a GL context so that it can check whether the context found is supported by Cogl. However, only the stub winsys was calling this and it was doing it before Cogl had a chance to retrieve the function pointer for glString so it would just crash. This patch combines the two functions into one so that _cogl_context_update_features returns a gboolean and a GError. Then it can just check the context itself. https://bugzilla.gnome.org/show_bug.cgi?id=654440 Reviewed-by: Robert Bragg <robert@linux.intel.com>
-rw-r--r--cogl/cogl-context-private.h14
-rw-r--r--cogl/cogl-context.c27
-rw-r--r--cogl/cogl-private.h14
-rw-r--r--cogl/driver/gl/cogl-gl.c22
-rw-r--r--cogl/driver/gles/cogl-gles.c16
-rw-r--r--cogl/winsys/cogl-winsys-egl.c15
-rw-r--r--cogl/winsys/cogl-winsys-glx.c15
-rw-r--r--cogl/winsys/cogl-winsys-stub.c4
-rw-r--r--cogl/winsys/cogl-winsys-wgl.c15
9 files changed, 55 insertions, 87 deletions
diff --git a/cogl/cogl-context-private.h b/cogl/cogl-context-private.h
index 4ce999b3..177b5c37 100644
--- a/cogl/cogl-context-private.h
+++ b/cogl/cogl-context-private.h
@@ -288,17 +288,15 @@ _cogl_context_get_default ();
const CoglWinsysVtable *
_cogl_context_get_winsys (CoglContext *context);
-/* Check whether the current GL context is supported by Cogl */
-gboolean
-_cogl_context_check_gl_version (CoglContext *context,
- GError **error);
-
/* Query the GL extensions and lookup the corresponding function
* pointers. Theoretically the list of extensions can change for
* different GL contexts so it is the winsys backend's responsiblity
- * to know when to re-query the GL extensions. */
-void
-_cogl_context_update_features (CoglContext *context);
+ * to know when to re-query the GL extensions. The backend should also
+ * check whether the GL context is supported by Cogl. If not it should
+ * return FALSE and set @error */
+gboolean
+_cogl_context_update_features (CoglContext *context,
+ GError **error);
/* Obtains the context and returns retval if NULL */
#define _COGL_GET_CONTEXT(ctxvar, retval) \
diff --git a/cogl/cogl-context.c b/cogl/cogl-context.c
index 2674b235..83936e03 100644
--- a/cogl/cogl-context.c
+++ b/cogl/cogl-context.c
@@ -509,35 +509,16 @@ cogl_egl_context_get_egl_display (CoglContext *context)
#endif
gboolean
-_cogl_context_check_gl_version (CoglContext *context,
- GError **error)
+_cogl_context_update_features (CoglContext *context,
+ GError **error)
{
#ifdef HAVE_COGL_GL
if (context->driver == COGL_DRIVER_GL)
- return _cogl_gl_check_gl_version (context, error);
+ return _cogl_gl_update_features (context, error);
#endif
#if defined(HAVE_COGL_GLES) || defined(HAVE_COGL_GLES2)
- return _cogl_gles_check_gl_version (context, error);
-#endif
-
- g_assert_not_reached ();
-}
-
-void
-_cogl_context_update_features (CoglContext *context)
-{
-#ifdef HAVE_COGL_GL
- if (context->driver == COGL_DRIVER_GL)
- {
- _cogl_gl_update_features (context);
- return;
- }
-#endif
-
-#if defined(HAVE_COGL_GLES) || defined(HAVE_COGL_GLES2)
- _cogl_gles_update_features (context);
- return;
+ return _cogl_gles_update_features (context, error);
#endif
g_assert_not_reached ();
diff --git a/cogl/cogl-private.h b/cogl/cogl-private.h
index 465b267c..eaa1d52f 100644
--- a/cogl/cogl-private.h
+++ b/cogl/cogl-private.h
@@ -27,18 +27,12 @@
G_BEGIN_DECLS
gboolean
-_cogl_gl_check_gl_version (CoglContext *context,
- GError **error);
-
-void
-_cogl_gl_update_features (CoglContext *context);
+_cogl_gl_update_features (CoglContext *context,
+ GError **error);
gboolean
-_cogl_gles_check_gl_version (CoglContext *context,
- GError **error);
-
-void
-_cogl_gles_update_features (CoglContext *context);
+_cogl_gles_update_features (CoglContext *context,
+ GError **error);
gboolean
_cogl_check_extension (const char *name, const char *ext);
diff --git a/cogl/driver/gl/cogl-gl.c b/cogl/driver/gl/cogl-gl.c
index 389908fc..3ed4b04b 100644
--- a/cogl/driver/gl/cogl-gl.c
+++ b/cogl/driver/gl/cogl-gl.c
@@ -71,9 +71,9 @@ _cogl_get_gl_version (int *major_out, int *minor_out)
return TRUE;
}
-gboolean
-_cogl_gl_check_gl_version (CoglContext *ctx,
- GError **error)
+static gboolean
+check_gl_version (CoglContext *ctx,
+ GError **error)
{
int major, minor;
const char *gl_extensions;
@@ -120,12 +120,9 @@ _cogl_gl_check_gl_version (CoglContext *ctx,
return TRUE;
}
-/* Query the GL extensions and lookup the corresponding function
- * pointers. Theoretically the list of extensions can change for
- * different GL contexts so it is the winsys backend's responsiblity
- * to know when to re-query the GL extensions. */
-void
-_cogl_gl_update_features (CoglContext *context)
+gboolean
+_cogl_gl_update_features (CoglContext *context,
+ GError **error)
{
CoglPrivateFeatureFlags private_flags = 0;
CoglFeatureFlags flags = 0;
@@ -134,7 +131,7 @@ _cogl_gl_update_features (CoglContext *context)
int num_stencil_bits = 0;
int gl_major = 0, gl_minor = 0;
- _COGL_GET_CONTEXT (ctx, NO_RETVAL);
+ _COGL_GET_CONTEXT (ctx, FALSE);
/* We have to special case getting the pointer to the glGetString
function because we need to use it to determine what functions we
@@ -143,6 +140,9 @@ _cogl_gl_update_features (CoglContext *context)
(void *) _cogl_get_proc_address (_cogl_context_get_winsys (context),
"glGetString");
+ if (!check_gl_version (context, error))
+ return FALSE;
+
COGL_NOTE (WINSYS,
"Checking features\n"
" GL_VENDOR: %s\n"
@@ -231,4 +231,6 @@ _cogl_gl_update_features (CoglContext *context)
/* Cache features */
context->private_feature_flags |= private_flags;
context->feature_flags |= flags;
+
+ return TRUE;
}
diff --git a/cogl/driver/gles/cogl-gles.c b/cogl/driver/gles/cogl-gles.c
index 7035c691..4ca18695 100644
--- a/cogl/driver/gles/cogl-gles.c
+++ b/cogl/driver/gles/cogl-gles.c
@@ -33,18 +33,8 @@
#include "cogl-feature-private.h"
gboolean
-_cogl_gles_check_gl_version (GError **error)
-{
- /* The GLES backend doesn't have any particular version requirements */
- return TRUE;
-}
-
-/* Query the GL extensions and lookup the corresponding function
- * pointers. Theoretically the list of extensions can change for
- * different GL contexts so it is the winsys backend's responsiblity
- * to know when to re-query the GL extensions. */
-void
-_cogl_gles_update_features (CoglContext *context)
+_cogl_gles_update_features (CoglContext *context,
+ GError **error)
{
CoglPrivateFeatureFlags private_flags = 0;
CoglFeatureFlags flags = 0;
@@ -135,4 +125,6 @@ _cogl_gles_update_features (CoglContext *context)
/* Cache features */
context->private_feature_flags |= private_flags;
context->feature_flags |= flags;
+
+ return TRUE;
}
diff --git a/cogl/winsys/cogl-winsys-egl.c b/cogl/winsys/cogl-winsys-egl.c
index 97179067..9664f834 100644
--- a/cogl/winsys/cogl-winsys-egl.c
+++ b/cogl/winsys/cogl-winsys-egl.c
@@ -503,19 +503,20 @@ error:
return FALSE;
}
-static void
-update_winsys_features (CoglContext *context)
+static gboolean
+update_winsys_features (CoglContext *context, GError **error)
{
CoglDisplayEGL *egl_display = context->display->winsys;
CoglRendererEGL *egl_renderer = context->display->renderer->winsys;
- g_return_if_fail (egl_display->egl_context);
+ g_return_val_if_fail (egl_display->egl_context, FALSE);
memset (context->winsys_features, 0, sizeof (context->winsys_features));
check_egl_extensions (context->display->renderer);
- _cogl_context_update_features (context);
+ if (!_cogl_context_update_features (context, error))
+ return FALSE;
#if defined (COGL_HAS_EGL_PLATFORM_POWERVR_X11_SUPPORT) || \
defined (COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT)
@@ -532,6 +533,8 @@ update_winsys_features (CoglContext *context)
COGL_FLAGS_SET (context->winsys_features,
COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE);
}
+
+ return TRUE;
}
#ifdef COGL_HAS_EGL_PLATFORM_POWERVR_X11_SUPPORT
@@ -1114,9 +1117,7 @@ _cogl_winsys_context_init (CoglContext *context, GError **error)
event_filter_cb,
context);
#endif
- update_winsys_features (context);
-
- return TRUE;
+ return update_winsys_features (context, error);
}
static void
diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c
index b4ee25e6..17ac612f 100644
--- a/cogl/winsys/cogl-winsys-glx.c
+++ b/cogl/winsys/cogl-winsys-glx.c
@@ -395,8 +395,8 @@ error:
return FALSE;
}
-static void
-update_winsys_features (CoglContext *context)
+static gboolean
+update_winsys_features (CoglContext *context, GError **error)
{
CoglGLXDisplay *glx_display = context->display->winsys;
CoglXlibRenderer *xlib_renderer = context->display->renderer->winsys;
@@ -405,9 +405,10 @@ update_winsys_features (CoglContext *context)
int default_screen;
int i;
- g_return_if_fail (glx_display->glx_context);
+ g_return_val_if_fail (glx_display->glx_context, FALSE);
- _cogl_context_update_features (context);
+ if (!_cogl_context_update_features (context, error))
+ return FALSE;
memset (context->winsys_features, 0, sizeof (context->winsys_features));
@@ -475,6 +476,8 @@ update_winsys_features (CoglContext *context)
_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT))
COGL_FLAGS_SET (context->winsys_features,
COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE);
+
+ return TRUE;
}
/* It seems the GLX spec never defined an invalid GLXFBConfig that
@@ -763,9 +766,7 @@ _cogl_winsys_context_init (CoglContext *context, GError **error)
cogl_xlib_renderer_add_filter (context->display->renderer,
glx_event_filter_cb,
context);
- update_winsys_features (context);
-
- return TRUE;
+ return update_winsys_features (context, error);
}
static void
diff --git a/cogl/winsys/cogl-winsys-stub.c b/cogl/winsys/cogl-winsys-stub.c
index f6a2b411..565814af 100644
--- a/cogl/winsys/cogl-winsys-stub.c
+++ b/cogl/winsys/cogl-winsys-stub.c
@@ -83,11 +83,9 @@ _cogl_winsys_context_init (CoglContext *context, GError **error)
{
context->winsys = &_cogl_winsys_stub_dummy_ptr;
- if (!_cogl_context_check_gl_version (context, error))
+ if (!_cogl_context_update_features (context, error))
return FALSE;
- _cogl_context_update_features (context);
-
memset (context->winsys_features, 0, sizeof (context->winsys_features));
return TRUE;
diff --git a/cogl/winsys/cogl-winsys-wgl.c b/cogl/winsys/cogl-winsys-wgl.c
index 6596f740..d07391de 100644
--- a/cogl/winsys/cogl-winsys-wgl.c
+++ b/cogl/winsys/cogl-winsys-wgl.c
@@ -542,17 +542,18 @@ get_wgl_extensions_string (HDC dc)
return NULL;
}
-static void
-update_winsys_features (CoglContext *context)
+static gboolean
+update_winsys_features (CoglContext *context, GError **error)
{
CoglDisplayWgl *wgl_display = context->display->winsys;
CoglRendererWgl *wgl_renderer = context->display->renderer->winsys;
const char *wgl_extensions;
int i;
- g_return_if_fail (wgl_display->wgl_context);
+ g_return_val_if_fail (wgl_display->wgl_context, FALSE);
- _cogl_context_update_features (context);
+ if (!_cogl_context_update_features (context, error))
+ return FALSE;
memset (context->winsys_features, 0, sizeof (context->winsys_features));
@@ -581,6 +582,8 @@ update_winsys_features (CoglContext *context)
TRUE);
}
}
+
+ return TRUE;
}
static gboolean
@@ -594,9 +597,7 @@ _cogl_winsys_context_init (CoglContext *context, GError **error)
win32_event_filter_cb,
context);
- update_winsys_features (context);
-
- return TRUE;
+ return update_winsys_features (context, error);
}
static void