ilo: add image_get_gen6_monolithic_size()

It replaces img_align().
This commit is contained in:
Chia-I Wu 2015-06-29 16:38:49 +08:00
parent 0faeb21dc0
commit 0da3b732ad
1 changed files with 67 additions and 67 deletions

View File

@ -764,6 +764,72 @@ image_get_gen6_walk_layer_heights(const struct ilo_dev *dev,
layout->walk_layer_height += 4;
}
static void
image_get_gen6_monolithic_size(const struct ilo_dev *dev,
const struct ilo_image_info *info,
struct ilo_image_layout *layout,
int max_x, int max_y)
{
int align_w = 1, align_h = 1, pad_h = 0;
ILO_DEV_ASSERT(dev, 6, 8);
/*
* From the Sandy Bridge PRM, volume 1 part 1, page 118:
*
* "To determine the necessary padding on the bottom and right side of
* the surface, refer to the table in Section 7.18.3.4 for the i and j
* parameters for the surface format in use. The surface must then be
* extended to the next multiple of the alignment unit size in each
* dimension, and all texels contained in this extended surface must
* have valid GTT entries."
*
* "For cube surfaces, an additional two rows of padding are required
* at the bottom of the surface. This must be ensured regardless of
* whether the surface is stored tiled or linear. This is due to the
* potential rotation of cache line orientation from memory to cache."
*
* "For compressed textures (BC* and FXT1 surface formats), padding at
* the bottom of the surface is to an even compressed row, which is
* equal to a multiple of 8 uncompressed texel rows. Thus, for padding
* purposes, these surfaces behave as if j = 8 only for surface
* padding purposes. The value of 4 for j still applies for mip level
* alignment and QPitch calculation."
*/
if (info->bind_surface_sampler) {
align_w = MAX2(align_w, layout->align_i);
align_h = MAX2(align_h, layout->align_j);
if (info->type == GEN6_SURFTYPE_CUBE)
pad_h += 2;
if (info->compressed)
align_h = MAX2(align_h, layout->align_j * 2);
}
/*
* From the Sandy Bridge PRM, volume 1 part 1, page 118:
*
* "If the surface contains an odd number of rows of data, a final row
* below the surface must be allocated."
*/
if (info->bind_surface_dp_render)
align_h = MAX2(align_h, 2);
/*
* Depth Buffer Clear/Resolve works in 8x4 sample blocks. Pad to allow HiZ
* for unaligned non-mipmapped and non-array images.
*/
if (layout->aux == ILO_IMAGE_AUX_HIZ &&
info->level_count == 1 && info->array_size == 1 && info->depth == 1) {
align_w = MAX2(align_w, 8);
align_h = MAX2(align_h, 4);
}
layout->monolithic_width = align(max_x, align_w);
layout->monolithic_height = align(max_y + pad_h, align_h);
}
static void
image_get_gen6_lods(const struct ilo_dev *dev,
const struct ilo_image_info *info,
@ -852,8 +918,7 @@ image_get_gen6_lods(const struct ilo_dev *dev,
layout->walk_layer_height = 0;
}
layout->monolithic_width = max_x;
layout->monolithic_height = max_y;
image_get_gen6_monolithic_size(dev, info, layout, max_x, max_y);
}
static bool
@ -922,70 +987,6 @@ img_init_size_and_format(struct ilo_image *img,
img->sample_count = info->sample_count;
}
static void
img_align(struct ilo_image *img, struct ilo_image_params *params)
{
const struct ilo_image_info *info = params->info;
int align_w = 1, align_h = 1, pad_h = 0;
/*
* From the Sandy Bridge PRM, volume 1 part 1, page 118:
*
* "To determine the necessary padding on the bottom and right side of
* the surface, refer to the table in Section 7.18.3.4 for the i and j
* parameters for the surface format in use. The surface must then be
* extended to the next multiple of the alignment unit size in each
* dimension, and all texels contained in this extended surface must
* have valid GTT entries."
*
* "For cube surfaces, an additional two rows of padding are required
* at the bottom of the surface. This must be ensured regardless of
* whether the surface is stored tiled or linear. This is due to the
* potential rotation of cache line orientation from memory to cache."
*
* "For compressed textures (BC* and FXT1 surface formats), padding at
* the bottom of the surface is to an even compressed row, which is
* equal to a multiple of 8 uncompressed texel rows. Thus, for padding
* purposes, these surfaces behave as if j = 8 only for surface
* padding purposes. The value of 4 for j still applies for mip level
* alignment and QPitch calculation."
*/
if (info->bind_surface_sampler) {
align_w = MAX2(align_w, img->align_i);
align_h = MAX2(align_h, img->align_j);
if (info->type == GEN6_SURFTYPE_CUBE)
pad_h += 2;
if (info->compressed)
align_h = MAX2(align_h, img->align_j * 2);
}
/*
* From the Sandy Bridge PRM, volume 1 part 1, page 118:
*
* "If the surface contains an odd number of rows of data, a final row
* below the surface must be allocated."
*/
if (info->bind_surface_dp_render)
align_h = MAX2(align_h, 2);
/*
* Depth Buffer Clear/Resolve works in 8x4 sample blocks. Pad to allow HiZ
* for unaligned non-mipmapped and non-array images.
*/
if (img->aux.type == ILO_IMAGE_AUX_HIZ &&
info->level_count == 1 &&
info->array_size == 1 &&
info->depth == 1) {
align_w = MAX2(align_w, 8);
align_h = MAX2(align_h, 4);
}
params->max_x = align(params->max_x, align_w);
params->max_y = align(params->max_y + pad_h, align_h);
}
/* note that this may force the texture to be linear */
static void
img_calculate_bo_size(struct ilo_image *img,
@ -1419,7 +1420,6 @@ img_init(struct ilo_image *img,
params->h1 = layout.walk_layer_h1;
img->walk_layer_height = layout.walk_layer_height;
img_align(img, params);
img_calculate_bo_size(img, params);
img->scanout = params->info->bind_scanout;