mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
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:
parent
261ee4d907
commit
7c0323296e
2 changed files with 40 additions and 30 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue