[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