From d1033cd1eb11105730b423723bda5038787145c9 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Fri, 12 May 2017 10:36:54 +1000 Subject: [PATCH] mesa: add 3D support to compressed_tex_sub_image() helper MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Nicolai Hähnle --- src/mesa/main/teximage.c | 185 ++++++++++++++------------------------- 1 file changed, 66 insertions(+), 119 deletions(-) diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 887740ad35c..2f9ff309428 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -4532,9 +4532,10 @@ compressed_texture_sub_image(struct gl_context *ctx, GLuint dims, static ALWAYS_INLINE void compressed_tex_sub_image(unsigned dim, GLenum target, GLuint texture, GLint level, GLint xoffset, GLint yoffset, - GLsizei width, GLsizei height, - GLenum format, GLsizei imageSize, const GLvoid *data, - bool dsa, bool no_error, const char *caller) + GLint zoffset, GLsizei width, GLsizei height, + GLsizei depth, GLenum format, GLsizei imageSize, + const GLvoid *data, bool dsa, bool no_error, + const char *caller) { struct gl_texture_object *texObj; struct gl_texture_image *texImage; @@ -4567,18 +4568,53 @@ compressed_tex_sub_image(unsigned dim, GLenum target, GLuint texture, if (!no_error && compressed_subtexture_error_check(ctx, dim, texObj, target, level, - xoffset, yoffset, 0, width, height, - 1, format, + xoffset, yoffset, zoffset, width, + height, depth, format, imageSize, data, caller)) { return; } - texImage = _mesa_select_tex_image(texObj, target, level); - assert(texImage); + /* Must handle special case GL_TEXTURE_CUBE_MAP. */ + if (dim == 3 && dsa && texObj->Target == GL_TEXTURE_CUBE_MAP) { + const char *pixels = data; + GLint image_stride; + + /* Make sure the texture object is a proper cube. + * (See texturesubimage in teximage.c for details on why this check is + * performed.) + */ + if (!_mesa_cube_level_complete(texObj, level)) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glCompressedTextureSubImage3D(cube map incomplete)"); + return; + } + + /* Copy in each face. */ + for (int i = 0; i < 6; ++i) { + texImage = texObj->Image[i][level]; + assert(texImage); + + compressed_texture_sub_image(ctx, 3, texObj, texImage, + texObj->Target, level, xoffset, yoffset, + zoffset, width, height, 1, format, + imageSize, pixels); + + /* Compressed images don't have a client format */ + image_stride = _mesa_format_image_size(texImage->TexFormat, + texImage->Width, + texImage->Height, 1); + + pixels += image_stride; + imageSize -= image_stride; + } + } else { + texImage = _mesa_select_tex_image(texObj, target, level); + assert(texImage); - compressed_texture_sub_image(ctx, dim, texObj, texImage, target, level, - xoffset, yoffset, 0, width, height, 1, format, - imageSize, data); + compressed_texture_sub_image(ctx, dim, texObj, texImage, target, level, + xoffset, yoffset, zoffset, width, height, + depth, format, imageSize, data); + } } @@ -4588,8 +4624,8 @@ _mesa_CompressedTexSubImage1D_no_error(GLenum target, GLint level, GLenum format, GLsizei imageSize, const GLvoid *data) { - compressed_tex_sub_image(1, target, 0, level, xoffset, 0, width, 1, format, - imageSize, data, false, true, + compressed_tex_sub_image(1, target, 0, level, xoffset, 0, 0, width, + 1, 1, format, imageSize, data, false, true, "glCompressedTexSubImage1D"); } @@ -4599,8 +4635,8 @@ _mesa_CompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data) { - compressed_tex_sub_image(1, target, 0, level, xoffset, 0, width, 1, format, - imageSize, data, false, false, + compressed_tex_sub_image(1, target, 0, level, xoffset, 0, 0, width, 1, 1, + format, imageSize, data, false, false, "glCompressedTexSubImage1D"); } @@ -4611,7 +4647,7 @@ _mesa_CompressedTextureSubImage1D_no_error(GLuint texture, GLint level, GLenum format, GLsizei imageSize, const GLvoid *data) { - compressed_tex_sub_image(1, 0, texture, level, xoffset, 0, width, 1, + compressed_tex_sub_image(1, 0, texture, level, xoffset, 0, 0, width, 1, 1, format, imageSize, data, true, true, "glCompressedTextureSubImage1D"); } @@ -4622,7 +4658,7 @@ _mesa_CompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data) { - compressed_tex_sub_image(1, 0, texture, level, xoffset, 0, width, 1, + compressed_tex_sub_image(1, 0, texture, level, xoffset, 0, 0, width, 1, 1, format, imageSize, data, true, false, "glCompressedTextureSubImage1D"); } @@ -4634,8 +4670,8 @@ _mesa_CompressedTexSubImage2D_no_error(GLenum target, GLint level, GLenum format, GLsizei imageSize, const GLvoid *data) { - compressed_tex_sub_image(2, target, 0, level, xoffset, yoffset, width, - height, format, imageSize, data, false, true, + compressed_tex_sub_image(2, target, 0, level, xoffset, yoffset, 0, width, + height, 1, format, imageSize, data, false, true, "glCompressedTexSubImage2D"); } @@ -4646,8 +4682,8 @@ _mesa_CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLenum format, GLsizei imageSize, const GLvoid *data) { - compressed_tex_sub_image(2, target, 0, level, xoffset, yoffset, width, - height, format, imageSize, data, false, false, + compressed_tex_sub_image(2, target, 0, level, xoffset, yoffset, 0, width, + height, 1, format, imageSize, data, false, false, "glCompressedTexSubImage2D"); } @@ -4659,8 +4695,8 @@ _mesa_CompressedTextureSubImage2D_no_error(GLuint texture, GLint level, GLenum format, GLsizei imageSize, const GLvoid *data) { - compressed_tex_sub_image(2, 0, texture, level, xoffset, yoffset, width, - height, format, imageSize, data, true, true, + compressed_tex_sub_image(2, 0, texture, level, xoffset, yoffset, 0, width, + height, 1, format, imageSize, data, true, true, "glCompressedTextureSubImage2D"); } @@ -4672,8 +4708,8 @@ _mesa_CompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLenum format, GLsizei imageSize, const GLvoid *data) { - compressed_tex_sub_image(2, 0, texture, level, xoffset, yoffset, width, - height, format, imageSize, data, true, false, + compressed_tex_sub_image(2, 0, texture, level, xoffset, yoffset, 0, width, + height, 1, format, imageSize, data, true, false, "glCompressedTextureSubImage2D"); } @@ -4683,35 +4719,9 @@ _mesa_CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data) { - struct gl_texture_object *texObj; - struct gl_texture_image *texImage; - - GET_CURRENT_CONTEXT(ctx); - - if (compressed_subtexture_target_check(ctx, target, 3, format, false, - "glCompressedTexSubImage3D")) { - return; - } - - texObj = _mesa_get_current_tex_object(ctx, target); - if (!texObj) - return; - - if (compressed_subtexture_error_check(ctx, 3, texObj, target, - level, xoffset, yoffset, zoffset, - width, height, depth, - format, imageSize, data, - "glCompressedTexSubImage3D")) { - return; - } - - - texImage = _mesa_select_tex_image(texObj, target, level); - assert(texImage); - - compressed_texture_sub_image(ctx, 3, texObj, texImage, target, level, - xoffset, yoffset, zoffset, width, height, - depth, format, imageSize, data); + compressed_tex_sub_image(3, target, 0, level, xoffset, yoffset, zoffset, + width, height, depth, format, imageSize, data, + false, false, "glCompressedTexSubImage3D"); } void GLAPIENTRY @@ -4721,72 +4731,9 @@ _mesa_CompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLenum format, GLsizei imageSize, const GLvoid *data) { - struct gl_texture_object *texObj; - struct gl_texture_image *texImage; - - GET_CURRENT_CONTEXT(ctx); - - texObj = _mesa_lookup_texture_err(ctx, texture, - "glCompressedTextureSubImage3D"); - if (!texObj) - return; - - if (compressed_subtexture_target_check(ctx, texObj->Target, 3, format, true, - "glCompressedTextureSubImage3D")) { - return; - } - - if (compressed_subtexture_error_check(ctx, 3, texObj, texObj->Target, - level, xoffset, yoffset, zoffset, - width, height, depth, - format, imageSize, data, - "glCompressedTextureSubImage3D")) { - return; - } - - /* Must handle special case GL_TEXTURE_CUBE_MAP. */ - if (texObj->Target == GL_TEXTURE_CUBE_MAP) { - const char *pixels = data; - int i; - GLint image_stride; - - /* Make sure the texture object is a proper cube. - * (See texturesubimage in teximage.c for details on why this check is - * performed.) - */ - if (!_mesa_cube_level_complete(texObj, level)) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glCompressedTextureSubImage3D(cube map incomplete)"); - return; - } - - /* Copy in each face. */ - for (i = 0; i < 6; ++i) { - texImage = texObj->Image[i][level]; - assert(texImage); - - compressed_texture_sub_image(ctx, 3, texObj, texImage, - texObj->Target, level, xoffset, yoffset, - zoffset, width, height, 1, format, - imageSize, pixels); - - /* Compressed images don't have a client format */ - image_stride = _mesa_format_image_size(texImage->TexFormat, - texImage->Width, - texImage->Height, 1); - - pixels += image_stride; - imageSize -= image_stride; - } - } - else { - texImage = _mesa_select_tex_image(texObj, texObj->Target, level); - assert(texImage); - - compressed_texture_sub_image(ctx, 3, texObj, texImage, texObj->Target, - level, xoffset, yoffset, zoffset, width, - height, depth, format, imageSize, data); - } + compressed_tex_sub_image(3, 0, texture, level, xoffset, yoffset, zoffset, + width, height, depth, format, imageSize, data, + true, false, "glCompressedTextureSubImage3D"); } static mesa_format -- 2.30.2