freedreno: a2xx: fix fast clear not being used for Z24X8 buffers
authorJonathan Marek <jonathan@marek.ca>
Thu, 1 Aug 2019 16:50:03 +0000 (12:50 -0400)
committerJonathan Marek <jonathan@marek.ca>
Fri, 2 Aug 2019 15:58:22 +0000 (15:58 +0000)
Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Reviewed-by: Rob Clark <robdclark@chromium.org>
src/gallium/drivers/freedreno/a2xx/fd2_draw.c

index ecc0798679df6df62bbc92cd62fd3066711cba8b..6969ed90fcd33232577ba198c704ea4f7f41396d 100644 (file)
@@ -428,17 +428,21 @@ fd2_clear_fast(struct fd_context *ctx, unsigned buffers,
        if (buffers & PIPE_CLEAR_COLOR)
                color_size = util_format_get_blocksizebits(format) == 32;
 
-       if (buffers & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))
+       if (buffers & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) {
+               /* no fast clear when clearing only one component of depth+stencil buffer */
+               if (!(buffers & PIPE_CLEAR_DEPTH))
+                       return false;
+
+               if ((pfb->zsbuf->format == PIPE_FORMAT_Z24_UNORM_S8_UINT ||
+                        pfb->zsbuf->format == PIPE_FORMAT_S8_UINT_Z24_UNORM) &&
+                        !(buffers & PIPE_CLEAR_STENCIL))
+                       return false;
+
                depth_size = fd_pipe2depth(pfb->zsbuf->format) == DEPTHX_24_8;
+       }
 
        assert(color_size >= 0 || depth_size >= 0);
 
-       /* when clearing 24_8, depth/stencil must be both cleared
-        * TODO: if buffer isn't attached we can clear it anyway
-        */
-       if (depth_size == 1 && !(buffers & PIPE_CLEAR_STENCIL) != !(buffers & PIPE_CLEAR_DEPTH))
-               return false;
-
        if (color_size == 0) {
                color_clear = pack_rgba(format, color->f);
                color_clear = (color_clear << 16) | (color_clear & 0xffff);