Other than the nit below, this patch is Reviewed-by: Ian Romanick <ian.d.roman...@intel.com>
On 06/01/2014 11:29 PM, Chris Forbes wrote: > Signed-off-by: Chris Forbes <chr...@ijw.co.nz> > --- > src/mesa/main/texgetimage.c | 10 +++++++++- > src/mesa/main/teximage.c | 45 > +++++++++++++++++++++++++++++++++++++++++++++ > src/mesa/main/teximage.h | 6 ++++++ > 3 files changed, 60 insertions(+), 1 deletion(-) > > diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c > index 1ac707d..c22fb9b 100644 > --- a/src/mesa/main/texgetimage.c > +++ b/src/mesa/main/texgetimage.c > @@ -963,7 +963,7 @@ getcompressedteximage_error_check(struct gl_context *ctx, > GLenum target, > struct gl_texture_object *texObj; > struct gl_texture_image *texImage; > const GLint maxLevels = _mesa_max_texture_levels(ctx, target); > - GLuint compressedSize; > + GLuint compressedSize, dimensions; > > if (!legal_getteximage_target(ctx, target)) { > _mesa_error(ctx, GL_INVALID_ENUM, > "glGetCompressedTexImage(target=0x%x)", > @@ -1004,6 +1004,14 @@ getcompressedteximage_error_check(struct gl_context > *ctx, GLenum target, > texImage->Height, > texImage->Depth); > > + /* Check for invalid pixel storage modes */ > + dimensions = _mesa_get_texture_dimensions(texImage->TexObject->Target); > + if (!_mesa_compressed_texture_pixel_storage_error_check(ctx, dimensions, > + &ctx->Pack, > + > "glGetCompressedTexImageARB")) { > + return GL_TRUE; > + } > + > if (!_mesa_is_bufferobj(ctx->Pack.BufferObj)) { > /* do bounds checking on writing to client memory */ > if (clientMemSize < (GLsizei) compressedSize) { > diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c > index 5058b39..be153b4 100644 > --- a/src/mesa/main/teximage.c > +++ b/src/mesa/main/teximage.c > @@ -2242,6 +2242,36 @@ texture_error_check( struct gl_context *ctx, > } > > > +GLboolean Since this isn't visible to the client, use bool. > +_mesa_compressed_texture_pixel_storage_error_check(struct gl_context *ctx, > + GLint dimensions, > + struct gl_pixelstore_attrib > *packing, > + const char *caller) > +{ > + if (!_mesa_is_desktop_gl(ctx) || !packing->CompressedBlockSize) > + return GL_TRUE; > + > + if (packing->CompressedBlockWidth && packing->SkipPixels % > packing->CompressedBlockWidth) { > + _mesa_error(ctx, GL_INVALID_OPERATION, > + "%s(skip-pixels %% block-width)", caller); > + return GL_FALSE; > + } > + > + if (dimensions > 1 && packing->CompressedBlockHeight && packing->SkipRows > % packing->CompressedBlockHeight) { > + _mesa_error(ctx, GL_INVALID_OPERATION, > + "%s(skip-rows %% block-height)", caller); > + return GL_FALSE; > + } > + > + if (dimensions > 2 && packing->CompressedBlockDepth && > packing->SkipImages % packing->CompressedBlockDepth) { > + _mesa_error(ctx, GL_INVALID_OPERATION, > + "%s(skip-images %% block-depth)", caller); > + return GL_FALSE; > + } > + > + return GL_TRUE; > +} > + > /** > * Error checking for glCompressedTexImage[123]D(). > * Note that the width, height and depth values are not fully error checked > @@ -2343,6 +2373,13 @@ compressed_texture_error_check(struct gl_context *ctx, > GLint dimensions, > goto error; > } > > + /* Check for invalid pixel storage modes */ > + if (!_mesa_compressed_texture_pixel_storage_error_check(ctx, dimensions, > + &ctx->Unpack, > + > "glCompressedTexImage")) { > + return GL_FALSE; > + } > + > /* check image size in bytes */ > if (expectedSize != imageSize) { > /* Per GL_ARB_texture_compression: GL_INVALID_VALUE is generated [...] > @@ -3862,6 +3899,14 @@ compressed_subtexture_error_check(struct gl_context > *ctx, GLint dims, > return GL_TRUE; > } > > + /* Check for invalid pixel storage modes */ > + if (!_mesa_compressed_texture_pixel_storage_error_check(ctx, dims, > + &ctx->Unpack, > + > "glCompressedTexSubImage")) { > + return GL_FALSE; > + } > + > + > expectedSize = compressed_tex_size(width, height, depth, format); > if (expectedSize != imageSize) { > _mesa_error(ctx, GL_INVALID_VALUE, > "glCompressedTexSubImage%uD(size=%d)", > diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h > index 51d94d1..3021c1e 100644 > --- a/src/mesa/main/teximage.h > +++ b/src/mesa/main/teximage.h > @@ -326,6 +326,12 @@ _mesa_TexStorage3DMultisample(GLenum target, GLsizei > samples, > GLsizei height, GLsizei depth, > GLboolean fixedsamplelocations); > > +GLboolean > +_mesa_compressed_texture_pixel_storage_error_check(struct gl_context *ctx, > + GLint dimensions, > + struct gl_pixelstore_attrib > *packing, > + const char *caller); > + > /*@}*/ > > #ifdef __cplusplus > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev