panfrost/mfbd: Implement linear depth buffers
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Tue, 12 Mar 2019 22:49:33 +0000 (22:49 +0000)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Thu, 14 Mar 2019 22:47:11 +0000 (22:47 +0000)
This removes a clunky hack where the depth buffer was enabled during the
*clear*, instead of during depth buffer linking. That said, this does
not yet support writeback like AFBC depth buffers.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
src/gallium/drivers/panfrost/pan_mfbd.c

index a141fd314c00829d02d29599df9eeb462d1adfdd..b9c7cb221e733f14cc55d4a969c8fc74ee50edc1 100644 (file)
@@ -58,8 +58,6 @@ panfrost_mfbd_clear(
                 struct bifrost_fb_extra *fbx,
                 struct bifrost_render_target *rt)
 {
-        struct panfrost_context *ctx = job->ctx;
-
         if (job->clear & PIPE_CLEAR_COLOR) {
                 rt->clear_color_1 = job->clear_color;
                 rt->clear_color_2 = job->clear_color;
@@ -74,14 +72,6 @@ panfrost_mfbd_clear(
         if (job->clear & PIPE_CLEAR_STENCIL) {
                 fb->clear_stencil = job->clear_stencil;
         }
-
-        if (job->clear & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) {
-                /* Setup combined 24/8 depth/stencil */
-                fb->unk3 |= MALI_MFBD_EXTRA;
-                fbx->flags = 0x405;
-                fbx->ds_linear.depth = ctx->depth_stencil_buffer.gpu;
-                fbx->ds_linear.depth_stride = ctx->pipe_framebuffer.width * 4;
-        }
 }
 
 static void
@@ -155,6 +145,15 @@ panfrost_mfbd_set_zsbuf(
                 fbx->ds_afbc.padding = 0x1000;
 
                 fb->unk3 |= MALI_MFBD_DEPTH_WRITE;
+        } else if (rsrc->bo->layout == PAN_LINEAR) {
+                fb->unk3 |= MALI_MFBD_EXTRA;
+                fbx->flags |= MALI_EXTRA_PRESENT | MALI_EXTRA_ZS | 0x1;
+
+                fbx->ds_linear.depth = rsrc->bo->gpu[0];
+                fbx->ds_linear.depth_stride =
+                        util_format_get_stride(surf->format, surf->texture->width0);
+        } else {
+                assert(0);
         }
 }