mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-28 14:00:30 +01:00
mesa: When storing texture data for a 1D array, map each slice separately.
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
5324f9c48d
commit
229ebf511d
1 changed files with 51 additions and 15 deletions
|
|
@ -4626,22 +4626,53 @@ _mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
|
|||
return;
|
||||
}
|
||||
|
||||
/* Map dest texture buffer (write to whole region) */
|
||||
ctx->Driver.MapTextureImage(ctx, texImage, 0,
|
||||
0, 0, width, height,
|
||||
rwMode,
|
||||
&dstMap, &dstRowStride);
|
||||
assert(dstMap);
|
||||
success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
|
||||
texImage->TexFormat,
|
||||
dstMap,
|
||||
0, 0, 0, /* dstX/Y/Zoffset */
|
||||
dstRowStride,
|
||||
&zeroImageOffset,
|
||||
width, height, 1,
|
||||
format, type, pixels, packing);
|
||||
if (target == GL_TEXTURE_1D_ARRAY) {
|
||||
const GLint srcStride =
|
||||
_mesa_image_row_stride(packing, width, format, type);
|
||||
int y;
|
||||
|
||||
ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
|
||||
success = GL_TRUE;
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
/* Map dest texture buffer (write to whole region) */
|
||||
ctx->Driver.MapTextureImage(ctx, texImage, y,
|
||||
0, 0, width, 1,
|
||||
rwMode,
|
||||
&dstMap, &dstRowStride);
|
||||
assert(dstMap);
|
||||
success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
|
||||
texImage->TexFormat,
|
||||
dstMap,
|
||||
0, 0, 0, /* dstX/Y/Zoffset */
|
||||
dstRowStride,
|
||||
&zeroImageOffset,
|
||||
width, 1, 1,
|
||||
format, type, pixels, packing);
|
||||
ctx->Driver.UnmapTextureImage(ctx, texImage, y);
|
||||
|
||||
if (!success)
|
||||
break;
|
||||
|
||||
pixels += srcStride;
|
||||
}
|
||||
} else {
|
||||
/* Map dest texture buffer (write to whole region) */
|
||||
ctx->Driver.MapTextureImage(ctx, texImage, 0,
|
||||
0, 0, width, height,
|
||||
rwMode,
|
||||
&dstMap, &dstRowStride);
|
||||
assert(dstMap);
|
||||
success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
|
||||
texImage->TexFormat,
|
||||
dstMap,
|
||||
0, 0, 0, /* dstX/Y/Zoffset */
|
||||
dstRowStride,
|
||||
&zeroImageOffset,
|
||||
width, height, 1,
|
||||
format, type, pixels, packing);
|
||||
|
||||
ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
|
||||
}
|
||||
|
||||
if (!success)
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
|
||||
|
|
@ -4691,6 +4722,11 @@ _mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
|
|||
return;
|
||||
}
|
||||
|
||||
if (target == GL_TEXTURE_1D_ARRAY) {
|
||||
depth = height;
|
||||
height = 1;
|
||||
}
|
||||
|
||||
sliceMaps = (GLubyte **) malloc(depth * sizeof(GLubyte *));
|
||||
dstImageOffsets = (GLuint *) malloc(depth * sizeof(GLuint));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue