On 07/31/2012 03:24 PM, Eric Anholt wrote: > 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) {
I think this is wrong. The old check accepted GL 1.x, 2.x, and 3.0, but not later. Your new check doesn't accept 3.0. I believe <= 30 would work. Otherwise, this looks good. With that change, this patch (only) is: Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> > 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); > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev