diff options
author | Alyssa Rosenzweig <[email protected]> | 2020-04-30 18:48:53 -0400 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-05-01 00:27:23 +0000 |
commit | bde19c0e7ba575f3c8ca8ea76c916034264a8713 (patch) | |
tree | ef2e4d28774402399f5fa0dde623fd657ed76e3e | |
parent | bbecbedb4cae6ea646a2a387378daa086b0a9bde (diff) |
panfrost: Fix tiled texture "stride"s on Bifrost
They're not real strides like linear textures but the hw does use them
so we do have to get it right annoyingly.
Signed-off-by: Alyssa Rosenzweig <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4844>
-rw-r--r-- | src/panfrost/encoder/pan_texture.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/src/panfrost/encoder/pan_texture.c b/src/panfrost/encoder/pan_texture.c index fe13a03eec4..3f5d26680a7 100644 --- a/src/panfrost/encoder/pan_texture.c +++ b/src/panfrost/encoder/pan_texture.c @@ -166,6 +166,24 @@ panfrost_estimate_texture_payload_size( return sizeof(mali_ptr) * elements; } +/* Bifrost requires a tile stride for tiled textures. This stride is computed + * as (16 * bpp * width) assuming there is at least one tile (width >= 16). + * Otherwise if width < 16, the blob puts zero. Interactions with AFBC are + * currently unknown. + */ + +static unsigned +panfrost_nonlinear_stride(enum mali_texture_layout layout, + unsigned bytes_per_pixel, + unsigned width) +{ + if (layout == MALI_TEXTURE_TILED) { + return (width < 16) ? 0 : (16 * bytes_per_pixel * width); + } else { + unreachable("TODO: AFBC on Bifrost"); + } +} + static void panfrost_emit_texture_payload( mali_ptr *payload, @@ -173,6 +191,7 @@ panfrost_emit_texture_payload( enum mali_format mali_format, enum mali_texture_type type, enum mali_texture_layout layout, + unsigned width, unsigned first_level, unsigned last_level, unsigned first_layer, unsigned last_layer, unsigned cube_stride, @@ -201,8 +220,13 @@ panfrost_emit_texture_payload( slices, type == MALI_TEX_3D, cube_stride, l, w * face_mult + f); - if (manual_stride) - payload[idx++] = slices[l].stride; + if (manual_stride) { + payload[idx++] = (layout == MALI_TEXTURE_LINEAR) ? + slices[l].stride : + panfrost_nonlinear_stride(layout, + MAX2(desc->block.bits / 8, 1), + u_minify(width, l)); + } } } } @@ -261,6 +285,7 @@ panfrost_new_texture( mali_format, type, layout, + width, first_level, last_level, first_layer, last_layer, cube_stride, @@ -290,19 +315,17 @@ panfrost_new_texture_bifrost( enum mali_format mali_format = panfrost_find_format(desc); - /* Apparently it's always needed in Bifrost? */ - bool manual_stride = true; - panfrost_emit_texture_payload( (mali_ptr *) payload->cpu, desc, mali_format, type, layout, + width, first_level, last_level, first_layer, last_layer, cube_stride, - manual_stride, + true, /* Stride explicit on Bifrost */ base, slices); |