summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTapani Pälli <[email protected]>2018-05-29 14:24:10 +0300
committerTapani Pälli <[email protected]>2018-05-31 09:24:17 +0300
commitc983c6abaf6fae767f404825e0fa913c75914279 (patch)
tree5a22483a6e46044df43cc5ac0d8e40fac747bf56 /src
parentd511bba2f92566c512c86c5f51bd756834cbd444 (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.c54
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)" );