aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/main/teximage.c62
1 files changed, 43 insertions, 19 deletions
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 58b7f2740cd..26a6c21cd0f 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -1102,6 +1102,32 @@ _mesa_legal_texture_dimensions(struct gl_context *ctx, GLenum target,
}
}
+static bool
+error_check_subtexture_negative_dimensions(struct gl_context *ctx,
+ GLuint dims,
+ GLsizei subWidth,
+ GLsizei subHeight,
+ GLsizei subDepth,
+ const char *func)
+{
+ /* Check size */
+ if (subWidth < 0) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(width=%d)", func, subWidth);
+ return true;
+ }
+
+ if (dims > 1 && subHeight < 0) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(height=%d)", func, subHeight);
+ return true;
+ }
+
+ if (dims > 2 && subDepth < 0) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(depth=%d)", func, subDepth);
+ return true;
+ }
+
+ return false;
+}
/**
* Do error checking of xoffset, yoffset, zoffset, width, height and depth
@@ -1119,25 +1145,6 @@ error_check_subtexture_dimensions(struct gl_context *ctx, GLuint dims,
const GLenum target = destImage->TexObject->Target;
GLuint bw, bh, bd;
- /* Check size */
- if (subWidth < 0) {
- _mesa_error(ctx, GL_INVALID_VALUE,
- "%s(width=%d)", func, subWidth);
- return GL_TRUE;
- }
-
- if (dims > 1 && subHeight < 0) {
- _mesa_error(ctx, GL_INVALID_VALUE,
- "%s(height=%d)", func, subHeight);
- return GL_TRUE;
- }
-
- if (dims > 2 && subDepth < 0) {
- _mesa_error(ctx, GL_INVALID_VALUE,
- "%s(depth=%d)", func, subDepth);
- return GL_TRUE;
- }
-
/* check xoffset and width */
if (xoffset < - (GLint) destImage->Border) {
_mesa_error(ctx, GL_INVALID_VALUE, "%s(xoffset)", func);
@@ -2104,6 +2111,12 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
return GL_TRUE;
}
+ if (error_check_subtexture_negative_dimensions(ctx, dimensions,
+ width, height, depth,
+ callerName)) {
+ return GL_TRUE;
+ }
+
texImage = _mesa_select_tex_image(texObj, target, level);
if (!texImage) {
/* non-existant texture level */
@@ -2497,6 +2510,11 @@ copytexsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
return GL_TRUE;
}
+ if (error_check_subtexture_negative_dimensions(ctx, dimensions,
+ width, height, 1, caller)) {
+ return GL_TRUE;
+ }
+
if (error_check_subtexture_dimensions(ctx, dimensions, texImage,
xoffset, yoffset, zoffset,
width, height, 1, caller)) {
@@ -4387,6 +4405,12 @@ compressed_subtexture_error_check(struct gl_context *ctx, GLint dims,
return GL_TRUE;
}
+ if (error_check_subtexture_negative_dimensions(ctx, dims,
+ width, height, depth,
+ callerName)) {
+ return GL_TRUE;
+ }
+
if (error_check_subtexture_dimensions(ctx, dims,
texImage, xoffset, yoffset, zoffset,
width, height, depth,