[Mesa-dev] [PATCH 1/2] mesa: Replace VersionMajor/VersionMinor with a Version field.

Eric Anholt eric at anholt.net
Tue Jul 31 15:24:17 PDT 2012


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".
---

I didn't like any of the macrofying changes I heard, particularly
because I expect the minor version to never hit 10 (We've had GL minor
versions up to a maximum of 3/10 so far), and it provides consistency
with piglit where we're also using major * 10 + minor.

I did take Brian's suggestion of removing the old fields, though.
That was a bit more typing, but I think it was good.

 src/mesa/drivers/dri/intel/intel_screen.c      |    4 +---
 src/mesa/drivers/dri/nouveau/nouveau_context.c |    4 +---
 src/mesa/drivers/dri/r200/r200_context.c       |    4 +---
 src/mesa/drivers/dri/radeon/radeon_context.c   |    4 +---
 src/mesa/main/enable.c                         |    4 ++--
 src/mesa/main/fbobject.c                       |    8 +++----
 src/mesa/main/get.c                            |   13 ++++++++---
 src/mesa/main/glformats.c                      |    8 +++----
 src/mesa/main/mtypes.h                         |    4 ++--
 src/mesa/main/texformat.c                      |    4 ++--
 src/mesa/main/teximage.c                       |   15 ++++++------
 src/mesa/main/texparam.c                       |    2 +-
 src/mesa/main/varray.c                         |    5 ++--
 src/mesa/main/version.c                        |   29 ++++++++++++------------
 src/mesa/state_tracker/st_manager.c            |    3 +--
 15 files changed, 53 insertions(+), 58 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
index e8a4ad1..24dab8f 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.c
+++ b/src/mesa/drivers/dri/intel/intel_screen.c
@@ -693,9 +693,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;
       }
 
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
index d7d5a04..f794308 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
@@ -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;
diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c
index 244973e..17e08a1 100644
--- a/src/mesa/drivers/dri/r200/r200_context.c
+++ b/src/mesa/drivers/dri/r200/r200_context.c
@@ -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;
diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c
index 9881d00..34c392e 100644
--- a/src/mesa/drivers/dri/radeon/radeon_context.c
+++ b/src/mesa/drivers/dri/radeon/radeon_context.c
@@ -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;
diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
index c811f2a..f811057 100644
--- a/src/mesa/main/enable.c
+++ b/src/mesa/main/enable.c
@@ -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;
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index eb03b09..d558d7f 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -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;
 
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index b9c98fb..7ffa3c1 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -1308,8 +1308,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 */
@@ -1491,6 +1491,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:
@@ -1853,7 +1860,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;
 
diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
index 4fe0ae0..daf1b76 100644
--- a/src/mesa/main/glformats.c
+++ b/src/mesa/main/glformats.c
@@ -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:
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 7d7213f..a3618a6 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3426,8 +3426,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) */
diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c
index d360f0e..275e69e 100644
--- a/src/mesa/main/texformat.c
+++ b/src/mesa/main/texformat.c
@@ -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) {
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index d2746c6..ef64a79 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -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)
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index 1376219..56372e8 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -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;
diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index 7ec7cfe..327fabb 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -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;
    }
diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c
index 91ef2df..7283194 100644
--- a/src/mesa/main/version.c
+++ b/src/mesa/main/version.c
@@ -33,22 +33,25 @@
  * 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) {
diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
index 875e0c4..5142eb2 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -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);
-- 
1.7.10.4



More information about the mesa-dev mailing list