summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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),