mesa: Replace VersionMajor/VersionMinor with a Version field.
authorEric Anholt <eric@anholt.net>
Thu, 26 Jul 2012 21:43:56 +0000 (14:43 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 7 Aug 2012 18:47:19 +0000 (11:47 -0700)
As we get into supporting GL 3.x core, we come across more and more features
of the API that depend on the version number as opposed to just the extension
list.  This will let us more sanely do version checks than "(VersionMajor == 3
&& VersionMinor >= 2) || VersionMajor >= 4".

v2: Fix a bad <= 30 check.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
15 files changed:
src/mesa/drivers/dri/intel/intel_screen.c
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/radeon/radeon_context.c
src/mesa/main/enable.c
src/mesa/main/fbobject.c
src/mesa/main/get.c
src/mesa/main/glformats.c
src/mesa/main/mtypes.h
src/mesa/main/texformat.c
src/mesa/main/teximage.c
src/mesa/main/texparam.c
src/mesa/main/varray.c
src/mesa/main/version.c
src/mesa/state_tracker/st_manager.c

index 088fd61effe7b940e07733d042838031f43a51e7..3c595bc6e753b86b5000d476131803aa750e6f83 100644 (file)
@@ -724,9 +724,7 @@ intelCreateContext(gl_api api,
         (struct gl_context *) driContextPriv->driverPrivate;
 
       _mesa_compute_version(ctx);
-      if (ctx->VersionMajor > major_version
-         || (ctx->VersionMajor == major_version
-             && ctx->VersionMinor >= minor_version)) {
+      if (ctx->Version >= major_version * 10 + minor_version) {
         return true;
       }
 
index d7d5a04e6921a1cf41cdfec0bc0a3895866cbc38..f79430890fbaa268187bfdb5bc482b80c4c7c3df 100644 (file)
@@ -75,9 +75,7 @@ nouveau_context_create(gl_api api,
        dri_ctx->driverPrivate = ctx;
 
        _mesa_compute_version(ctx);
-       if (ctx->VersionMajor < major_version
-           || (ctx->VersionMajor == major_version
-               && ctx->VersionMinor < minor_version)) {
+       if (ctx->Version < major_version * 10 + minor_version) {
           nouveau_context_destroy(dri_ctx);
           *error = __DRI_CTX_ERROR_BAD_VERSION;
           return GL_FALSE;
index 244973e84757ca5e3f54d4c73d90b20022b914d3..17e08a10fc50011b0638c9dc5cb7372c897a0e8c 100644 (file)
@@ -454,9 +454,7 @@ GLboolean r200CreateContext( gl_api api,
    }
 
    _mesa_compute_version(ctx);
-   if (ctx->VersionMajor < major_version
-       || (ctx->VersionMajor == major_version
-          && ctx->VersionMinor < minor_version)) {
+   if (ctx->Version < major_version * 10 + minor_version) {
       r200DestroyContext(driContextPriv);
       *error = __DRI_CTX_ERROR_BAD_VERSION;
       return GL_FALSE;
index 9881d002faddf16aa8b5afa0ae8198a4a07ea27e..34c392ef8b739b43cd10bd6c9e444f69bf2ede98 100644 (file)
@@ -402,9 +402,7 @@ r100CreateContext( gl_api api,
    }
 
    _mesa_compute_version(ctx);
-   if (ctx->VersionMajor < major_version
-       || (ctx->VersionMajor == major_version
-          && ctx->VersionMinor < minor_version)) {
+   if (ctx->Version < major_version * 10 + minor_version) {
       radeonDestroyContext(driContextPriv);
       *error = __DRI_CTX_ERROR_BAD_VERSION;
       return GL_FALSE;
index c811f2a9c74cc7fd0b8ce28d61e87e4470fdb63f..f8110578ad47047740cae06c0f47ff3639521d25 100644 (file)
@@ -902,7 +902,7 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
        * GL_PRIMITIVE_RESTART_NV (which is client state).
        */
       case GL_PRIMITIVE_RESTART:
-         if (ctx->VersionMajor * 10 + ctx->VersionMinor < 31) {
+         if (ctx->Version < 31) {
             goto invalid_enum_error;
          }
          if (ctx->Array.PrimitiveRestart != state) {
@@ -1419,7 +1419,7 @@ _mesa_IsEnabled( GLenum cap )
 
       /* GL 3.1 primitive restart */
       case GL_PRIMITIVE_RESTART:
-         if (ctx->VersionMajor * 10 + ctx->VersionMinor < 31) {
+         if (ctx->Version < 31) {
             goto invalid_enum_error;
          }
          return ctx->Array.PrimitiveRestart;
index eb03b09183c5e78a01269d2595e71a2ba8361ab6..d558d7f8723e3c42d6cdd3a5cb9dd269f038ee3b 100644 (file)
@@ -1226,7 +1226,7 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
    case GL_RGBA8I_EXT:
    case GL_RGBA16I_EXT:
    case GL_RGBA32I_EXT:
-      return ctx->VersionMajor >= 3 ||
+      return ctx->Version >= 30 ||
              ctx->Extensions.EXT_texture_integer ? GL_RGBA : 0;
 
    case GL_RGB8UI_EXT:
@@ -1235,7 +1235,7 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
    case GL_RGB8I_EXT:
    case GL_RGB16I_EXT:
    case GL_RGB32I_EXT:
-      return ctx->VersionMajor >= 3 ||
+      return ctx->Version >= 30 ||
              ctx->Extensions.EXT_texture_integer ? GL_RGB : 0;
 
    case GL_R8UI:
@@ -1244,7 +1244,7 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
    case GL_R16I:
    case GL_R32UI:
    case GL_R32I:
-      return ctx->VersionMajor >= 3 ||
+      return ctx->Version >= 30 ||
              (ctx->Extensions.ARB_texture_rg &&
               ctx->Extensions.EXT_texture_integer) ? GL_RED : 0;
 
@@ -1254,7 +1254,7 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
    case GL_RG16I:
    case GL_RG32UI:
    case GL_RG32I:
-      return ctx->VersionMajor >= 3 ||
+      return ctx->Version >= 30 ||
              (ctx->Extensions.ARB_texture_rg &&
               ctx->Extensions.EXT_texture_integer) ? GL_RG : 0;
 
index 16ad2c4302d243b73660bc20027a636b8ef89421..332dfaf7f993e9eb9a7b0cf10140ac64088094eb 100644 (file)
@@ -1303,8 +1303,8 @@ static const struct value_desc values[] = {
 
    /* GL 3.0 */
    { GL_NUM_EXTENSIONS, LOC_CUSTOM, TYPE_INT, 0, extra_version_30 },
-   { GL_MAJOR_VERSION, CONTEXT_INT(VersionMajor), extra_version_30 },
-   { GL_MINOR_VERSION, CONTEXT_INT(VersionMinor), extra_version_30  },
+   { GL_MAJOR_VERSION, LOC_CUSTOM, TYPE_INT, 0, extra_version_30 },
+   { GL_MINOR_VERSION, LOC_CUSTOM, TYPE_INT, 0, extra_version_30  },
    { GL_CONTEXT_FLAGS, CONTEXT_INT(Const.ContextFlags), extra_version_30  },
 
    /* GL3.0 / GL_EXT_framebuffer_sRGB */
@@ -1486,6 +1486,13 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
    GLuint unit, *p;
 
    switch (d->pname) {
+   case GL_MAJOR_VERSION:
+      v->value_int = ctx->Version / 10;
+      break;
+   case GL_MINOR_VERSION:
+      v->value_int = ctx->Version % 10;
+      break;
+
    case GL_TEXTURE_1D:
    case GL_TEXTURE_2D:
    case GL_TEXTURE_3D:
@@ -1848,7 +1855,7 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
 static GLboolean
 check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d)
 {
-   const GLuint version = ctx->VersionMajor * 10 + ctx->VersionMinor;
+   const GLuint version = ctx->Version;
    int total, enabled;
    const int *e;
 
index 4fe0ae0781071c7ca7df2c974fb442c0d87464f0..daf1b7667b8f710ccb53f6e2cc9d0c89cd3e62fd 100644 (file)
@@ -1237,7 +1237,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
             case GL_UNSIGNED_SHORT:
             case GL_INT:
             case GL_UNSIGNED_INT:
-               return (ctx->VersionMajor >= 3 ||
+               return (ctx->Version >= 30 ||
                        ctx->Extensions.EXT_texture_integer)
                   ? GL_NO_ERROR : GL_INVALID_ENUM;
             default:
@@ -1252,7 +1252,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
             case GL_UNSIGNED_SHORT:
             case GL_INT:
             case GL_UNSIGNED_INT:
-               return (ctx->VersionMajor >= 3 ||
+               return (ctx->Version >= 30 ||
                        ctx->Extensions.EXT_texture_integer)
                   ? GL_NO_ERROR : GL_INVALID_ENUM;
             case GL_UNSIGNED_BYTE_3_3_2:
@@ -1274,7 +1274,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
             case GL_INT:
             case GL_UNSIGNED_INT:
             /* NOTE: no packed formats w/ BGR format */
-               return (ctx->VersionMajor >= 3 ||
+               return (ctx->Version >= 30 ||
                        ctx->Extensions.EXT_texture_integer)
                   ? GL_NO_ERROR : GL_INVALID_ENUM;
             default:
@@ -1290,7 +1290,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx,
             case GL_UNSIGNED_SHORT:
             case GL_INT:
             case GL_UNSIGNED_INT:
-               return (ctx->VersionMajor >= 3 ||
+               return (ctx->Version >= 30 ||
                        ctx->Extensions.EXT_texture_integer)
                   ? GL_NO_ERROR : GL_INVALID_ENUM;
             case GL_UNSIGNED_SHORT_4_4_4_4:
index e8adac99d9d3ff17546c68476894c78bb1a348c6..8fcb6b45694e31f00ce657d81b17eacca2715fca 100644 (file)
@@ -3424,8 +3424,8 @@ struct gl_context
    /** Extension information */
    struct gl_extensions Extensions;
 
-   /** Version info */
-   GLuint VersionMajor, VersionMinor;
+   /** GL version integer, for example 31 for GL 3.1, or 20 for GLES 2.0. */
+   GLuint Version;
    char *VersionString;
 
    /** \name State attribute stack (for glPush/PopAttrib) */
index d360f0e2262ceed2642408ae2b41103700157ad7..275e69e31ec2bc3ec11f236f97496a1007612f89 100644 (file)
@@ -719,7 +719,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
-   if (ctx->VersionMajor >= 3 ||
+   if (ctx->Version >= 30 ||
        ctx->Extensions.EXT_texture_integer) {
       switch (internalFormat) {
       case GL_RGB8UI_EXT:
@@ -838,7 +838,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
-   if (ctx->VersionMajor >= 3 ||
+   if (ctx->Version >= 30 ||
        (ctx->Extensions.ARB_texture_rg &&
         ctx->Extensions.EXT_texture_integer)) {
       switch (internalFormat) {
index d2746c6f33de50ab98b7392ae5fdc76c24133cfc..9ffdb4656680f7f99e31e447fc5b43ee5c76d35d 100644 (file)
@@ -332,7 +332,7 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
    }
 #endif /* FEATURE_EXT_texture_sRGB */
 
-   if (ctx->VersionMajor >= 3 ||
+   if (ctx->Version >= 30 ||
        ctx->Extensions.EXT_texture_integer) {
       switch (internalFormat) {
       case GL_RGBA8UI_EXT:
@@ -406,7 +406,7 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
       case GL_R16UI:
       case GL_R32I:
       case GL_R32UI:
-        if (ctx->VersionMajor < 3 && !ctx->Extensions.EXT_texture_integer)
+        if (ctx->Version < 30 && !ctx->Extensions.EXT_texture_integer)
            break;
         /* FALLTHROUGH */
       case GL_R8:
@@ -431,7 +431,7 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
       case GL_RG16UI:
       case GL_RG32I:
       case GL_RG32UI:
-        if (ctx->VersionMajor < 3 && !ctx->Extensions.EXT_texture_integer)
+        if (ctx->Version < 30 && !ctx->Extensions.EXT_texture_integer)
            break;
         /* FALLTHROUGH */
       case GL_RG:
@@ -1732,7 +1732,7 @@ texture_error_check( struct gl_context *ctx,
           target != GL_TEXTURE_RECTANGLE_ARB &&
           target != GL_PROXY_TEXTURE_RECTANGLE_ARB &&
          !((_mesa_is_cube_face(target) || target == GL_PROXY_TEXTURE_CUBE_MAP) &&
-           (ctx->VersionMajor >= 3 || ctx->Extensions.EXT_gpu_shader4))) {
+           (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4))) {
          if (!isProxy)
             _mesa_error(ctx, GL_INVALID_ENUM,
                         "glTexImage(target/internalFormat)");
@@ -1764,7 +1764,7 @@ texture_error_check( struct gl_context *ctx,
    }
 
    /* additional checks for integer textures */
-   if ((ctx->VersionMajor >= 3 || ctx->Extensions.EXT_texture_integer) &&
+   if ((ctx->Version >= 30 || ctx->Extensions.EXT_texture_integer) &&
        (_mesa_is_enum_format_integer(format) !=
         _mesa_is_enum_format_integer(internalFormat))) {
       if (!isProxy) {
@@ -1937,7 +1937,7 @@ subtexture_error_check2( struct gl_context *ctx, GLuint dimensions,
       }         
    }
 
-   if (ctx->VersionMajor >= 3 || ctx->Extensions.EXT_texture_integer) {
+   if (ctx->Version >= 30 || ctx->Extensions.EXT_texture_integer) {
       /* both source and dest must be integer-valued, or neither */
       if (_mesa_is_format_integer_color(destTex->TexFormat) !=
           _mesa_is_enum_format_integer(format)) {
@@ -3860,8 +3860,7 @@ validate_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat)
     * any mention of R/RG formats, but they appear in the GL 3.1 core
     * specification.
     */
-   if (ctx->VersionMajor < 3 ||
-       (ctx->VersionMajor == 3 && ctx->VersionMinor == 0)) {
+   if (ctx->Version <= 30) {
       GLenum base_format = _mesa_get_format_base_format(format);
 
       if (base_format == GL_R || base_format == GL_RG)
index 9213499a4899484374e8c5b454198c08b0559df5..9e7c3e4578287823f7fd08067cfc319178ca5ace 100644 (file)
@@ -1016,7 +1016,7 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
          *params = _mesa_get_format_bits(texFormat, pname);
          break;
       case GL_TEXTURE_SHARED_SIZE:
-         if (ctx->VersionMajor < 3 &&
+         if (ctx->Version < 30 &&
              !ctx->Extensions.EXT_texture_shared_exponent)
             goto invalid_pname;
          *params = texFormat == MESA_FORMAT_RGB9_E5_FLOAT ? 5 : 0;
index 7ec7cfee6f42c5866fb8274c84114099a37cfe27..327fabbc1e3540048192b3bfe1647bddebe028e4 100644 (file)
@@ -568,7 +568,7 @@ get_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname,
    case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
       return array->BufferObj->Name;
    case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
-      if (ctx->VersionMajor >= 3 || ctx->Extensions.EXT_gpu_shader4) {
+      if (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4) {
          return array->Integer;
       }
       goto error;
@@ -1092,8 +1092,7 @@ _mesa_PrimitiveRestartIndex(GLuint index)
 {
    GET_CURRENT_CONTEXT(ctx);
 
-   if (!ctx->Extensions.NV_primitive_restart &&
-       ctx->VersionMajor * 10 + ctx->VersionMinor < 31) {
+   if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()");
       return;
    }
index 85e623142d4fca5ba833990aa3ab1e0931a08365..59c81aedc7241ed60a83231b6dd87a75139d0567 100644 (file)
  * are point-separated version numbers, such as "3.0".
  */
 static void
-override_version(struct gl_context *ctx, GLuint *major, GLuint *minor)
+override_version(struct gl_context *ctx)
 {
    const char *env_var = "MESA_GL_VERSION_OVERRIDE";
    const char *version;
    int n;
+   int major, minor;
 
    version = getenv(env_var);
    if (!version) {
       return;
    }
 
-   n = sscanf(version, "%u.%u", major, minor);
+   n = sscanf(version, "%u.%u", &major, &minor);
    if (n != 2) {
       fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version);
       return;
    }
+
+   ctx->Version = major * 10 + minor;
 }
 
 /**
@@ -218,10 +221,9 @@ compute_version(struct gl_context *ctx)
       minor = 2;
    }
 
-   ctx->VersionMajor = major;
-   ctx->VersionMinor = minor;
+   ctx->Version = major * 10 + minor;
 
-   override_version(ctx, &ctx->VersionMajor, &ctx->VersionMinor);
+   override_version(ctx);
 
    ctx->VersionString = (char *) malloc(max);
    if (ctx->VersionString) {
@@ -231,7 +233,7 @@ compute_version(struct gl_context *ctx)
                     " (" MESA_GIT_SHA1 ")"
 #endif
                     ,
-                    ctx->VersionMajor, ctx->VersionMinor);
+                    ctx->Version / 10, ctx->Version % 10);
    }
 }
 
@@ -248,11 +250,9 @@ compute_version_es1(struct gl_context *ctx)
                               ctx->Extensions.EXT_point_parameters);
 
    if (ver_1_1) {
-      ctx->VersionMajor = 1;
-      ctx->VersionMinor = 1;
+      ctx->Version = 11;
    } else if (ver_1_0) {
-      ctx->VersionMajor = 1;
-      ctx->VersionMinor = 0;
+      ctx->Version = 10;
    } else {
       _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support.");
    }
@@ -265,7 +265,7 @@ compute_version_es1(struct gl_context *ctx)
                     " (" MESA_GIT_SHA1 ")"
 #endif
                     ,
-                    ctx->VersionMinor);
+                    ctx->Version % 10);
    }
 }
 
@@ -285,8 +285,7 @@ compute_version_es2(struct gl_context *ctx)
                               ctx->Extensions.ARB_texture_non_power_of_two &&
                               ctx->Extensions.EXT_blend_equation_separate);
    if (ver_2_0) {
-      ctx->VersionMajor = 2;
-      ctx->VersionMinor = 0;
+      ctx->Version = 20;
    } else {
       _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support.");
    }
@@ -303,14 +302,14 @@ compute_version_es2(struct gl_context *ctx)
 }
 
 /**
- * Set the context's VersionMajor, VersionMinor, VersionString fields.
+ * Set the context's Version and VersionString fields.
  * This should only be called once as part of context initialization
  * or to perform version check for GLX_ARB_create_context_profile.
  */
 void
 _mesa_compute_version(struct gl_context *ctx)
 {
-   if (ctx->VersionMajor)
+   if (ctx->Version)
       return;
 
    switch (ctx->API) {
index 875e0c44ac101f709be366828e56158790d7d062..5142eb2dddd5d7c35abbd037e9053d0e46aaba68 100644 (file)
@@ -652,8 +652,7 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
        * yet enforce the added restrictions of a forward-looking context, so
        * fail that too.
        */
-      if (st->ctx->VersionMajor * 10 + st->ctx->VersionMinor <
-          attribs->major * 10 + attribs->minor
+      if (st->ctx->Version < attribs->major * 10 + attribs->minor
          || (attribs->flags & ~ST_CONTEXT_FLAG_DEBUG) != 0) {
         *error = ST_CONTEXT_ERROR_BAD_VERSION;
          st_destroy_context(st);