mesa: Implement compressed 2D array textures.

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".

Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
Paul Berry 2012-12-28 11:26:06 -08:00
parent 261ee4d907
commit 7c0323296e
2 changed files with 40 additions and 30 deletions

View file

@ -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) {

View file

@ -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, slice + zoffset);
}
else {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage%uD",
dims);
}
ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
}
else {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
}
_mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);