[Mesa-dev] [PATCH 2/2] mesa: Implement compressed 2D array textures.

Jordan Justen jljusten at gmail.com
Mon Dec 31 12:13:35 PST 2012


Series Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>

On Mon, Dec 31, 2012 at 11:18 AM, Paul Berry <stereotype441 at gmail.com> wrote:
> This patch adds functionality to Mesa to upload compressed
> 2-dimensional array textures, using the glCompressedTexImage3D and
> glCompressedTexSubImage3D calls.
>
> Fixes piglit tests "EXT_texture_array/compressed *" and "!OpenGL ES
> 3.0/ext_texture_array-compressed_gles3 *".  Also partially fixes GLES3
> conformance test "CoverageES30.test".
> ---
>
> Note that in order for the piglit tests "!OpenGL ES
> 3.0/ext_texture_array-compressed_gles3 *" to pass, patch "i965: Fix
> glCompressedTexSubImage2D offsets for ETC textures." also needs to be
> applied.
>
>  src/mesa/main/teximage.c | 16 +++++++++-----
>  src/mesa/main/texstore.c | 54 ++++++++++++++++++++++++++----------------------
>  2 files changed, 40 insertions(+), 30 deletions(-)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 7a0d944..33f81a2 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -3507,7 +3507,8 @@ compressed_subtexture_error_check(struct gl_context *ctx, GLint dims,
>     GLint expectedSize;
>     GLboolean targetOK;
>
> -   if (dims == 2) {
> +   switch (dims) {
> +   case 2:
>        switch (target) {
>        case GL_TEXTURE_2D:
>        case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
> @@ -3520,12 +3521,17 @@ compressed_subtexture_error_check(struct gl_context *ctx, GLint dims,
>           break;
>        default:
>           targetOK = GL_FALSE;
> +         break;
>        }
> -   }
> -   else {
> -      assert(dims == 1 || dims == 3);
> -      /* no 1D or 3D compressed textures at this time */
> +      break;
> +   case 3:
> +      targetOK = (target == GL_TEXTURE_2D_ARRAY);
> +      break;
> +   default:
> +      assert(dims == 1);
> +      /* no 1D compressed textures at this time */
>        targetOK = GL_FALSE;
> +      break;
>     }
>
>     if (!targetOK) {
> diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
> index 8669898..7511509 100644
> --- a/src/mesa/main/texstore.c
> +++ b/src/mesa/main/texstore.c
> @@ -4441,9 +4441,9 @@ _mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims,
>                                  struct gl_texture_image *texImage,
>                                  GLsizei imageSize, const GLvoid *data)
>  {
> -   /* only 2D compressed images are supported at this time */
> -   if (dims != 2) {
> -      _mesa_problem(ctx, "Unexpected glCompressedTexImage1D/3D call");
> +   /* only 2D and 3D compressed images are supported at this time */
> +   if (dims == 1) {
> +      _mesa_problem(ctx, "Unexpected glCompressedTexImage1D call");
>        return;
>     }
>
> @@ -4454,11 +4454,11 @@ _mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims,
>     ASSERT(texImage);
>     ASSERT(texImage->Width > 0);
>     ASSERT(texImage->Height > 0);
> -   ASSERT(texImage->Depth == 1);
> +   ASSERT(texImage->Depth > 0);
>
>     /* allocate storage for texture data */
>     if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) {
> -      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
> +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage%uD", dims);
>        return;
>     }
>
> @@ -4487,9 +4487,10 @@ _mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims,
>     const GLubyte *src;
>     const gl_format texFormat = texImage->TexFormat;
>     GLuint bw, bh;
> +   GLuint slice;
>
> -   if (dims != 2) {
> -      _mesa_problem(ctx, "Unexpected 1D/3D compressed texsubimage call");
> +   if (dims == 1) {
> +      _mesa_problem(ctx, "Unexpected 1D compressed texsubimage call");
>        return;
>     }
>
> @@ -4505,27 +4506,30 @@ _mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims,
>     srcRowStride = _mesa_format_row_stride(texFormat, width);
>     src = (const GLubyte *) data;
>
> -   /* Map dest texture buffer */
> -   ctx->Driver.MapTextureImage(ctx, texImage, 0,
> -                               xoffset, yoffset, width, height,
> -                               GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT,
> -                               &dstMap, &dstRowStride);
> +   for (slice = 0; slice < depth; slice++) {
> +      /* Map dest texture buffer */
> +      ctx->Driver.MapTextureImage(ctx, texImage, slice + zoffset,
> +                                  xoffset, yoffset, width, height,
> +                                  GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT,
> +                                  &dstMap, &dstRowStride);
>
> -   if (dstMap) {
> -      bytesPerRow = srcRowStride;  /* bytes per row of blocks */
> -      rows = (height + bh - 1) / bh;  /* rows in blocks */
> +      if (dstMap) {
> +         bytesPerRow = srcRowStride;  /* bytes per row of blocks */
> +         rows = (height + bh - 1) / bh;  /* rows in blocks */
>
> -      /* copy rows of blocks */
> -      for (i = 0; i < rows; i++) {
> -         memcpy(dstMap, src, bytesPerRow);
> -         dstMap += dstRowStride;
> -         src += srcRowStride;
> -      }
> +         /* copy rows of blocks */
> +         for (i = 0; i < rows; i++) {
> +            memcpy(dstMap, src, bytesPerRow);
> +            dstMap += dstRowStride;
> +            src += srcRowStride;
> +         }
>
> -      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
> -   }
> -   else {
> -      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
> +         ctx->Driver.UnmapTextureImage(ctx, texImage, slice + zoffset);
> +      }
> +      else {
> +         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage%uD",
> +                     dims);
> +      }
>     }
>
>     _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
> --
> 1.8.0.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list