summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2019-05-14 23:18:18 +0000
committerAlyssa Rosenzweig <[email protected]>2019-05-16 01:16:36 +0000
commit81b1053d9b4f6e39a10ba3db79b4225172a23187 (patch)
treed38d0c206b08fedc7dd85391da9e2110ddf0be87
parentcea935205919d825a3ff5287acd08f9832381168 (diff)
panfrost: Set custom stride for textures when necessary
From Gallium (and our) perspective, the stride of a BO is arbitrary. For internal buffers, we can make it something nice, but for imported linear buffers (e.g. EGL clients), we don't always have that luxury. To cope, we calculate the expected stride of a texture, compare it to the BO's actual reported stride, and if they differ, set the latter as a custom stride. Fixes rendering of windows not on tile boundaries (noticeable in Weston with es2gears_wayland, for instance). Also, this should fix stride issues with bufer reloading. Signed-off-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r--src/gallium/drivers/panfrost/pan_context.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index cab7c89ac8b..c4bb57d782e 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -1115,6 +1115,17 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
}
}
+ /* Inject the strides */
+ unsigned usage2 = ctx->sampler_views[t][i]->hw.format.usage2;
+
+ if (usage2 & MALI_TEX_MANUAL_STRIDE) {
+ unsigned idx = tex_rsrc->last_level * tex_rsrc->array_size;
+ idx += tex_rsrc->array_size;
+
+ ctx->sampler_views[t][i]->hw.swizzled_bitmaps[idx] =
+ rsrc->bo->slices[0].stride;
+ }
+
trampolines[i] = panfrost_upload_transient(ctx, &ctx->sampler_views[t][i]->hw, sizeof(struct mali_texture_descriptor));
}
@@ -1951,6 +1962,7 @@ panfrost_create_sampler_view(
pipe_reference(NULL, &texture->reference);
struct panfrost_resource *prsrc = (struct panfrost_resource *) texture;
+ assert(prsrc->bo);
so->base = *template;
so->base.texture = texture;
@@ -1995,6 +2007,19 @@ panfrost_create_sampler_view(
break;
}
+ /* Check if we need to set a custom stride by computing the "expected"
+ * stride and comparing it to what the BO actually wants. Only applies
+ * to linear textures TODO: Mipmap? */
+
+ unsigned actual_stride = prsrc->bo->slices[0].stride;
+
+ if (prsrc->bo->layout == PAN_LINEAR &&
+ template->u.tex.last_level == 0 &&
+ template->u.tex.first_level == 0 &&
+ (texture->width0 * bytes_per_pixel) != actual_stride) {
+ usage2_layout |= MALI_TEX_MANUAL_STRIDE;
+ }
+
struct mali_texture_descriptor texture_descriptor = {
.width = MALI_POSITIVE(texture->width0),
.height = MALI_POSITIVE(texture->height0),