freedreno/a6xx: fix LRZ layout
authorRob Clark <robdclark@chromium.org>
Tue, 10 Dec 2019 22:27:20 +0000 (14:27 -0800)
committerRob Clark <robdclark@gmail.com>
Tue, 10 Dec 2019 22:55:21 +0000 (22:55 +0000)
Signed-off-by: Rob Clark <robdclark@chromium.org>
src/gallium/drivers/freedreno/a6xx/fd6_resource.c

index f75ca0666be500d697ce177be567c3a74918d53e..256aba0cd552d9959f426a6c65dc8c69b3954a52 100644 (file)
@@ -295,21 +295,22 @@ setup_lrz(struct fd_resource *rsc)
        struct fd_screen *screen = fd_screen(rsc->base.screen);
        const uint32_t flags = DRM_FREEDRENO_GEM_CACHE_WCOMBINE |
                        DRM_FREEDRENO_GEM_TYPE_KMEM; /* TODO */
-       unsigned lrz_pitch  = align(DIV_ROUND_UP(rsc->base.width0, 8), 64);
-       unsigned lrz_height = DIV_ROUND_UP(rsc->base.height0, 8);
+       unsigned width0 = rsc->base.width0;
+       unsigned height0 = rsc->base.height0;
 
        /* LRZ buffer is super-sampled: */
        switch (rsc->base.nr_samples) {
        case 4:
-               lrz_pitch *= 2;
-               /* fallthrough */
+               width0 *= 2;
+               /* fallthru */
        case 2:
-               lrz_height *= 2;
+               height0 *= 2;
        }
 
-       unsigned size = lrz_pitch * lrz_height * 2;
+       unsigned lrz_pitch  = align(DIV_ROUND_UP(width0, 8), 32);
+       unsigned lrz_height = align(DIV_ROUND_UP(height0, 8), 16);
 
-       size += 0x1000; /* for GRAS_LRZ_FAST_CLEAR_BUFFER */
+       unsigned size = lrz_pitch * lrz_height * 2;
 
        rsc->lrz_height = lrz_height;
        rsc->lrz_width = lrz_pitch;