summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/vc4/vc4_program.c2
-rw-r--r--src/gallium/drivers/vc4/vc4_resource.c12
2 files changed, 12 insertions, 2 deletions
diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index f7791abb946..642595b70d7 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -1403,7 +1403,7 @@ write_texture_p0(struct vc4_context *vc4,
struct vc4_resource *rsc = vc4_resource(texture->texture);
cl_reloc(vc4, &vc4->uniforms, rsc->bo,
- texture->u.tex.last_level);
+ rsc->slices[0].offset | texture->u.tex.last_level);
}
static void
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
index 3dad566a002..e0c0c7bdd42 100644
--- a/src/gallium/drivers/vc4/vc4_resource.c
+++ b/src/gallium/drivers/vc4/vc4_resource.c
@@ -147,7 +147,17 @@ vc4_setup_slices(struct vc4_resource *rsc)
*/
offset += slice->size0 * depth;
}
- /* XXX: align level 0 offset? */
+
+ /* The texture base pointer that has to point to level 0 doesn't have
+ * intra-page bits, so we have to align it, and thus shift up all the
+ * smaller slices.
+ */
+ uint32_t page_align_offset = (align(rsc->slices[0].offset, 4096) -
+ rsc->slices[0].offset);
+ if (page_align_offset) {
+ for (int i = 0; i <= prsc->last_level; i++)
+ rsc->slices[i].offset += page_align_offset;
+ }
}
static struct vc4_resource *