st/mesa: fix CopyTexSubImage fallback for 1D array textures

- We should use a 3D transfer of size Width x 1 x NumLayers.
- We should use layer_stride instead of stride.
  (even though they are likely to be equal with 1D array textures)

Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Marek Olšák 2012-12-20 15:15:15 +01:00
parent 85cb4f299d
commit ed86809ac9
3 changed files with 42 additions and 17 deletions

View file

@ -201,7 +201,7 @@ st_MapTextureImage(struct gl_context *ctx,
if (mode & GL_MAP_INVALIDATE_RANGE_BIT)
pipeMode |= PIPE_TRANSFER_DISCARD_RANGE;
map = st_texture_image_map(st, stImage, slice, pipeMode, x, y, w, h);
map = st_texture_image_map(st, stImage, pipeMode, x, y, slice, w, h, 1);
if (map) {
*mapOut = map;
*rowStrideOut = stImage->transfer->stride;
@ -762,6 +762,9 @@ fallback_copy_texsubimage(struct gl_context *ctx,
GLvoid *texDest;
enum pipe_transfer_usage transfer_usage;
void *map;
unsigned dst_width = width;
unsigned dst_height = height;
unsigned dst_depth = 1;
if (ST_DEBUG & DEBUG_FALLBACK)
debug_printf("%s: fallback processing\n", __FUNCTION__);
@ -770,6 +773,14 @@ fallback_copy_texsubimage(struct gl_context *ctx,
srcY = strb->Base.Height - srcY - height;
}
if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) {
/* Move y/height to z/depth for 1D array textures. */
destZ = destY;
destY = 0;
dst_depth = dst_height;
dst_height = 1;
}
map = pipe_transfer_map(pipe,
strb->texture,
strb->rtt_level,
@ -785,9 +796,9 @@ fallback_copy_texsubimage(struct gl_context *ctx,
else
transfer_usage = PIPE_TRANSFER_WRITE;
/* XXX this used to ignore destZ param */
texDest = st_texture_image_map(st, stImage, destZ, transfer_usage,
destX, destY, width, height);
texDest = st_texture_image_map(st, stImage, transfer_usage,
destX, destY, destZ,
dst_width, dst_height, dst_depth);
if (baseFormat == GL_DEPTH_COMPONENT ||
baseFormat == GL_DEPTH_STENCIL) {
@ -815,8 +826,16 @@ fallback_copy_texsubimage(struct gl_context *ctx,
if (scaleOrBias) {
_mesa_scale_and_bias_depth_uint(ctx, width, data);
}
pipe_put_tile_z(stImage->transfer, texDest, 0, row, width, 1,
data);
if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) {
pipe_put_tile_z(stImage->transfer,
texDest + row*stImage->transfer->layer_stride,
0, 0, width, 1, data);
}
else {
pipe_put_tile_z(stImage->transfer, texDest, 0, row, width, 1,
data);
}
}
}
else {
@ -832,7 +851,7 @@ fallback_copy_texsubimage(struct gl_context *ctx,
if (tempSrc && texDest) {
const GLint dims = 2;
const GLint dstRowStride = stImage->transfer->stride;
GLint dstRowStride;
struct gl_texture_image *texImage = &stImage->base;
struct gl_pixelstore_attrib unpack = ctx->DefaultPacking;
@ -840,6 +859,13 @@ fallback_copy_texsubimage(struct gl_context *ctx,
unpack.Invert = GL_TRUE;
}
if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) {
dstRowStride = stImage->transfer->layer_stride;
}
else {
dstRowStride = stImage->transfer->stride;
}
/* get float/RGBA image from framebuffer */
/* XXX this usually involves a lot of int/float conversion.
* try to avoid that someday.

View file

@ -232,8 +232,9 @@ st_texture_match_image(const struct pipe_resource *pt,
*/
GLubyte *
st_texture_image_map(struct st_context *st, struct st_texture_image *stImage,
GLuint zoffset, enum pipe_transfer_usage usage,
GLuint x, GLuint y, GLuint w, GLuint h)
enum pipe_transfer_usage usage,
GLuint x, GLuint y, GLuint z,
GLuint w, GLuint h, GLuint d)
{
struct st_texture_object *stObj =
st_texture_object(stImage->base.TexObject);
@ -249,9 +250,9 @@ st_texture_image_map(struct st_context *st, struct st_texture_image *stImage,
else
level = stImage->base.Level;
return pipe_transfer_map(st->pipe, stImage->pt, level,
stImage->base.Face + zoffset,
usage, x, y, w, h, &stImage->transfer);
return pipe_transfer_map_3d(st->pipe, stImage->pt, level, usage,
x, y, z + stImage->base.Face,
w, h, d, &stImage->transfer);
}

View file

@ -176,12 +176,10 @@ st_texture_match_image(const struct pipe_resource *pt,
* well.
*/
extern GLubyte *
st_texture_image_map(struct st_context *st,
struct st_texture_image *stImage,
GLuint zoffset,
st_texture_image_map(struct st_context *st, struct st_texture_image *stImage,
enum pipe_transfer_usage usage,
unsigned x, unsigned y,
unsigned w, unsigned h);
GLuint x, GLuint y, GLuint z,
GLuint w, GLuint h, GLuint d);
extern void
st_texture_image_unmap(struct st_context *st,