mesa: In helpers, only check driver capability for meta
authorNanley Chery <nanley.g.chery@intel.com>
Thu, 15 Oct 2015 19:34:43 +0000 (12:34 -0700)
committerNanley Chery <nanley.g.chery@intel.com>
Thu, 12 Nov 2015 21:10:37 +0000 (13:10 -0800)
Make API context and version checks done by the helper functions pass
unconditionally while meta is in progress. This transparently makes
extension checks solely dependent on struct gl_extensions while in meta.

v2: Use an 8-bit data type instead of a GLuint

Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
Reviewed-by: Chad Versace <chad.versace@intel.com>
src/mesa/drivers/common/meta.c
src/mesa/drivers/common/meta.h
src/mesa/main/extensions.h
src/mesa/main/mtypes.h
src/mesa/main/version.c

index e27489d6195059099865c59c0fc9dd75b4f633b2..0ffcd9c2c3f8ce476e20b1d9f77f9f8e6d11ddd0 100644 (file)
@@ -449,6 +449,16 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
    save->API = ctx->API;
    ctx->API = API_OPENGL_COMPAT;
 
+   /* Mesa's extension helper functions use the current context's API to look up
+    * the version required by an extension as a step in determining whether or
+    * not it has been advertised. Since meta aims to only be restricted by the
+    * driver capability (and not by whether or not an extension has been
+    * advertised), set the helper functions' Version variable to a value that
+    * will make the checks on the context API and version unconditionally pass.
+    */
+   save->ExtensionsVersion = ctx->Extensions.Version;
+   ctx->Extensions.Version = ~0;
+
    /* Pausing transform feedback needs to be done early, or else we won't be
     * able to change other state.
     */
@@ -1222,6 +1232,7 @@ _mesa_meta_end(struct gl_context *ctx)
    ctx->Meta->SaveStackDepth--;
 
    ctx->API = save->API;
+   ctx->Extensions.Version = save->ExtensionsVersion;
 }
 
 
index d742eaa9f67f928b89a433e4e795cc37c5eac634..d4bf0b65524c2819a3ec8213b981bd0348542f2a 100644 (file)
@@ -72,6 +72,7 @@ struct save_state
 
    /* Always saved/restored with meta. */
    gl_api API;
+   uint8_t ExtensionsVersion;
 
    /** MESA_META_CLEAR (and others?) */
    struct gl_query_object *CurrentOcclusionObject;
index 4ea2af13efc491b3275848bca667ca9765a146df..e4671be2cf68822330ac667c5149eecde2484450 100644 (file)
@@ -91,7 +91,7 @@ enum {
 static inline bool \
 _mesa_has_##name_str(const struct gl_context *ctx) \
 { \
-   return ctx->Extensions.driver_cap && (ctx->Version >= \
+   return ctx->Extensions.driver_cap && (ctx->Extensions.Version >= \
           _mesa_extension_table[MESA_EXTENSION_##name_str].version[ctx->API]); \
 }
 #include "extensions_table.h"
index 8de9c773b9f3928015f236374267b9b57874c1b9..c4d8c6a8cb4387f5d3e38967b333bc0f4c9d834f 100644 (file)
@@ -3820,6 +3820,12 @@ struct gl_extensions
    const GLubyte *String;
    /** Number of supported extensions */
    GLuint Count;
+   /**
+    * The context version which extension helper functions compare against.
+    * By default, the value is equal to ctx->Version. This changes to ~0
+    * while meta is in progress.
+    */
+   GLubyte Version;
 };
 
 
index 5635a64320063f09e393cedb3e2a5ddc83a9665f..314b26dc74fa5cb3d8289193f9d490623fbf1054 100644 (file)
@@ -524,6 +524,7 @@ _mesa_compute_version(struct gl_context *ctx)
       return;
 
    ctx->Version = _mesa_get_version(&ctx->Extensions, &ctx->Const, ctx->API);
+   ctx->Extensions.Version = ctx->Version;
 
    /* Make sure that the GLSL version lines up with the GL version. In some
     * cases it can be too high, e.g. if an extension is missing.