mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 22:10:10 +01:00
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 <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4844>
This commit is contained in:
parent
bbecbedb4c
commit
bde19c0e7b
1 changed files with 29 additions and 6 deletions
|
|
@ -166,6 +166,24 @@ panfrost_estimate_texture_payload_size(
|
||||||
return sizeof(mali_ptr) * elements;
|
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
|
static void
|
||||||
panfrost_emit_texture_payload(
|
panfrost_emit_texture_payload(
|
||||||
mali_ptr *payload,
|
mali_ptr *payload,
|
||||||
|
|
@ -173,6 +191,7 @@ panfrost_emit_texture_payload(
|
||||||
enum mali_format mali_format,
|
enum mali_format mali_format,
|
||||||
enum mali_texture_type type,
|
enum mali_texture_type type,
|
||||||
enum mali_texture_layout layout,
|
enum mali_texture_layout layout,
|
||||||
|
unsigned width,
|
||||||
unsigned first_level, unsigned last_level,
|
unsigned first_level, unsigned last_level,
|
||||||
unsigned first_layer, unsigned last_layer,
|
unsigned first_layer, unsigned last_layer,
|
||||||
unsigned cube_stride,
|
unsigned cube_stride,
|
||||||
|
|
@ -201,8 +220,13 @@ panfrost_emit_texture_payload(
|
||||||
slices, type == MALI_TEX_3D,
|
slices, type == MALI_TEX_3D,
|
||||||
cube_stride, l, w * face_mult + f);
|
cube_stride, l, w * face_mult + f);
|
||||||
|
|
||||||
if (manual_stride)
|
if (manual_stride) {
|
||||||
payload[idx++] = slices[l].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,
|
mali_format,
|
||||||
type,
|
type,
|
||||||
layout,
|
layout,
|
||||||
|
width,
|
||||||
first_level, last_level,
|
first_level, last_level,
|
||||||
first_layer, last_layer,
|
first_layer, last_layer,
|
||||||
cube_stride,
|
cube_stride,
|
||||||
|
|
@ -290,19 +315,17 @@ panfrost_new_texture_bifrost(
|
||||||
|
|
||||||
enum mali_format mali_format = panfrost_find_format(desc);
|
enum mali_format mali_format = panfrost_find_format(desc);
|
||||||
|
|
||||||
/* Apparently it's always needed in Bifrost? */
|
|
||||||
bool manual_stride = true;
|
|
||||||
|
|
||||||
panfrost_emit_texture_payload(
|
panfrost_emit_texture_payload(
|
||||||
(mali_ptr *) payload->cpu,
|
(mali_ptr *) payload->cpu,
|
||||||
desc,
|
desc,
|
||||||
mali_format,
|
mali_format,
|
||||||
type,
|
type,
|
||||||
layout,
|
layout,
|
||||||
|
width,
|
||||||
first_level, last_level,
|
first_level, last_level,
|
||||||
first_layer, last_layer,
|
first_layer, last_layer,
|
||||||
cube_stride,
|
cube_stride,
|
||||||
manual_stride,
|
true, /* Stride explicit on Bifrost */
|
||||||
base,
|
base,
|
||||||
slices);
|
slices);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue