OSDN Git Service

vc4: Don't worry about partial Z/S clear if the other is already cleared.
authorEric Anholt <eric@anholt.net>
Thu, 6 Oct 2016 21:50:04 +0000 (14:50 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 7 Oct 2016 01:29:16 +0000 (18:29 -0700)
We have to be careful to not smash the value they're clearing to, but
other than that we're fine.  Avoids quad clears in Processing, which likes
to do glClear(Z|S); glClear(Z).

Improves performance of Processing's QuadRendering demo at 5000 quads by
5.46507% +/- 1.35576% (n=15 before, 32 after)

src/gallium/drivers/vc4/vc4_draw.c

index 87c8a5f..f44831f 100644 (file)
@@ -514,7 +514,7 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers,
                  */
                 if ((zsclear == PIPE_CLEAR_DEPTH ||
                      zsclear == PIPE_CLEAR_STENCIL) &&
-                    (rsc->initialized_buffers & ~zsclear) &&
+                    (rsc->initialized_buffers & ~(zsclear | job->cleared)) &&
                     util_format_is_depth_and_stencil(vc4->framebuffer.zsbuf->format)) {
                         perf_debug("Partial clear of Z+stencil buffer, "
                                    "drawing a quad instead of fast clearing\n");
@@ -533,8 +533,12 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers,
                 /* Though the depth buffer is stored with Z in the high 24,
                  * for this field we just need to store it in the low 24.
                  */
-                job->clear_depth = util_pack_z(PIPE_FORMAT_Z24X8_UNORM, depth);
-                job->clear_stencil = stencil;
+                if (buffers & PIPE_CLEAR_DEPTH) {
+                        job->clear_depth = util_pack_z(PIPE_FORMAT_Z24X8_UNORM,
+                                                       depth);
+                }
+                if (buffers & PIPE_CLEAR_STENCIL)
+                        job->clear_stencil = stencil;
 
                 rsc->initialized_buffers |= zsclear;
         }