ilo: add image_init_gen6_transfer_layout()

It replaces img_init_for_transfer().
This commit is contained in:
Chia-I Wu 2015-06-29 16:51:46 +08:00
parent 3c6af396f9
commit b4c66e4d3e
1 changed files with 37 additions and 75 deletions

View File

@ -580,6 +580,25 @@ image_init_gen6_hardware_layout(const struct ilo_dev *dev,
return true;
}
static bool
image_init_gen6_transfer_layout(const struct ilo_dev *dev,
const struct ilo_image_info *info,
struct ilo_image_layout *layout)
{
ILO_DEV_ASSERT(dev, 6, 8);
/* we can define our own layout to save space */
layout->walk = ILO_IMAGE_WALK_LOD;
layout->interleaved_samples = false;
layout->valid_tilings = IMAGE_TILING_NONE;
layout->tiling = GEN6_TILING_NONE;
layout->aux = ILO_IMAGE_AUX_NONE;
layout->align_i = info->block_width;
layout->align_j = info->block_height;
return true;
}
static void
image_get_gen6_slice_size(const struct ilo_dev *dev,
const struct ilo_image_info *info,
@ -921,6 +940,17 @@ image_get_gen6_lods(const struct ilo_dev *dev,
image_get_gen6_monolithic_size(dev, info, layout, max_x, max_y);
}
static bool
image_bind_gpu(const struct ilo_image_info *info)
{
return (info->bind_surface_sampler ||
info->bind_surface_dp_render ||
info->bind_surface_dp_typed ||
info->bind_zs ||
info->bind_scanout ||
info->bind_cursor);
}
static bool
image_get_gen6_layout(const struct ilo_dev *dev,
const struct ilo_image_info *info,
@ -928,8 +958,13 @@ image_get_gen6_layout(const struct ilo_dev *dev,
{
ILO_DEV_ASSERT(dev, 6, 8);
if (!image_init_gen6_hardware_layout(dev, info, layout))
return false;
if (image_bind_gpu(info) || info->level_count > 1) {
if (!image_init_gen6_hardware_layout(dev, info, layout))
return false;
} else {
if (!image_init_gen6_transfer_layout(dev, info, layout))
return false;
}
/*
* the fact that align i and j are multiples of block width and height
@ -1421,71 +1456,6 @@ img_init(struct ilo_image *img,
return true;
}
/**
* The texutre is for transfer only. We can define our own layout to save
* space.
*/
static void
img_init_for_transfer(struct ilo_image *img,
const struct ilo_dev *dev,
const struct ilo_image_info *info)
{
const unsigned num_layers = (info->type == GEN6_SURFTYPE_3D) ?
info->depth : info->array_size;
unsigned layer_width, layer_height;
assert(info->level_count == 1);
assert(info->sample_count == 1);
img->aux.type = ILO_IMAGE_AUX_NONE;
img->type = info->type;
img->width0 = info->width;
img->height0 = info->height;
img->depth0 = info->depth;
img->array_size = info->array_size;
img->level_count = 1;
img->sample_count = 1;
img->format = info->format;
img->block_width = info->block_width;
img->block_height = info->block_height;
img->block_size = info->block_size;
img->walk = ILO_IMAGE_WALK_LOD;
img->tiling = GEN6_TILING_NONE;
img->align_i = img->block_width;
img->align_j = img->block_height;
assert(util_is_power_of_two(img->block_width) &&
util_is_power_of_two(img->block_height));
/* use packed layout */
layer_width = align(info->width, img->align_i);
layer_height = align(info->height, img->align_j);
img->lods[0].slice_width = layer_width;
img->lods[0].slice_height = layer_height;
img->bo_stride = (layer_width / img->block_width) * img->block_size;
img->bo_stride = align(img->bo_stride, 64);
img->bo_height = (layer_height / img->block_height) * num_layers;
}
static bool
img_is_bind_gpu(const struct ilo_image_info *info)
{
return (info->bind_surface_sampler ||
info->bind_surface_dp_render ||
info->bind_surface_dp_typed ||
info->bind_zs ||
info->bind_scanout ||
info->bind_cursor);
}
/**
* Initialize the image. Callers should zero-initialize \p img first.
*/
@ -1498,14 +1468,6 @@ ilo_image_init(struct ilo_image *img,
assert(ilo_is_zeroed(img, sizeof(*img)));
/* use transfer layout when the texture is never bound to GPU */
if (!img_is_bind_gpu(info) &&
info->level_count == 1 &&
info->sample_count == 1) {
img_init_for_transfer(img, dev, info);
return true;
}
memset(&params, 0, sizeof(params));
params.dev = dev;
params.info = info;