[Mesa-dev] [PATCH 1/2] mesa: Replace VersionMajor/VersionMinor with a Version field.
Kenneth Graunke
kenneth at whitecape.org
Tue Jul 31 16:13:39 PDT 2012
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 <kenneth at 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);
>
More information about the mesa-dev
mailing list