diff options
Diffstat (limited to 'src/mesa/main/teximage.c')
-rw-r--r-- | src/mesa/main/teximage.c | 62 |
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, |