freedreno/a6xx: Don't emit src state when clearing
authorKristian H. Kristensen <hoegsberg@google.com>
Thu, 2 Jul 2020 11:13:27 +0000 (04:13 -0700)
committerMarge Bot <eric+marge@anholt.net>
Tue, 14 Jul 2020 06:12:22 +0000 (06:12 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5717>

src/gallium/drivers/freedreno/a6xx/fd6_blitter.c

index 5207a26..8da3085 100644 (file)
@@ -518,22 +518,25 @@ emit_blit_or_clear_texture(struct fd_context *ctx, struct fd_ringbuffer *ring,
        OUT_RING(ring, A6XX_CP_SET_MARKER_0_MODE(RM6_BLIT2DSCALE));
 
        uint32_t nr_samples = fd_resource_nr_samples(&dst->base);
-       sx1 = sbox->x * nr_samples;
-       sy1 = sbox->y;
-       sx2 = (sbox->x + sbox->width) * nr_samples - 1;
-       sy2 = sbox->y + sbox->height - 1;
+
+       if (!color) {
+               sx1 = sbox->x * nr_samples;
+               sy1 = sbox->y;
+               sx2 = (sbox->x + sbox->width) * nr_samples - 1;
+               sy2 = sbox->y + sbox->height - 1;
+
+               OUT_PKT4(ring, REG_A6XX_GRAS_2D_SRC_TL_X, 4);
+               OUT_RING(ring, A6XX_GRAS_2D_SRC_TL_X_X(sx1));
+               OUT_RING(ring, A6XX_GRAS_2D_SRC_BR_X_X(sx2));
+               OUT_RING(ring, A6XX_GRAS_2D_SRC_TL_Y_Y(sy1));
+               OUT_RING(ring, A6XX_GRAS_2D_SRC_BR_Y_Y(sy2));
+       }
 
        dx1 = dbox->x * nr_samples;
        dy1 = dbox->y;
        dx2 = (dbox->x + dbox->width) * nr_samples - 1;
        dy2 = dbox->y + dbox->height - 1;
 
-       OUT_PKT4(ring, REG_A6XX_GRAS_2D_SRC_TL_X, 4);
-       OUT_RING(ring, A6XX_GRAS_2D_SRC_TL_X_X(sx1));
-       OUT_RING(ring, A6XX_GRAS_2D_SRC_BR_X_X(sx2));
-       OUT_RING(ring, A6XX_GRAS_2D_SRC_TL_Y_Y(sy1));
-       OUT_RING(ring, A6XX_GRAS_2D_SRC_BR_Y_Y(sy2));
-
        OUT_PKT4(ring, REG_A6XX_GRAS_2D_DST_TL, 2);
        OUT_RING(ring, A6XX_GRAS_2D_DST_TL_X(dx1) | A6XX_GRAS_2D_DST_TL_Y(dy1));
        OUT_RING(ring, A6XX_GRAS_2D_DST_BR_X(dx2) | A6XX_GRAS_2D_DST_BR_Y(dy2));
@@ -629,7 +632,8 @@ emit_blit_or_clear_texture(struct fd_context *ctx, struct fd_ringbuffer *ring,
 
        for (unsigned i = 0; i < info->dst.box.depth; i++) {
 
-               emit_blit_src(ring, info, sbox->z + i, nr_samples);
+               if (!color)
+                       emit_blit_src(ring, info, sbox->z + i, nr_samples);
 
                emit_blit_dst(ring, info, dbox->z + i);