Series Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>
On Mon, Dec 31, 2012 at 11:18 AM, Paul Berry <stereotype...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev