diff options
author | Tapani Pälli <[email protected]> | 2018-05-29 14:24:10 +0300 |
---|---|---|
committer | Tapani Pälli <[email protected]> | 2018-05-31 09:24:17 +0300 |
commit | c983c6abaf6fae767f404825e0fa913c75914279 (patch) | |
tree | 5a22483a6e46044df43cc5ac0d8e40fac747bf56 /src | |
parent | d511bba2f92566c512c86c5f51bd756834cbd444 (diff) |
mesa: don't call Driver.TexEnv with invalid arguments
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 <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/texenv.c | 54 |
1 files 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)" ); |