[Mesa-dev] [PATCH] mesa: Make enable.c and get.c properly range check clip flags.

Paul Berry stereotype441 at gmail.com
Mon Sep 26 08:19:15 PDT 2011


On 25 September 2011 12:52, Paul Berry <stereotype441 at gmail.com> wrote:

> This is a follow-up to commit
> 2d686fe911a89fa477ee3848da41ebfb100500bf, which added decoding of
> GL_CLIP_DISTANCE[67] to the _mesa_set_enable() function.  This patch
> makes the following additional fixes:
>
> - Uses GL_CLIP_DISTANCEi enums consistently within enable.c rather
>  than the deprecated GL_CLIP_PLANEi enums.
>
> - Generates an error if the user tries to access a clip flag that is
>  unsupported by the hardware.
>
> - Applies the same change to _mesa_IsEnabled(), so that querying clip
>  flags using glIsEnabled() works properly.
>
> - Applies corresponding changes to get.c, so that querying clip flags
>  using glGet*() works properly.
>
> Fixes piglit test clip-flag-behavior.
> ---
>  src/mesa/main/enable.c |   27 +++++++++++++++++++--------
>  src/mesa/main/get.c    |   43 +++++++++++++++++++++++++++++++++++++------
>  2 files changed, 56 insertions(+), 14 deletions(-)
>
> diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
> index 23b6a94..689dc8a 100644
> --- a/src/mesa/main/enable.c
> +++ b/src/mesa/main/enable.c
> @@ -304,7 +304,10 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap,
> GLboolean state)
>       case GL_CLIP_DISTANCE6:
>       case GL_CLIP_DISTANCE7:
>          {
> -            const GLuint p = cap - GL_CLIP_PLANE0;
> +            const GLuint p = cap - GL_CLIP_DISTANCE0;
> +
> +            if (p >= ctx->Const.MaxClipPlanes)
> +               goto invalid_enum_error;
>
>             if ((ctx->Transform.ClipPlanesEnabled & (1 << p))
>                 == ((GLuint) state << p))
> @@ -1084,13 +1087,21 @@ _mesa_IsEnabled( GLenum cap )
>         return ctx->Eval.AutoNormal;
>       case GL_BLEND:
>          return ctx->Color.BlendEnabled & 1;  /* return state for buffer[0]
> */
> -      case GL_CLIP_PLANE0:
> -      case GL_CLIP_PLANE1:
> -      case GL_CLIP_PLANE2:
> -      case GL_CLIP_PLANE3:
> -      case GL_CLIP_PLANE4:
> -      case GL_CLIP_PLANE5:
> -        return (ctx->Transform.ClipPlanesEnabled >> (cap -
> GL_CLIP_PLANE0)) & 1;
> +      case GL_CLIP_DISTANCE0:
> +      case GL_CLIP_DISTANCE1:
> +      case GL_CLIP_DISTANCE2:
> +      case GL_CLIP_DISTANCE3:
> +      case GL_CLIP_DISTANCE4:
> +      case GL_CLIP_DISTANCE5:
> +      case GL_CLIP_DISTANCE6:
> +      case GL_CLIP_DISTANCE7: {
> +         const GLuint p = cap - GL_CLIP_DISTANCE0;
> +
> +         if (p >= ctx->Const.MaxClipPlanes)
> +            goto invalid_enum_error;
> +
> +        return (ctx->Transform.ClipPlanesEnabled >> p) & 1;
> +      }
>       case GL_COLOR_MATERIAL:
>         return ctx->Light.ColorMaterialEnabled;
>       case GL_CULL_FACE:
> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
> index 8279069..bc26d81 100644
> --- a/src/mesa/main/get.c
> +++ b/src/mesa/main/get.c
> @@ -102,6 +102,8 @@ enum value_type {
>    TYPE_BIT_3,
>    TYPE_BIT_4,
>    TYPE_BIT_5,
> +   TYPE_BIT_6,
> +   TYPE_BIT_7,
>    TYPE_FLOAT,
>    TYPE_FLOAT_2,
>    TYPE_FLOAT_3,
> @@ -134,6 +136,7 @@ enum value_extra {
>    EXTRA_NEW_FRAG_CLAMP,
>    EXTRA_VALID_DRAW_BUFFER,
>    EXTRA_VALID_TEXTURE_UNIT,
> +   EXTRA_VALID_CLIP_DISTANCE,
>    EXTRA_FLUSH_CURRENT,
>  };
>
> @@ -189,6 +192,8 @@ union value {
>  #define CONTEXT_BIT3(field) CONTEXT_FIELD(field, TYPE_BIT_3)
>  #define CONTEXT_BIT4(field) CONTEXT_FIELD(field, TYPE_BIT_4)
>  #define CONTEXT_BIT5(field) CONTEXT_FIELD(field, TYPE_BIT_5)
> +#define CONTEXT_BIT6(field) CONTEXT_FIELD(field, TYPE_BIT_6)
> +#define CONTEXT_BIT7(field) CONTEXT_FIELD(field, TYPE_BIT_7)
>  #define CONTEXT_FLOAT(field) CONTEXT_FIELD(field, TYPE_FLOAT)
>  #define CONTEXT_FLOAT2(field) CONTEXT_FIELD(field, TYPE_FLOAT_2)
>  #define CONTEXT_FLOAT3(field) CONTEXT_FIELD(field, TYPE_FLOAT_3)
> @@ -239,6 +244,11 @@ static const int extra_valid_texture_unit[] = {
>    EXTRA_END
>  };
>
> +static const int extra_valid_clip_distance[] = {
> +   EXTRA_VALID_CLIP_DISTANCE,
> +   EXTRA_END
> +};
> +
>  static const int extra_flush_current_valid_texture_unit[] = {
>    EXTRA_FLUSH_CURRENT,
>    EXTRA_VALID_TEXTURE_UNIT,
> @@ -525,12 +535,14 @@ static const struct value_desc values[] = {
>    { GL_ALPHA_TEST_FUNC, CONTEXT_ENUM(Color.AlphaFunc), NO_EXTRA },
>    { GL_ALPHA_TEST_REF, LOC_CUSTOM, TYPE_FLOATN, 0, extra_new_frag_clamp },
>    { GL_BLEND_DST, CONTEXT_ENUM(Color.Blend[0].DstRGB), NO_EXTRA },
> -   { GL_CLIP_PLANE0, CONTEXT_BIT0(Transform.ClipPlanesEnabled), NO_EXTRA
> },
> -   { GL_CLIP_PLANE1, CONTEXT_BIT1(Transform.ClipPlanesEnabled), NO_EXTRA
> },
> -   { GL_CLIP_PLANE2, CONTEXT_BIT2(Transform.ClipPlanesEnabled), NO_EXTRA
> },
> -   { GL_CLIP_PLANE3, CONTEXT_BIT3(Transform.ClipPlanesEnabled), NO_EXTRA
> },
> -   { GL_CLIP_PLANE4, CONTEXT_BIT4(Transform.ClipPlanesEnabled), NO_EXTRA
> },
> -   { GL_CLIP_PLANE5, CONTEXT_BIT5(Transform.ClipPlanesEnabled), NO_EXTRA
> },
> +   { GL_CLIP_DISTANCE0, CONTEXT_BIT0(Transform.ClipPlanesEnabled),
> extra_valid_clip_distance },
> +   { GL_CLIP_DISTANCE1, CONTEXT_BIT1(Transform.ClipPlanesEnabled),
> extra_valid_clip_distance },
> +   { GL_CLIP_DISTANCE2, CONTEXT_BIT2(Transform.ClipPlanesEnabled),
> extra_valid_clip_distance },
> +   { GL_CLIP_DISTANCE3, CONTEXT_BIT3(Transform.ClipPlanesEnabled),
> extra_valid_clip_distance },
> +   { GL_CLIP_DISTANCE4, CONTEXT_BIT4(Transform.ClipPlanesEnabled),
> extra_valid_clip_distance },
> +   { GL_CLIP_DISTANCE5, CONTEXT_BIT5(Transform.ClipPlanesEnabled),
> extra_valid_clip_distance },
> +   { GL_CLIP_DISTANCE6, CONTEXT_BIT6(Transform.ClipPlanesEnabled),
> extra_valid_clip_distance },
> +   { GL_CLIP_DISTANCE7, CONTEXT_BIT7(Transform.ClipPlanesEnabled),
> extra_valid_clip_distance },
>    { GL_COLOR_MATERIAL, CONTEXT_BOOL(Light.ColorMaterialEnabled), NO_EXTRA
> },
>    { GL_CURRENT_COLOR,
>      CONTEXT_FIELD(Current.Attrib[VERT_ATTRIB_COLOR0][0], TYPE_FLOATN_4),
> @@ -1808,6 +1820,13 @@ check_extra(struct gl_context *ctx, const char
> *func, const struct value_desc *d
>            return GL_FALSE;
>         }
>         break;
> +      case EXTRA_VALID_CLIP_DISTANCE:
> +        if (d->pname - GL_CLIP_DISTANCE0 >= ctx->Const.MaxClipPlanes) {
> +           _mesa_error(ctx, GL_INVALID_OPERATION, "%s(clip distance %u)",
> +                       func, d->pname - GL_CLIP_DISTANCE0);
>

Minor correction: the error should be GL_INVALID_ENUM, not
GL_INVALID_OPERATION (I accidentally sent an old version of the patch to the
list).  I'll make sure to push the correct version to master.


> +           return GL_FALSE;
> +        }
> +        break;
>       case EXTRA_END:
>         break;
>       default: /* *e is a offset into the extension struct */
> @@ -1996,6 +2015,8 @@ _mesa_GetBooleanv(GLenum pname, GLboolean *params)
>    case TYPE_BIT_3:
>    case TYPE_BIT_4:
>    case TYPE_BIT_5:
> +   case TYPE_BIT_6:
> +   case TYPE_BIT_7:
>       shift = d->type - TYPE_BIT_0;
>       params[0] = (*(GLbitfield *) p >> shift) & 1;
>       break;
> @@ -2083,6 +2104,8 @@ _mesa_GetFloatv(GLenum pname, GLfloat *params)
>    case TYPE_BIT_3:
>    case TYPE_BIT_4:
>    case TYPE_BIT_5:
> +   case TYPE_BIT_6:
> +   case TYPE_BIT_7:
>       shift = d->type - TYPE_BIT_0;
>       params[0] = BOOLEAN_TO_FLOAT((*(GLbitfield *) p >> shift) & 1);
>       break;
> @@ -2176,6 +2199,8 @@ _mesa_GetIntegerv(GLenum pname, GLint *params)
>    case TYPE_BIT_3:
>    case TYPE_BIT_4:
>    case TYPE_BIT_5:
> +   case TYPE_BIT_6:
> +   case TYPE_BIT_7:
>       shift = d->type - TYPE_BIT_0;
>       params[0] = (*(GLbitfield *) p >> shift) & 1;
>       break;
> @@ -2270,6 +2295,8 @@ _mesa_GetInteger64v(GLenum pname, GLint64 *params)
>    case TYPE_BIT_3:
>    case TYPE_BIT_4:
>    case TYPE_BIT_5:
> +   case TYPE_BIT_6:
> +   case TYPE_BIT_7:
>       shift = d->type - TYPE_BIT_0;
>       params[0] = (*(GLbitfield *) p >> shift) & 1;
>       break;
> @@ -2358,6 +2385,8 @@ _mesa_GetDoublev(GLenum pname, GLdouble *params)
>    case TYPE_BIT_3:
>    case TYPE_BIT_4:
>    case TYPE_BIT_5:
> +   case TYPE_BIT_6:
> +   case TYPE_BIT_7:
>       shift = d->type - TYPE_BIT_0;
>       params[0] = (*(GLbitfield *) p >> shift) & 1;
>       break;
> @@ -2628,6 +2657,8 @@ _mesa_GetFixedv(GLenum pname, GLfixed *params)
>    case TYPE_BIT_3:
>    case TYPE_BIT_4:
>    case TYPE_BIT_5:
> +   case TYPE_BIT_6:
> +   case TYPE_BIT_7:
>       shift = d->type - TYPE_BIT_0;
>       params[0] = BOOLEAN_TO_FIXED((*(GLbitfield *) p >> shift) & 1);
>       break;
> --
> 1.7.6.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110926/bec65e1d/attachment.html>


More information about the mesa-dev mailing list