panfrost: Add extra info to the pan_image_layout struct

This means duplicating some of the bits we already have in the
pipe_resource object embedded in panfrost_resource, but if will also
allow us to move some code out of the gallium driver without requiring
copy those fields every time we call a generic helper.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10033>
This commit is contained in:
Boris Brezillon
2021-03-25 16:31:19 +01:00
committed by Marge Bot
parent efcb1e494b
commit cfe9bca912
4 changed files with 29 additions and 18 deletions

View File

@@ -820,17 +820,12 @@ panfrost_load_surface(struct panfrost_batch *batch, struct pipe_surface *surf, u
panfrost_translate_texture_dimension(rsrc->base.target);
struct pan_image img = {
.width0 = rsrc->base.width0,
.height0 = rsrc->base.height0,
.depth0 = rsrc->base.depth0,
.format = format,
.dim = dim,
.array_size = rsrc->base.array_size,
.first_level = level,
.last_level = level,
.first_layer = surf->u.tex.first_layer,
.last_layer = surf->u.tex.last_layer,
.nr_samples = rsrc->base.nr_samples,
.bo = rsrc->bo,
.layout = &rsrc->layout,
};

View File

@@ -86,6 +86,12 @@ panfrost_resource_from_handle(struct pipe_screen *pscreen,
rsc->modifier_constant = true;
rsc->layout.slices[0].line_stride = whandle->stride;
rsc->layout.slices[0].row_stride = whandle->stride;
rsc->layout.width = prsc->width0;
rsc->layout.height = prsc->height0;
rsc->layout.depth = prsc->depth0;
rsc->layout.nr_samples = prsc->nr_samples;
rsc->layout.array_size = prsc->array_size;
rsc->layout.data_size = rsc->bo->size;
if (rsc->layout.modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED ||
drm_is_afbc(rsc->layout.modifier)) {
@@ -341,6 +347,11 @@ panfrost_setup_layout(struct panfrost_device *dev,
unsigned depth = res->depth0;
unsigned bytes_per_pixel = util_format_get_blocksize(pres->layout.format);
pres->layout.width = width;
pres->layout.height = height;
pres->layout.depth = height;
pres->layout.array_size = res->array_size;
/* Z32_S8X24 variants are actually stored in 2 planes (one per
* component), we have to adjust the bytes_per_pixel value accordingly.
*/
@@ -352,6 +363,7 @@ panfrost_setup_layout(struct panfrost_device *dev,
* sample #, horrifyingly enough */
unsigned nr_samples = MAX2(res->nr_samples, 1);
pres->layout.nr_samples = nr_samples;
assert(depth == 1 || nr_samples == 1);
@@ -472,8 +484,10 @@ panfrost_setup_layout(struct panfrost_device *dev,
/* Arrays and cubemaps have the entire miptree duplicated */
pres->layout.array_stride = ALIGN_POT(offset, 64);
pres->layout.data_size =
ALIGN_POT(pres->layout.array_stride * res->array_size, 4096);
if (bo_size)
*bo_size = ALIGN_POT(pres->layout.array_stride * res->array_size, 4096);
*bo_size = pres->layout.data_size;
}
static inline bool

View File

@@ -214,8 +214,8 @@ panfrost_load_emit_viewport(struct pan_pool *pool, struct MALI_DRAW *draw,
struct pan_image *image)
{
struct panfrost_ptr t = panfrost_pool_alloc_desc(pool, VIEWPORT);
unsigned width = u_minify(image->width0, image->first_level);
unsigned height = u_minify(image->height0, image->first_level);
unsigned width = u_minify(image->layout->width, image->first_level);
unsigned height = u_minify(image->layout->height, image->first_level);
pan_pack(t.cpu, VIEWPORT, cfg) {
cfg.scissor_maximum_x = width - 1; /* Inclusive */
@@ -236,7 +236,7 @@ panfrost_load_prepare_rsd(struct pan_pool *pool, struct MALI_RENDERER_STATE *sta
(util_format_is_pure_uint(image->format)) ? PAN_BLIT_UINT :
(util_format_is_pure_sint(image->format)) ? PAN_BLIT_INT :
PAN_BLIT_FLOAT;
bool ms = image->nr_samples > 1;
bool ms = image->layout->nr_samples > 1;
const struct pan_blit_shader *shader =
&pool->dev->blit_shaders.loads[loc][T][ms];
@@ -311,7 +311,7 @@ midgard_load_emit_texture(struct pan_pool *pool, struct MALI_DRAW *draw,
struct panfrost_ptr texture =
panfrost_pool_alloc_desc_aggregate(pool,
PAN_DESC(MIDGARD_TEXTURE),
PAN_DESC_ARRAY(MAX2(image->nr_samples, 1),
PAN_DESC_ARRAY(image->layout->nr_samples,
SURFACE_WITH_STRIDE));
struct panfrost_ptr payload = {
@@ -337,11 +337,11 @@ midgard_load_emit_texture(struct pan_pool *pool, struct MALI_DRAW *draw,
};
panfrost_new_texture(pool->dev, image->layout, texture.cpu,
image->width0, image->height0, 1, 1,
image->layout->width, image->layout->height, 1, 1,
image->format, MALI_TEXTURE_DIMENSION_2D,
image->first_level, image->last_level,
0, 0,
image->nr_samples,
image->layout->nr_samples,
swizzle,
image->bo->ptr.gpu + offset, &payload);
@@ -494,7 +494,7 @@ bifrost_load_emit_texture(struct pan_pool *pool, struct MALI_DRAW *draw,
struct panfrost_ptr texture =
panfrost_pool_alloc_desc_aggregate(pool,
PAN_DESC(BIFROST_TEXTURE),
PAN_DESC_ARRAY(MAX2(image->nr_samples, 1),
PAN_DESC_ARRAY(image->layout->nr_samples,
SURFACE_WITH_STRIDE));
struct panfrost_ptr sampler =
panfrost_pool_alloc_desc(pool, BIFROST_SAMPLER);
@@ -512,11 +512,11 @@ bifrost_load_emit_texture(struct pan_pool *pool, struct MALI_DRAW *draw,
};
panfrost_new_texture(pool->dev, image->layout, texture.cpu,
image->width0, image->height0, 1, 1,
image->layout->width, image->layout->height, 1, 1,
image->format, MALI_TEXTURE_DIMENSION_2D,
image->first_level, image->last_level,
0, 0,
image->nr_samples,
image->layout->nr_samples,
swizzle,
image->bo->ptr.gpu + offset, &payload);
@@ -620,7 +620,7 @@ bifrost_load_emit_rsd(struct pan_pool *pool, struct MALI_DRAW *draw,
}
cfg.properties.bifrost.allow_forward_pixel_to_kill = true;
cfg.preload.fragment.coverage = true;
cfg.preload.fragment.sample_mask_id = image->nr_samples > 1;
cfg.preload.fragment.sample_mask_id = image->layout->nr_samples > 1;
}
for (unsigned i = 0; i < 8; ++i) {

View File

@@ -75,9 +75,13 @@ struct pan_image_slice_layout {
struct pan_image_layout {
uint64_t modifier;
enum pipe_format format;
unsigned width, height, depth;
unsigned nr_samples;
enum mali_texture_dimension dim;
struct pan_image_slice_layout slices[MAX_MIP_LEVELS];
unsigned array_size;
unsigned array_stride;
unsigned data_size;
};
struct pan_image_slice_state {
@@ -94,12 +98,10 @@ struct pan_image_state {
struct pan_image {
/* Format and size */
uint16_t width0, height0, depth0, array_size;
enum pipe_format format;
enum mali_texture_dimension dim;
unsigned first_level, last_level;
unsigned first_layer, last_layer;
unsigned nr_samples;
struct panfrost_bo *bo;
const struct pan_image_layout *layout;
};