From 00905dbf19712c532bcdb2a2f7bf5d327d4df97b Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Sat, 1 Sep 2012 01:38:08 -0700 Subject: [PATCH] mesa: allow MESA_GL_VERSION_OVERRIDE to override the API type Change the format to MAJOR.MINOR[FC] For example: 2.1, 3.0FC, 3.1 The FC suffix indicates a forward compatible context, and is only valid for versions >= 3.0. Examples: 2.1: GL Legacy/Compatibility context 3.0: GL Legacy/Compatibility context 3.0FC: GL Core Profile context + Forward Compatible 3.1: GL Core Profile context 3.1FC: GL Core Profile context + Forward Compatible Signed-off-by: Jordan Justen Reviewed-by: Chad Versace Reviewed-by: Eric Anholt --- docs/envvars.html | 22 +++++++++-- src/mesa/main/context.c | 4 ++ src/mesa/main/version.c | 82 +++++++++++++++++++++++++++++++---------- src/mesa/main/version.h | 3 ++ 4 files changed, 88 insertions(+), 23 deletions(-) diff --git a/docs/envvars.html b/docs/envvars.html index 49c9025dac2..5d855c630d7 100644 --- a/docs/envvars.html +++ b/docs/envvars.html @@ -69,9 +69,25 @@ If the extension string is too long, the buffer overrun can cause the game to crash. This is a work-around for that.
  • MESA_GL_VERSION_OVERRIDE - changes the value returned by -glGetString(GL_VERSION). Valid values are point-separated version numbers, -such as "3.0". Mesa will not really implement all the features of the given -version if it's higher than what's normally reported. +glGetString(GL_VERSION) and possibly the GL API type. +
      +
    • The format should be MAJOR.MINOR[FC] +
    • FC is an optional suffix that indicates a forward compatible context. +This is only valid for versions >= 3.0. +
    • GL versions < 3.0 are set to a compatibility (non-Core) profile +
    • GL versions = 3.0, see below +
    • GL versions > 3.0 are set to a Core profile +
    • Examples: 2.1, 3.0, 3.0FC, 3.1, 3.1FC +
        +
      • 2.1 - select a compatibility (non-Core) profile with GL version 2.1 +
      • 3.0 - select a compatibility (non-Core) profile with GL version 3.0 +
      • 3.0FC - select a Core+Forward Compatible profile with GL version 3.0 +
      • 3.1 - select a Core profile with GL version 3.1 +
      • 3.1FC - select a Core+Forward Compatible profile with GL version 3.1 +
      +
    • Mesa may not really implement all the features of the given version. +(for developers only) +
  • MESA_GLSL_VERSION_OVERRIDE - changes the value returned by glGetString(GL_SHADING_LANGUAGE_VERSION). Valid values are integers, such as "130". Mesa will not really implement all the features of the given language version diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index e55e2fdee3b..8d5dd1e5bd2 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -921,6 +921,10 @@ _mesa_initialize_context(struct gl_context *ctx, ctx->WinSysDrawBuffer = NULL; ctx->WinSysReadBuffer = NULL; + if (_mesa_is_desktop_gl(ctx)) { + _mesa_override_gl_version(ctx); + } + /* misc one-time initializations */ one_time_init(ctx); diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c index 19d514d4aa9..a1fcec46dcd 100644 --- a/src/mesa/main/version.c +++ b/src/mesa/main/version.c @@ -28,30 +28,25 @@ #include "git_sha1.h" /** - * Override the context's GL version if the environment variable - * MESA_GL_VERSION_OVERRIDE is set. Valid values of MESA_GL_VERSION_OVERRIDE - * are point-separated version numbers, such as "3.0". + * Scans 'string' to see if it ends with 'ending'. */ -static void -override_version(struct gl_context *ctx) +static GLboolean +check_for_ending(char *string, const char *ending) { - const char *env_var = "MESA_GL_VERSION_OVERRIDE"; - const char *version; - int n; - int major, minor; + int len1, len2; - version = getenv(env_var); - if (!version) { - return; - } + len1 = strlen(string); + len2 = strlen(ending); - n = sscanf(version, "%u.%u", &major, &minor); - if (n != 2) { - fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version); - return; + if (len2 > len1) { + return GL_FALSE; } - ctx->Version = major * 10 + minor; + if (strcmp(string + (len1 - len2), ending) == 0) { + return GL_TRUE; + } else { + return GL_FALSE; + } } /** @@ -77,6 +72,55 @@ create_version_string(struct gl_context *ctx, const char *prefix) } } +/** + * Override the context's version and/or API type if the + * environment variable MESA_GL_VERSION_OVERRIDE is set. + * + * Example uses of MESA_GL_VERSION_OVERRIDE: + * + * 2.1: select a compatibility (non-Core) profile with GL version 2.1 + * 3.0: select a compatibility (non-Core) profile with GL version 3.0 + * 3.0FC: select a Core+Forward Compatible profile with GL version 3.0 + * 3.1: select a Core profile with GL version 3.1 + * 3.1FC: select a Core+Forward Compatible profile with GL version 3.1 + */ +void +_mesa_override_gl_version(struct gl_context *ctx) +{ + const char *env_var = "MESA_GL_VERSION_OVERRIDE"; + const char *version; + int n; + int major, minor; + GLboolean fc_suffix; + + version = getenv(env_var); + if (!version) { + return; + } + + fc_suffix = check_for_ending(version, "FC"); + + n = sscanf(version, "%u.%u", &major, &minor); + if (n != 2) { + fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version); + } else { + ctx->Version = major * 10 + minor; + if (ctx->Version < 30 && fc_suffix) { + fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version); + } else { + if (ctx->Version >= 30 && fc_suffix) { + ctx->API = API_OPENGL_CORE; + ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT; + } else if (ctx->Version >= 31) { + ctx->API = API_OPENGL_CORE; + } else { + ctx->API = API_OPENGL; + } + create_version_string(ctx, ""); + } + } +} + /** * Override the context's GLSL version if the environment variable * MESA_GLSL_VERSION_OVERRIDE is set. Valid values for @@ -244,8 +288,6 @@ compute_version(struct gl_context *ctx) ctx->Version = major * 10 + minor; - override_version(ctx); - create_version_string(ctx, ""); } diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h index f0ba6f267fb..1aab37d6936 100644 --- a/src/mesa/main/version.h +++ b/src/mesa/main/version.h @@ -45,6 +45,9 @@ struct gl_context; extern void _mesa_compute_version(struct gl_context *ctx); +extern void +_mesa_override_gl_version(struct gl_context *ctx); + extern void _mesa_override_glsl_version(struct gl_context *ctx); -- 2.30.2