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:
parent
8ecbcbf0aa
commit
5d7c9c9160
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue