freedreno: Introduce a fd_resource_layer_stride() helper.

This factors out a bit of duplicated code, but will also make the shared
resource layout transition process clearer.

Acked-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
Eric Anholt 2019-11-20 12:55:56 -08:00
parent 9e9a26c768
commit 6b09227ede
2 changed files with 15 additions and 11 deletions

View file

@ -531,7 +531,7 @@ fd_resource_transfer_map(struct pipe_context *pctx,
ptrans->usage = usage; ptrans->usage = usage;
ptrans->box = *box; ptrans->box = *box;
ptrans->stride = util_format_get_nblocksx(format, slice->pitch) * rsc->cpp; ptrans->stride = util_format_get_nblocksx(format, slice->pitch) * rsc->cpp;
ptrans->layer_stride = rsc->layer_first ? rsc->layer_size : slice->size0; ptrans->layer_stride = fd_resource_layer_stride(rsc, level);
/* we always need a staging texture for tiled buffers: /* we always need a staging texture for tiled buffers:
* *
@ -550,8 +550,7 @@ fd_resource_transfer_map(struct pipe_context *pctx,
trans->staging_prsc = &staging_rsc->base; trans->staging_prsc = &staging_rsc->base;
trans->base.stride = util_format_get_nblocksx(format, trans->base.stride = util_format_get_nblocksx(format,
staging_slice->pitch) * staging_rsc->cpp; staging_slice->pitch) * staging_rsc->cpp;
trans->base.layer_stride = staging_rsc->layer_first ? trans->base.layer_stride = fd_resource_layer_stride(staging_rsc, 0);
staging_rsc->layer_size : staging_slice->size0;
trans->staging_box = *box; trans->staging_box = *box;
trans->staging_box.x = 0; trans->staging_box.x = 0;
trans->staging_box.y = 0; trans->staging_box.y = 0;
@ -667,8 +666,8 @@ fd_resource_transfer_map(struct pipe_context *pctx,
trans->staging_prsc = &staging_rsc->base; trans->staging_prsc = &staging_rsc->base;
trans->base.stride = util_format_get_nblocksx(format, trans->base.stride = util_format_get_nblocksx(format,
staging_slice->pitch) * staging_rsc->cpp; staging_slice->pitch) * staging_rsc->cpp;
trans->base.layer_stride = staging_rsc->layer_first ? trans->base.layer_stride =
staging_rsc->layer_size : staging_slice->size0; fd_resource_layer_stride(staging_rsc, 0);
trans->staging_box = *box; trans->staging_box = *box;
trans->staging_box.x = 0; trans->staging_box.x = 0;
trans->staging_box.y = 0; trans->staging_box.y = 0;

View file

@ -156,17 +156,22 @@ fd_resource_slice(struct fd_resource *rsc, unsigned level)
return &rsc->slices[level]; return &rsc->slices[level];
} }
static inline uint32_t
fd_resource_layer_stride(struct fd_resource *rsc, unsigned level)
{
if (rsc->layer_first)
return rsc->layer_size;
else
return fd_resource_slice(rsc, level)->size0;
}
/* get offset for specified mipmap level and texture/array layer */ /* get offset for specified mipmap level and texture/array layer */
static inline uint32_t static inline uint32_t
fd_resource_offset(struct fd_resource *rsc, unsigned level, unsigned layer) fd_resource_offset(struct fd_resource *rsc, unsigned level, unsigned layer)
{ {
struct fd_resource_slice *slice = fd_resource_slice(rsc, level); struct fd_resource_slice *slice = fd_resource_slice(rsc, level);
unsigned offset; unsigned offset = slice->offset;
if (rsc->layer_first) { offset += fd_resource_layer_stride(rsc, level) * layer;
offset = slice->offset + (rsc->layer_size * layer);
} else {
offset = slice->offset + (slice->size0 * layer);
}
debug_assert(offset < fd_bo_size(rsc->bo)); debug_assert(offset < fd_bo_size(rsc->bo));
return offset + rsc->offset; return offset + rsc->offset;
} }