Mesa (master): vc4: Fix multi-level texture setup.

Eric Anholt anholt at kemper.freedesktop.org
Mon Aug 18 22:28:04 UTC 2014


Module: Mesa
Branch: master
Commit: 63fe494877177d24fd36f9955b69331939b7798c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=63fe494877177d24fd36f9955b69331939b7798c

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Aug 18 10:31:36 2014 -0700

vc4: Fix multi-level texture setup.

We weren't accounting for the level 0 offset in the texture setup (so it
only worked if it happened to be a single-level texture), and doing so
required that we get the level 0 offset page aligned so that the offset
bits don't get interpreted as the texture format and such.

---

 src/gallium/drivers/vc4/vc4_program.c  |    2 +-
 src/gallium/drivers/vc4/vc4_resource.c |   12 +++++++++++-
 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 f7791ab..642595b 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 3dad566..e0c0c7b 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 *




More information about the mesa-commit mailing list