[Cogl] [PATCH 1/3] Add env vars to trick Cogl to think extensions are disabled
Robert Bragg
robert at sixbynine.org
Mon Jul 9 10:26:25 PDT 2012
Yeah, there have definitely been times when I've thought something
like this would've been nice for debugging.
I'm not entirely sure we need to #ifdef this for DEBUG builds only
since it shouldn't have an on going performance impact and although it
will impact code size, we basically haven't so far put any effort into
optimizing Cogl for size and I would expect there are more significant
changes we could make to optimize Cogl's code/binary size.
Potentially it would also be nice if these were also exposed via the cogl.rc
Even without either of those changes though I think this patch is good
to land as is and we can think about those changes later.
Reviewed-by: Robert Bragg <robert at linux.intel.com>
kind regards,
- Robert
On Wed, Jul 4, 2012 at 4:15 PM, Neil Roberts <neil at linux.intel.com> wrote:
> This adds two new debug environment variables:
>
> COGL_DEBUG_DISABLE_GL_EXTENSIONS and
> COGL_DEBUG_GL_VERSION
>
> The first one is a list of GL extension names separated by commas.
> When set Cogl will assume any extension listed here is not available
> by removing it from the string returned from
> glGetString(GL_EXTENSIONS).
>
> The second overrides the value returned from glGetString(GL_VERSION).
>
> These are sometimes useful for debugging Cogl to test the various
> combinations of extensions.
> ---
> cogl/cogl-context-private.h | 6 ++++
> cogl/cogl-context.c | 80 +++++++++++++++++++++++++++++++++++++++++++
> cogl/cogl-debug.c | 16 +++++++--
> cogl/cogl-gpu-info.c | 2 +-
> cogl/driver/gl/cogl-gl.c | 10 +++---
> cogl/driver/gles/cogl-gles.c | 6 ++--
> cogl/winsys/cogl-winsys-wgl.c | 2 +-
> 7 files changed, 109 insertions(+), 13 deletions(-)
>
> diff --git a/cogl/cogl-context-private.h b/cogl/cogl-context-private.h
> index ffa5da9..0be6000 100644
> --- a/cogl/cogl-context-private.h
> +++ b/cogl/cogl-context-private.h
> @@ -340,4 +340,10 @@ void
> _cogl_context_set_current_modelview_entry (CoglContext *context,
> CoglMatrixEntry *entry);
>
> +const char *
> +_cogl_context_get_gl_extensions (CoglContext *context);
> +
> +const char *
> +_cogl_context_get_gl_version (CoglContext *context);
> +
> #endif /* __COGL_CONTEXT_PRIVATE_H */
> diff --git a/cogl/cogl-context.c b/cogl/cogl-context.c
> index 4973d64..62b4269 100644
> --- a/cogl/cogl-context.c
> +++ b/cogl/cogl-context.c
> @@ -602,3 +602,83 @@ _cogl_context_set_current_modelview_entry (CoglContext *context,
> _cogl_matrix_entry_unref (context->current_modelview_entry);
> context->current_modelview_entry = entry;
> }
> +
> +const char *
> +_cogl_context_get_gl_extensions (CoglContext *context)
> +{
> +#ifdef COGL_ENABLE_DEBUG
> + const char *disabled_extensions;
> +
> + if ((disabled_extensions = g_getenv ("COGL_DEBUG_DISABLE_GL_EXTENSIONS")))
> + {
> + static CoglUserDataKey extensions_key;
> + const char *enabled_extensions;
> + char **split_enabled_extensions;
> + char **split_disabled_extensions;
> + char **e, **d;
> + GString *result;
> +
> + /* We need to return a const string so we'll attach the results
> + * to the CoglContext to avoid leaking the generated string.
> + * This string is only used for debugging so we are using
> + * cogl_object_set_user_data instead of adding an explicit
> + * member to CoglContext to avoid making the struct bigger */
> +
> + enabled_extensions =
> + cogl_object_get_user_data (COGL_OBJECT (context), &extensions_key);
> + if (enabled_extensions)
> + return enabled_extensions;
> +
> + enabled_extensions = (const char *) context->glGetString (GL_EXTENSIONS);
> +
> + split_enabled_extensions = g_strsplit (enabled_extensions,
> + " ",
> + 0 /* no max tokens */);
> + split_disabled_extensions = g_strsplit (disabled_extensions,
> + ",",
> + 0 /* no max tokens */);
> + result = g_string_new (NULL);
> +
> + for (e = split_enabled_extensions; *e; e++)
> + {
> + for (d = split_disabled_extensions; *d; d++)
> + if (!strcmp (*e, *d))
> + break;
> + if (*d == NULL)
> + {
> + if (result->len > 0)
> + g_string_append_c (result, ' ');
> + g_string_append (result, *e);
> + }
> + }
> +
> + enabled_extensions = result->str;
> +
> + g_string_free (result, FALSE);
> + g_strfreev (split_enabled_extensions);
> + g_strfreev (split_disabled_extensions);
> +
> + cogl_object_set_user_data (COGL_OBJECT (context),
> + &extensions_key,
> + (void *) enabled_extensions,
> + (CoglUserDataDestroyCallback) g_free);
> +
> + return enabled_extensions;
> + }
> + else
> +#endif
> + return (const char *) context->glGetString (GL_EXTENSIONS);
> +}
> +
> +const char *
> +_cogl_context_get_gl_version (CoglContext *context)
> +{
> +#ifdef COGL_ENABLE_DEBUG
> + const char *version_override;
> +
> + if ((version_override = g_getenv ("COGL_DEBUG_GL_VERSION")))
> + return version_override;
> +#endif
> +
> + return (const char *) context->glGetString (GL_VERSION);
> +}
> diff --git a/cogl/cogl-debug.c b/cogl/cogl-debug.c
> index 5161b4c..d3aced0 100644
> --- a/cogl/cogl-debug.c
> +++ b/cogl/cogl-debug.c
> @@ -171,17 +171,27 @@ _cogl_parse_debug_string (const char *value,
> }
> else if (g_ascii_strcasecmp (value, "help") == 0)
> {
> - g_printerr ("\n\n%28s\n", _("Supported debug values:"));
> + g_printerr ("\n\n%34s\n", _("Supported debug values:"));
> #define OPT(MASK_NAME, GROUP, NAME, NAME_FORMATTED, DESCRIPTION) \
> - g_printerr ("%28s %s\n", NAME ":", g_dgettext (GETTEXT_PACKAGE, \
> + g_printerr ("%34s %s\n", NAME ":", g_dgettext (GETTEXT_PACKAGE, \
> DESCRIPTION));
> #include "cogl-debug-options.h"
> - g_printerr ("\n%28s\n", _("Special debug values:"));
> + g_printerr ("\n%34s\n", _("Special debug values:"));
> OPT (IGNORED, "ignored", "all", "ignored", \
> N_("Enables all non-behavioural debug options"));
> OPT (IGNORED, "ignored", "verbose", "ignored", \
> N_("Enables all non-behavioural debug options"));
> #undef OPT
> +
> + g_printerr ("\n"
> + "%34s\n"
> + " COGL_DEBUG_DISABLE_GL_EXTENSIONS: %s\n"
> + " COGL_DEBUG_GL_VERSION: %s\n",
> + _("Additional environment variables:"),
> + _("Comma-separated list of GL extensions to pretend are "
> + "disabled"),
> + _("Override the GL version that Cogl will assume the driver "
> + "supports"));
> exit (1);
> }
> else
> diff --git a/cogl/cogl-gpu-info.c b/cogl/cogl-gpu-info.c
> index 53e5bb2..8e64d04 100644
> --- a/cogl/cogl-gpu-info.c
> +++ b/cogl/cogl-gpu-info.c
> @@ -482,7 +482,7 @@ _cogl_gpu_info_init (CoglContext *ctx,
> int i;
>
> strings.renderer_string = (const char *) ctx->glGetString (GL_RENDERER);
> - strings.version_string = (const char *) ctx->glGetString (GL_VERSION);
> + strings.version_string = _cogl_context_get_gl_version (ctx);
> strings.vendor_string = (const char *) ctx->glGetString (GL_VENDOR);
>
> /* Determine the driver package */
> diff --git a/cogl/driver/gl/cogl-gl.c b/cogl/driver/gl/cogl-gl.c
> index ce0c9bc..0f833eb 100644
> --- a/cogl/driver/gl/cogl-gl.c
> +++ b/cogl/driver/gl/cogl-gl.c
> @@ -255,7 +255,7 @@ _cogl_get_gl_version (CoglContext *ctx,
> int major = 0, minor = 0;
>
> /* Get the OpenGL version number */
> - if ((version_string = (const char *) ctx->glGetString (GL_VERSION)) == NULL)
> + if ((version_string = _cogl_context_get_gl_version (ctx)) == NULL)
> return FALSE;
>
> /* Extract the major number */
> @@ -303,7 +303,7 @@ check_gl_version (CoglContext *ctx,
> if (COGL_CHECK_GL_VERSION (major, minor, 1, 3))
> return TRUE;
>
> - gl_extensions = (const char*) ctx->glGetString (GL_EXTENSIONS);
> + gl_extensions = _cogl_context_get_gl_extensions (ctx);
>
> /* OpenGL 1.2 is only supported if we have the multitexturing
> extension */
> @@ -362,8 +362,8 @@ _cogl_driver_update_features (CoglContext *ctx,
> " GL_EXTENSIONS: %s",
> ctx->glGetString (GL_VENDOR),
> ctx->glGetString (GL_RENDERER),
> - ctx->glGetString (GL_VERSION),
> - ctx->glGetString (GL_EXTENSIONS));
> + _cogl_context_get_gl_version (ctx),
> + _cogl_context_get_gl_extensions (ctx));
>
> _cogl_get_gl_version (ctx, &gl_major, &gl_minor);
>
> @@ -379,7 +379,7 @@ _cogl_driver_update_features (CoglContext *ctx,
> if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 1, 4))
> COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_MIRRORED_REPEAT, TRUE);
>
> - gl_extensions = (const char *)ctx->glGetString (GL_EXTENSIONS);
> + gl_extensions = _cogl_context_get_gl_extensions (ctx);
>
> _cogl_feature_check_ext_functions (ctx,
> gl_major,
> diff --git a/cogl/driver/gles/cogl-gles.c b/cogl/driver/gles/cogl-gles.c
> index 8f1e91d..d6a8feb 100644
> --- a/cogl/driver/gles/cogl-gles.c
> +++ b/cogl/driver/gles/cogl-gles.c
> @@ -218,12 +218,12 @@ _cogl_driver_update_features (CoglContext *context,
> " GL_EXTENSIONS: %s",
> context->glGetString (GL_VENDOR),
> context->glGetString (GL_RENDERER),
> - context->glGetString (GL_VERSION),
> - context->glGetString (GL_EXTENSIONS));
> + _cogl_context_get_gl_version (context),
> + _cogl_context_get_gl_extensions (context));
>
> _cogl_gpu_info_init (context, &context->gpu);
>
> - gl_extensions = (const char*) context->glGetString (GL_EXTENSIONS);
> + gl_extensions = _cogl_context_get_gl_extensions (context);
>
> _cogl_feature_check_ext_functions (context,
> -1 /* GL major version */,
> diff --git a/cogl/winsys/cogl-winsys-wgl.c b/cogl/winsys/cogl-winsys-wgl.c
> index 61cd335..418e728 100644
> --- a/cogl/winsys/cogl-winsys-wgl.c
> +++ b/cogl/winsys/cogl-winsys-wgl.c
> @@ -580,7 +580,7 @@ get_wgl_extensions_string (HDC dc)
> extensions isn't supported then we can at least fake it to
> support the swap control extension */
> if (_cogl_check_extension ("WGL_EXT_swap_control",
> - (char *) ctx->glGetString (GL_EXTENSIONS)))
> + _cogl_context_get_gl_extensions (ctx)))
> return "WGL_EXT_swap_control";
>
> return NULL;
> --
> 1.7.11.3.g3c3efa5
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
More information about the Cogl
mailing list