cogl-context: Get rid of the features_cached member

The features_cached member of CoglContext is intended to mark when
we've calculated the features so that we know if they are ready in
cogl_get_features. However we always intialize the features while
creating the context so features_cached will never be FALSE so it's
not useful. We also had the odd behaviour that the COGL_DEBUG feature
overrides were only applied in the first call to
cogl_get_features. However there are other functions that use the
feature flags such as cogl_features_available that don't use this
function so in some cases the feature flags will be interpreted before
the overrides are applied. This patch makes it always initialize the
features and apply the overrides immediately while creating the
context. This fixes a problem with COGL_DEBUG=disable-arbfp where the
first material flushed is done before any call to cogl_get_features so
it may still use ARBfp.
This commit is contained in:
Neil Roberts 2010-11-24 18:37:47 +00:00
parent bbf912b61d
commit 7474d320f6
5 changed files with 23 additions and 28 deletions

View File

@ -58,6 +58,28 @@ _cogl_destroy_context_winsys (CoglContext *context);
static CoglContext *_context = NULL; static CoglContext *_context = NULL;
static gboolean gl_is_indirect = FALSE; static gboolean gl_is_indirect = FALSE;
static void
_cogl_init_feature_overrides (CoglContext *ctx)
{
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_VBOS))
ctx->feature_flags &= ~COGL_FEATURE_VBOS;
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_PBOS))
ctx->feature_flags &= ~COGL_FEATURE_PBOS;
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_ARBFP))
ctx->feature_flags &= ~COGL_FEATURE_SHADERS_ARBFP;
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_GLSL))
ctx->feature_flags &= ~COGL_FEATURE_SHADERS_GLSL;
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_NPOT_TEXTURES))
ctx->feature_flags &= ~(COGL_FEATURE_TEXTURE_NPOT |
COGL_FEATURE_TEXTURE_NPOT_BASIC |
COGL_FEATURE_TEXTURE_NPOT_MIPMAP |
COGL_FEATURE_TEXTURE_NPOT_REPEAT);
}
static gboolean static gboolean
cogl_create_context (void) cogl_create_context (void)
{ {
@ -91,7 +113,6 @@ cogl_create_context (void)
/* Init default values */ /* Init default values */
_context->feature_flags = 0; _context->feature_flags = 0;
_context->feature_flags_private = 0; _context->feature_flags_private = 0;
_context->features_cached = FALSE;
_context->texture_types = NULL; _context->texture_types = NULL;
_context->buffer_types = NULL; _context->buffer_types = NULL;
@ -100,6 +121,7 @@ cogl_create_context (void)
/* TODO: combine these two into one function */ /* TODO: combine these two into one function */
_cogl_create_context_driver (_context); _cogl_create_context_driver (_context);
_cogl_features_init (); _cogl_features_init ();
_cogl_init_feature_overrides (_context);
_cogl_create_context_winsys (_context); _cogl_create_context_winsys (_context);

View File

@ -55,7 +55,6 @@ typedef struct
/* Features cache */ /* Features cache */
CoglFeatureFlags feature_flags; CoglFeatureFlags feature_flags;
CoglFeatureFlagsPrivate feature_flags_private; CoglFeatureFlagsPrivate feature_flags_private;
gboolean features_cached;
CoglHandle default_pipeline; CoglHandle default_pipeline;
CoglHandle default_layer_0; CoglHandle default_layer_0;

View File

@ -432,24 +432,6 @@ cogl_get_features (void)
{ {
_COGL_GET_CONTEXT (ctx, 0); _COGL_GET_CONTEXT (ctx, 0);
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_VBOS))
ctx->feature_flags &= ~COGL_FEATURE_VBOS;
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_PBOS))
ctx->feature_flags &= ~COGL_FEATURE_PBOS;
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_ARBFP))
ctx->feature_flags &= ~COGL_FEATURE_SHADERS_ARBFP;
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_GLSL))
ctx->feature_flags &= ~COGL_FEATURE_SHADERS_GLSL;
if (G_UNLIKELY (cogl_debug_flags & COGL_DEBUG_DISABLE_NPOT_TEXTURES))
ctx->feature_flags &= ~(COGL_FEATURE_TEXTURE_NPOT |
COGL_FEATURE_TEXTURE_NPOT_BASIC |
COGL_FEATURE_TEXTURE_NPOT_MIPMAP |
COGL_FEATURE_TEXTURE_NPOT_REPEAT);
return ctx->feature_flags; return ctx->feature_flags;
} }
@ -458,9 +440,6 @@ cogl_features_available (CoglFeatureFlags features)
{ {
_COGL_GET_CONTEXT (ctx, 0); _COGL_GET_CONTEXT (ctx, 0);
if (!ctx->features_cached)
_cogl_features_init ();
return (ctx->feature_flags & features) == features; return (ctx->feature_flags & features) == features;
} }
@ -469,9 +448,6 @@ _cogl_features_available_private (CoglFeatureFlagsPrivate features)
{ {
_COGL_GET_CONTEXT (ctx, 0); _COGL_GET_CONTEXT (ctx, 0);
if (!ctx->features_cached)
_cogl_features_init ();
return (ctx->feature_flags_private & features) == features; return (ctx->feature_flags_private & features) == features;
} }

View File

@ -233,5 +233,4 @@ _cogl_features_init (void)
/* Cache features */ /* Cache features */
ctx->feature_flags = flags; ctx->feature_flags = flags;
ctx->feature_flags_private = flags_private; ctx->feature_flags_private = flags_private;
ctx->features_cached = TRUE;
} }

View File

@ -117,6 +117,5 @@ _cogl_features_init (void)
/* Cache features */ /* Cache features */
ctx->feature_flags = flags; ctx->feature_flags = flags;
ctx->features_cached = TRUE;
} }