From c983c6abaf6fae767f404825e0fa913c75914279 Mon Sep 17 00:00:00 2001 From: Tapani Pälli Date: Tue, 29 May 2018 14:24:10 +0300 Subject: mesa: don't call Driver.TexEnv with invalid arguments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Marek Olšák --- 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 22fc8da1cab..a69c8dd7435 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)" ); -- cgit v1.2.3