freedreno: cleanup slice alignment/setup

Collapse things back into a setup_slices() which takes the desired
alignment as a param.  This gets things ready for a4xx which has some
slightly different requirements.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
Rob Clark 2014-12-04 16:56:33 -05:00
parent 8ecbcbf0aa
commit 5d7c9c9160
1 changed files with 14 additions and 36 deletions

View File

@ -188,7 +188,7 @@ static const struct u_resource_vtbl fd_resource_vtbl = {
}; };
static uint32_t static uint32_t
setup_slices(struct fd_resource *rsc) setup_slices(struct fd_resource *rsc, uint32_t alignment)
{ {
struct pipe_resource *prsc = &rsc->base.b; struct pipe_resource *prsc = &rsc->base.b;
uint32_t level, size = 0; uint32_t level, size = 0;
@ -201,7 +201,7 @@ setup_slices(struct fd_resource *rsc)
slice->pitch = align(width, 32); slice->pitch = align(width, 32);
slice->offset = size; slice->offset = size;
slice->size0 = slice->pitch * height * rsc->cpp; slice->size0 = align(slice->pitch * height * rsc->cpp, alignment);
size += slice->size0 * depth * prsc->array_size; size += slice->size0 * depth * prsc->array_size;
@ -213,33 +213,20 @@ setup_slices(struct fd_resource *rsc)
return size; return size;
} }
/* 2d array and 3d textures seem to want their layers aligned to
* page boundaries
*/
static uint32_t static uint32_t
setup_slices_array(struct fd_resource *rsc) slice_alignment(struct pipe_screen *pscreen, const struct pipe_resource *tmpl)
{ {
struct pipe_resource *prsc = &rsc->base.b; /* on a3xx, 2d array and 3d textures seem to want their
uint32_t level, size = 0; * layers aligned to page boundaries:
uint32_t width = prsc->width0; */
uint32_t height = prsc->height0; switch (tmpl->target) {
uint32_t depth = prsc->depth0; case PIPE_TEXTURE_3D:
case PIPE_TEXTURE_1D_ARRAY:
for (level = 0; level <= prsc->last_level; level++) { case PIPE_TEXTURE_2D_ARRAY:
struct fd_resource_slice *slice = fd_resource_slice(rsc, level); return 4096;
default:
slice->pitch = align(width, 32); return 1;
slice->offset = size;
slice->size0 = align(slice->pitch * height * rsc->cpp, 4096);
size += slice->size0 * depth * prsc->array_size;
width = u_minify(width, 1);
height = u_minify(height, 1);
depth = u_minify(depth, 1);
} }
return size;
} }
/** /**
@ -273,16 +260,7 @@ fd_resource_create(struct pipe_screen *pscreen,
assert(rsc->cpp); assert(rsc->cpp);
switch (tmpl->target) { size = setup_slices(rsc, slice_alignment(pscreen, tmpl));
case PIPE_TEXTURE_3D:
case PIPE_TEXTURE_1D_ARRAY:
case PIPE_TEXTURE_2D_ARRAY:
size = setup_slices_array(rsc);
break;
default:
size = setup_slices(rsc);
break;
}
realloc_bo(rsc, size); realloc_bo(rsc, size);
if (!rsc->bo) if (!rsc->bo)