broadcom/vc5: Emit missing TILE_COORDINATES_IMPLICIT in separate z/s stores.
authorEric Anholt <eric@anholt.net>
Fri, 30 Mar 2018 23:39:14 +0000 (16:39 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 12 Apr 2018 18:20:50 +0000 (11:20 -0700)
Fixes a simulator assertion failure in
KHR-GLES3.packed_depth_stencil.blit.depth32f_stencil8

src/gallium/drivers/vc5/vc5_rcl.c

index 83593a86d2e9f0236a2e5dcb25636c0acf22b4f5..5ffdfd9ca398ed0c76f6518babb3808d9bb5e84d 100644 (file)
@@ -291,31 +291,42 @@ vc5_rcl_emit_stores(struct vc5_job *job, struct vc5_cl *cl)
 
         if (job->resolve & PIPE_CLEAR_DEPTHSTENCIL && job->zsbuf &&
             !(V3D_VERSION < 40 && job->zsbuf->texture->nr_samples <= 1)) {
-                stores_pending &= ~PIPE_CLEAR_DEPTHSTENCIL;
-
                 struct vc5_resource *rsc = vc5_resource(job->zsbuf->texture);
                 if (rsc->separate_stencil) {
                         if (job->resolve & PIPE_CLEAR_DEPTH) {
+                                stores_pending &= ~PIPE_CLEAR_DEPTH;
                                 store_general(job, cl, job->zsbuf, Z,
                                               PIPE_CLEAR_DEPTH,
                                               !stores_pending,
                                               general_color_clear);
+                                if (V3D_VERSION < 40 && stores_pending) {
+                                        cl_emit(cl, TILE_COORDINATES_IMPLICIT,
+                                                coords);
+                                }
                         }
+
                         if (job->resolve & PIPE_CLEAR_STENCIL) {
+                                stores_pending &= ~PIPE_CLEAR_STENCIL;
                                 store_general(job, cl, job->zsbuf, STENCIL,
                                               PIPE_CLEAR_STENCIL,
                                               !stores_pending,
                                               general_color_clear);
+                                if (V3D_VERSION < 40 && stores_pending) {
+                                        cl_emit(cl, TILE_COORDINATES_IMPLICIT,
+                                                coords);
+                                }
                         }
                 } else {
+                        stores_pending &= ~PIPE_CLEAR_DEPTHSTENCIL;
                         store_general(job, cl, job->zsbuf,
                                       zs_buffer_from_pipe_bits(job->resolve),
                                       job->resolve & PIPE_CLEAR_DEPTHSTENCIL,
                                       !stores_pending, general_color_clear);
+                        if (V3D_VERSION < 40 && stores_pending) {
+                                cl_emit(cl, TILE_COORDINATES_IMPLICIT,
+                                        coords);
+                        }
                 }
-
-                if (V3D_VERSION < 40 && stores_pending)
-                        cl_emit(cl, TILE_COORDINATES_IMPLICIT, coords);
         }
 
         if (stores_pending) {