[Mesa-dev] [PATCH] mesa: don't call Driver.TexEnv with invalid arguments

Marek Olšák maraeo at gmail.com
Tue May 29 18:28:06 UTC 2018


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Tue, May 29, 2018 at 7:24 AM, Tapani Pälli <tapani.palli at intel.com>
wrote:

> Patch skips useless and possibly dangerous calls down to the driver
> in case invalid arguments were given. I noticed this would be happening
> with demo of Darwinia game. AFAIK this does not fix anything but makes
> this path safer and more like how other API functions are implemented.
>
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> ---
>  src/mesa/main/texenv.c | 54 ++++++++++++++++++++++++++++++
> +-------------------
>  1 file changed, 34 insertions(+), 20 deletions(-)
>
> diff --git a/src/mesa/main/texenv.c b/src/mesa/main/texenv.c
> index 22fc8da1ca..a69c8dd743 100644
> --- a/src/mesa/main/texenv.c
> +++ b/src/mesa/main/texenv.c
> @@ -103,7 +103,7 @@ set_env_color(struct gl_context *ctx,
>
>
>  /** Set an RGB or A combiner mode/function */
> -static void
> +static bool
>  set_combiner_mode(struct gl_context *ctx,
>                    struct gl_fixedfunc_texture_unit *texUnit,
>                    GLenum pname, GLenum mode)
> @@ -144,32 +144,35 @@ set_combiner_mode(struct gl_context *ctx,
>
>     if (!legal) {
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
> -      return;
> +      return false;
>     }
>
>     switch (pname) {
>     case GL_COMBINE_RGB:
>        if (texUnit->Combine.ModeRGB == mode)
> -         return;
> +         return true;
>        FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE);
>        texUnit->Combine.ModeRGB = mode;
>        break;
>
>     case GL_COMBINE_ALPHA:
>        if (texUnit->Combine.ModeA == mode)
> -         return;
> +         return true;
>        FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE);
>        texUnit->Combine.ModeA = mode;
>        break;
>     default:
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
> +      return false;
>     }
> +
> +   return true;
>  }
>
>
>
>  /** Set an RGB or A combiner source term */
> -static void
> +static bool
>  set_combiner_source(struct gl_context *ctx,
>                      struct gl_fixedfunc_texture_unit *texUnit,
>                      GLenum pname, GLenum param)
> @@ -199,13 +202,13 @@ set_combiner_source(struct gl_context *ctx,
>        break;
>     default:
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
> -      return;
> +      return false;
>     }
>
>     if ((term == 3) && (ctx->API != API_OPENGL_COMPAT
>                         || !ctx->Extensions.NV_texture_env_combine4)) {
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
> -      return;
> +      return false;
>     }
>
>     assert(term < MAX_COMBINER_TERMS);
> @@ -246,7 +249,7 @@ set_combiner_source(struct gl_context *ctx,
>
>     if (!legal) {
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
> -      return;
> +      return false;
>     }
>
>     FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE);
> @@ -255,11 +258,13 @@ set_combiner_source(struct gl_context *ctx,
>        texUnit->Combine.SourceA[term] = param;
>     else
>        texUnit->Combine.SourceRGB[term] = param;
> +
> +   return true;
>  }
>
>
>  /** Set an RGB or A combiner operand term */
> -static void
> +static bool
>  set_combiner_operand(struct gl_context *ctx,
>                       struct gl_fixedfunc_texture_unit *texUnit,
>                       GLenum pname, GLenum param)
> @@ -286,13 +291,13 @@ set_combiner_operand(struct gl_context *ctx,
>        break;
>     default:
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
> -      return;
> +      return false;
>     }
>
>     if ((term == 3) && (ctx->API != API_OPENGL_COMPAT
>                         || !ctx->Extensions.NV_texture_env_combine4)) {
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
> -      return;
> +      return false;
>     }
>
>     assert(term < MAX_COMBINER_TERMS);
> @@ -328,7 +333,7 @@ set_combiner_operand(struct gl_context *ctx,
>
>     if (!legal) {
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
> -      return;
> +      return false;
>     }
>
>     FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE);
> @@ -337,10 +342,12 @@ set_combiner_operand(struct gl_context *ctx,
>        texUnit->Combine.OperandA[term] = param;
>     else
>        texUnit->Combine.OperandRGB[term] = param;
> +
> +   return true;
>  }
>
>
> -static void
> +static bool
>  set_combiner_scale(struct gl_context *ctx,
>                     struct gl_fixedfunc_texture_unit *texUnit,
>                     GLenum pname, GLfloat scale)
> @@ -359,25 +366,28 @@ set_combiner_scale(struct gl_context *ctx,
>     else {
>        _mesa_error( ctx, GL_INVALID_VALUE,
>                     "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
> -      return;
> +      return false;
>     }
>
>     switch (pname) {
>     case GL_RGB_SCALE:
>        if (texUnit->Combine.ScaleShiftRGB == shift)
> -         return;
> +         return true;
>        FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE);
>        texUnit->Combine.ScaleShiftRGB = shift;
>        break;
>     case GL_ALPHA_SCALE:
>        if (texUnit->Combine.ScaleShiftA == shift)
> -         return;
> +         return true;
>        FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE);
>        texUnit->Combine.ScaleShiftA = shift;
>        break;
>     default:
>        TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
> +      return false;
>     }
> +
> +   return true;
>  }
>
>
> @@ -418,7 +428,8 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const
> GLfloat *param )
>           break;
>        case GL_COMBINE_RGB:
>        case GL_COMBINE_ALPHA:
> -         set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0);
> +         if (!set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0))
> +            return;
>          break;
>        case GL_SOURCE0_RGB:
>        case GL_SOURCE1_RGB:
> @@ -428,7 +439,8 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const
> GLfloat *param )
>        case GL_SOURCE1_ALPHA:
>        case GL_SOURCE2_ALPHA:
>        case GL_SOURCE3_ALPHA_NV:
> -         set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0);
> +         if (!set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0))
> +            return;
>          break;
>        case GL_OPERAND0_RGB:
>        case GL_OPERAND1_RGB:
> @@ -438,11 +450,13 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const
> GLfloat *param )
>        case GL_OPERAND1_ALPHA:
>        case GL_OPERAND2_ALPHA:
>        case GL_OPERAND3_ALPHA_NV:
> -         set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0);
> +         if (!set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0))
> +            return;
>          break;
>        case GL_RGB_SCALE:
>        case GL_ALPHA_SCALE:
> -         set_combiner_scale(ctx, texUnit, pname, param[0]);
> +         if (!set_combiner_scale(ctx, texUnit, pname, param[0]))
> +            return;
>          break;
>        default:
>          _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180529/4c63ebe7/attachment.html>


More information about the mesa-dev mailing list