ilo: add image_init_gen6_transfer_layout()
It replaces img_init_for_transfer().
This commit is contained in:
parent
3c6af396f9
commit
b4c66e4d3e
|
@ -580,6 +580,25 @@ image_init_gen6_hardware_layout(const struct ilo_dev *dev,
|
||||||
return true;
|
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
|
static void
|
||||||
image_get_gen6_slice_size(const struct ilo_dev *dev,
|
image_get_gen6_slice_size(const struct ilo_dev *dev,
|
||||||
const struct ilo_image_info *info,
|
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);
|
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
|
static bool
|
||||||
image_get_gen6_layout(const struct ilo_dev *dev,
|
image_get_gen6_layout(const struct ilo_dev *dev,
|
||||||
const struct ilo_image_info *info,
|
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);
|
ILO_DEV_ASSERT(dev, 6, 8);
|
||||||
|
|
||||||
if (!image_init_gen6_hardware_layout(dev, info, layout))
|
if (image_bind_gpu(info) || info->level_count > 1) {
|
||||||
return false;
|
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
|
* 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;
|
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.
|
* 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)));
|
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(¶ms, 0, sizeof(params));
|
memset(¶ms, 0, sizeof(params));
|
||||||
params.dev = dev;
|
params.dev = dev;
|
||||||
params.info = info;
|
params.info = info;
|
||||||
|
|
Loading…
Reference in New Issue