[Mesa-dev] [PATCH] mesa, st/glx, st/wgl: Move GL version validation into an helper.

Ilia Mirkin imirkin at alum.mit.edu
Fri Nov 14 12:36:11 PST 2014


On Fri, Nov 14, 2014 at 3:33 PM,  <jfonseca at vmware.com> wrote:
> From: José Fonseca <jfonseca at vmware.com>
>
> As suggested by Brian Paul.
>
> Tested with piglit glx-create-context-invalid-{gl,es}-version.
> ---
>  src/gallium/state_trackers/glx/xlib/glx_api.c    | 13 +++-------
>  src/gallium/state_trackers/wgl/stw_ext_context.c | 13 +++-------
>  src/mesa/main/version.c                          | 33 ++++++++++++++++++++++++
>  src/mesa/main/version.h                          |  6 +++++
>  4 files changed, 47 insertions(+), 18 deletions(-)

Is it OK to depend on mesa/main from state trackers? (other than the
GL state tracker, obviously)

>
> diff --git a/src/gallium/state_trackers/glx/xlib/glx_api.c b/src/gallium/state_trackers/glx/xlib/glx_api.c
> index 1807edb..d4e028c 100644
> --- a/src/gallium/state_trackers/glx/xlib/glx_api.c
> +++ b/src/gallium/state_trackers/glx/xlib/glx_api.c
> @@ -36,6 +36,8 @@
>  #include <X11/Xmd.h>
>  #include <GL/glxproto.h>
>
> +#include "main/version.h"
> +
>  #include "xm_api.h"
>
>
> @@ -2792,19 +2794,12 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config,
>     if (majorVersion <= 0 ||
>         minorVersion < 0 ||
>         (profileMask != GLX_CONTEXT_ES_PROFILE_BIT_EXT &&
> -        ((majorVersion == 1 && minorVersion > 5) ||
> -         (majorVersion == 2 && minorVersion > 1) ||
> -         (majorVersion == 3 && minorVersion > 3) ||
> -         (majorVersion == 4 && minorVersion > 5) ||
> -         majorVersion > 4))) {
> +        !_mesa_is_valid_version(majorVersion, minorVersion))) {
>        generate_error(dpy, BadMatch, 0, X_GLXCreateContextAtrribsARB, True);
>        return NULL;
>     }
>     if (profileMask == GLX_CONTEXT_ES_PROFILE_BIT_EXT &&
> -       ((majorVersion == 1 && minorVersion > 1) ||
> -        (majorVersion == 2 && minorVersion > 0) ||
> -        (majorVersion == 3 && minorVersion > 1) ||
> -        majorVersion > 3)) {
> +       !_mesa_is_valid_es_version(majorVersion, minorVersion)) {
>        /* GLX_EXT_create_context_es2_profile says nothing to justifying a
>         * different error code for invalid ES versions, but this is what NVIDIA
>         * does and piglit expects.
> diff --git a/src/gallium/state_trackers/wgl/stw_ext_context.c b/src/gallium/state_trackers/wgl/stw_ext_context.c
> index 8a96cac..ee46334 100644
> --- a/src/gallium/state_trackers/wgl/stw_ext_context.c
> +++ b/src/gallium/state_trackers/wgl/stw_ext_context.c
> @@ -30,6 +30,8 @@
>  #include <GL/gl.h>
>  #include <GL/wglext.h>
>
> +#include "main/version.h"
> +
>  #include "stw_icd.h"
>  #include "stw_context.h"
>  #include "stw_device.h"
> @@ -114,16 +116,9 @@ wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList)
>     if (majorVersion <= 0 ||
>         minorVersion < 0 ||
>         (profileMask != WGL_CONTEXT_ES_PROFILE_BIT_EXT &&
> -        ((majorVersion == 1 && minorVersion > 5) ||
> -         (majorVersion == 2 && minorVersion > 1) ||
> -         (majorVersion == 3 && minorVersion > 3) ||
> -         (majorVersion == 4 && minorVersion > 5) ||
> -         majorVersion > 4)) ||
> +        !_mesa_is_valid_version(majorVersion, minorVersion)) ||
>         (profileMask == WGL_CONTEXT_ES_PROFILE_BIT_EXT &&
> -        ((majorVersion == 1 && minorVersion > 1) ||
> -         (majorVersion == 2 && minorVersion > 0) ||
> -         (majorVersion == 3 && minorVersion > 1) ||
> -         majorVersion > 3))) {
> +        !_mesa_is_valid_es_version(majorVersion, minorVersion))) {
>        SetLastError(ERROR_INVALID_VERSION_ARB);
>        return NULL;
>     }
> diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c
> index 4951891..5bdef16 100644
> --- a/src/mesa/main/version.c
> +++ b/src/mesa/main/version.c
> @@ -460,3 +460,36 @@ _mesa_compute_version(struct gl_context *ctx)
>        break;
>     }
>  }
> +
> +
> +GLboolean
> +_mesa_is_valid_version(int major, int minor)
> +{
> +   static const char max_minor_version[] = {
> +      /* 1 . */ 5,
> +      /* 2 . */ 1,
> +      /* 3 . */ 3,
> +      /* 4 . */ 5,
> +   };
> +
> +   return (major >= 0 &&
> +           major < sizeof max_minor_version &&
> +           minor >= 0 &&
> +           minor <= max_minor_version[major - 1]);
> +}
> +
> +
> +GLboolean
> +_mesa_is_valid_es_version(int major, int minor)
> +{
> +   static const char max_minor_version[] = {
> +      /* 1 . */ 1,
> +      /* 2 . */ 0,
> +      /* 3 . */ 1,
> +   };
> +
> +   return (major >= 0 &&
> +           major < sizeof max_minor_version &&
> +           minor >= 0 &&
> +           minor <= max_minor_version[major - 1]);
> +}
> diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h
> index 450a0e3..e2e1fc2 100644
> --- a/src/mesa/main/version.h
> +++ b/src/mesa/main/version.h
> @@ -50,4 +50,10 @@ _mesa_override_glsl_version(struct gl_constants *consts);
>  extern int
>  _mesa_get_gl_version_override(void);
>
> +extern GLboolean
> +_mesa_is_valid_version(int major, int minor);
> +
> +extern GLboolean
> +_mesa_is_valid_es_version(int major, int minor);
> +
>  #endif /* VERSION_H */
> --
> 2.1.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list