On Mon, Mar 17, 2014 at 6:24 PM, Roland Scheidegger <srol...@vmware.com> wrote: > Am 15.03.2014 18:17, schrieb Marek Olšák: >> From: Marek Olšák <marek.ol...@amd.com> >> >> This is needed by _mesa_generate_mipmap. >> >> This adds an array of pipe_transfers to st_texture_image. Each transfer is >> for mapping a single layer. It's ugly, but at least _mesa_generate_mipmap >> works for array textures. >> --- >> src/mesa/state_tracker/st_cb_texture.c | 24 +++++++++++++----------- >> src/mesa/state_tracker/st_texture.c | 24 +++++++++++++++++------- >> src/mesa/state_tracker/st_texture.h | 11 ++++++++--- >> 3 files changed, 38 insertions(+), 21 deletions(-) >> >> diff --git a/src/mesa/state_tracker/st_cb_texture.c >> b/src/mesa/state_tracker/st_cb_texture.c >> index f0bf374..e783973 100644 >> --- a/src/mesa/state_tracker/st_cb_texture.c >> +++ b/src/mesa/state_tracker/st_cb_texture.c >> @@ -192,6 +192,7 @@ st_MapTextureImage(struct gl_context *ctx, >> struct st_texture_image *stImage = st_texture_image(texImage); >> unsigned pipeMode; >> GLubyte *map; >> + struct pipe_transfer *transfer; >> >> pipeMode = 0x0; >> if (mode & GL_MAP_READ_BIT) >> @@ -201,10 +202,11 @@ 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, pipeMode, x, y, slice, w, h, 1); >> + map = st_texture_image_map(st, stImage, pipeMode, x, y, slice, w, h, 1, >> + &transfer); >> if (map) { >> *mapOut = map; >> - *rowStrideOut = stImage->transfer->stride; >> + *rowStrideOut = transfer->stride; >> } >> else { >> *mapOut = NULL; >> @@ -221,7 +223,7 @@ st_UnmapTextureImage(struct gl_context *ctx, >> { >> struct st_context *st = st_context(ctx); >> struct st_texture_image *stImage = st_texture_image(texImage); >> - st_texture_image_unmap(st, stImage); >> + st_texture_image_unmap(st, stImage, slice); >> } >> >> >> @@ -1146,6 +1148,7 @@ fallback_copy_texsubimage(struct gl_context *ctx, >> unsigned dst_width = width; >> unsigned dst_height = height; >> unsigned dst_depth = 1; >> + struct pipe_transfer *transfer; >> >> if (ST_DEBUG & DEBUG_FALLBACK) >> debug_printf("%s: fallback processing\n", __FUNCTION__); >> @@ -1171,7 +1174,8 @@ fallback_copy_texsubimage(struct gl_context *ctx, >> >> texDest = st_texture_image_map(st, stImage, transfer_usage, >> destX, destY, slice, >> - dst_width, dst_height, dst_depth); >> + dst_width, dst_height, dst_depth, >> + &transfer); >> >> if (baseFormat == GL_DEPTH_COMPONENT || >> baseFormat == GL_DEPTH_STENCIL) { >> @@ -1201,13 +1205,11 @@ fallback_copy_texsubimage(struct gl_context *ctx, >> } >> >> if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) { >> - pipe_put_tile_z(stImage->transfer, >> - texDest + >> row*stImage->transfer->layer_stride, >> + pipe_put_tile_z(transfer, texDest + >> row*transfer->layer_stride, >> 0, 0, width, 1, data); >> } >> else { >> - pipe_put_tile_z(stImage->transfer, texDest, 0, row, width, 1, >> - data); >> + pipe_put_tile_z(transfer, texDest, 0, row, width, 1, data); >> } >> } >> } >> @@ -1233,10 +1235,10 @@ fallback_copy_texsubimage(struct gl_context *ctx, >> } >> >> if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) { >> - dstRowStride = stImage->transfer->layer_stride; >> + dstRowStride = transfer->layer_stride; >> } >> else { >> - dstRowStride = stImage->transfer->stride; >> + dstRowStride = transfer->stride; >> } >> >> /* get float/RGBA image from framebuffer */ >> @@ -1269,7 +1271,7 @@ fallback_copy_texsubimage(struct gl_context *ctx, >> free(tempSrc); >> } >> >> - st_texture_image_unmap(st, stImage); >> + st_texture_image_unmap(st, stImage, slice); >> pipe->transfer_unmap(pipe, src_trans); >> } >> >> diff --git a/src/mesa/state_tracker/st_texture.c >> b/src/mesa/state_tracker/st_texture.c >> index b5ccc76..e867b80 100644 >> --- a/src/mesa/state_tracker/st_texture.c >> +++ b/src/mesa/state_tracker/st_texture.c >> @@ -240,11 +240,13 @@ GLubyte * >> st_texture_image_map(struct st_context *st, struct st_texture_image >> *stImage, >> enum pipe_transfer_usage usage, >> GLuint x, GLuint y, GLuint z, >> - GLuint w, GLuint h, GLuint d) >> + GLuint w, GLuint h, GLuint d, >> + struct pipe_transfer **transfer) >> { >> struct st_texture_object *stObj = >> st_texture_object(stImage->base.TexObject); >> GLuint level; >> + void *map; >> >> DBG("%s \n", __FUNCTION__); >> >> @@ -256,22 +258,30 @@ st_texture_image_map(struct st_context *st, struct >> st_texture_image *stImage, >> else >> level = stImage->base.Level; >> >> - return pipe_transfer_map_3d(st->pipe, stImage->pt, level, usage, >> - x, y, z + stImage->base.Face, >> - w, h, d, &stImage->transfer); >> + z += stImage->base.Face; >> + >> + map = pipe_transfer_map_3d(st->pipe, stImage->pt, level, usage, >> + x, y, z, w, h, d, transfer); >> + if (map) { >> + assert(!stImage->transfer[z]); >> + stImage->transfer[z] = *transfer; >> + } >> + return map; >> } >> >> >> void >> st_texture_image_unmap(struct st_context *st, >> - struct st_texture_image *stImage) >> + struct st_texture_image *stImage, unsigned slice) >> { >> struct pipe_context *pipe = st->pipe; >> + struct pipe_transfer **transfer = >> + &stImage->transfer[slice + stImage->base.Face]; >> >> DBG("%s\n", __FUNCTION__); >> >> - pipe_transfer_unmap(pipe, stImage->transfer); >> - stImage->transfer = NULL; >> + pipe_transfer_unmap(pipe, *transfer); >> + *transfer = NULL; >> } >> >> >> diff --git a/src/mesa/state_tracker/st_texture.h >> b/src/mesa/state_tracker/st_texture.h >> index bce2a09..7356dbf 100644 >> --- a/src/mesa/state_tracker/st_texture.h >> +++ b/src/mesa/state_tracker/st_texture.h >> @@ -56,7 +56,11 @@ struct st_texture_image >> */ >> struct pipe_resource *pt; >> >> - struct pipe_transfer *transfer; >> + /* XXX It's silly to have 16384 transfers here. It would be better >> + * XXX if MapTextureImage supported 3D mappings, so that we don't >> + * XXX have to map each slice separately. >> + * XXX _mesa_generate_mipmap would benefit from that. */ >> + struct pipe_transfer *transfer[MAX_ARRAY_TEXTURE_LAYERS]; >> > That indeed looks silly. Would it be difficult (and maybe even useful > for other places) to extend MapTextureImage() to deal with 3d mappings? > 1-5 looks good to me.
It wouldn't be difficult, but updating all the classic drivers would be annoying. I'm not interested in doing the rework at the moment. Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev