v3d: Avoid the GFXH-1461 workaround if we have only Z or only S.
authorEric Anholt <eric@anholt.net>
Mon, 23 Jul 2018 21:08:54 +0000 (14:08 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 26 Jul 2018 18:02:25 +0000 (11:02 -0700)
This seems like a sensible precaution to avoid extra draws.  It doesn't
deal with the case of a Z24S8 buffer created by the window system for an
application that happens to never use S.

src/gallium/drivers/v3d/v3dx_draw.c

index 6aa58ceaafe2f8d281b3b834db4dd22b7a991f9e..13143191d21cb51dedf67c103e296b34b7763bcd 100644 (file)
@@ -671,9 +671,11 @@ v3d_tlb_clear(struct v3d_job *job, unsigned buffers,
          * if it would be possible to need to emit a load of just one after
          * we've set up our TLB clears.
          */
-        unsigned zsclear = buffers & PIPE_CLEAR_DEPTHSTENCIL;
-        if (zsclear && zsclear != PIPE_CLEAR_DEPTHSTENCIL) {
-                buffers &= ~zsclear;
+        if (buffers & PIPE_CLEAR_DEPTHSTENCIL &&
+            (buffers & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL &&
+            job->zsbuf &&
+            util_format_is_depth_and_stencil(job->zsbuf->texture->format)) {
+                buffers &= ~PIPE_CLEAR_DEPTHSTENCIL;
         }
 
         for (int i = 0; i < VC5_MAX_DRAW_BUFFERS; i++) {
@@ -732,7 +734,7 @@ v3d_tlb_clear(struct v3d_job *job, unsigned buffers,
                 rsc->initialized_buffers |= bit;
         }
 
-        zsclear = buffers & PIPE_CLEAR_DEPTHSTENCIL;
+        unsigned zsclear = buffers & PIPE_CLEAR_DEPTHSTENCIL;
         if (zsclear) {
                 struct v3d_resource *rsc =
                         v3d_resource(v3d->framebuffer.zsbuf->texture);