From: Nanley Chery <nanley.g.ch...@intel.com> 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 8-bit wide datatype instead GLuint. Signed-off-by: Nanley Chery <nanley.g.ch...@intel.com> --- src/mesa/drivers/common/meta.c | 11 +++++++++++ src/mesa/drivers/common/meta.h | 1 + src/mesa/main/extensions.h | 2 +- src/mesa/main/mtypes.h | 6 ++++++ src/mesa/main/version.c | 1 + 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index e27489d..0ffcd9c 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -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; } diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h index 23fa209..e8fae10 100644 --- a/src/mesa/drivers/common/meta.h +++ b/src/mesa/drivers/common/meta.h @@ -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; diff --git a/src/mesa/main/extensions.h b/src/mesa/main/extensions.h index 40f66df..b049980 100644 --- a/src/mesa/main/extensions.h +++ b/src/mesa/main/extensions.h @@ -90,7 +90,7 @@ enum { #define EXT(name_str, driver_cap, ...) \ 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" diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 10e1586..15964dc 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3802,6 +3802,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; }; diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c index 5635a64..314b26d 100644 --- a/src/mesa/main/version.c +++ b/src/mesa/main/version.c @@ -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. -- 2.6.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev