Mesa (main): gallium/util: fix util_can_blit_via_copy_region with unbound render condition

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Nov 4 15:28:45 UTC 2021


Module: Mesa
Branch: main
Commit: 7ce3f8e639506975c512c4b0814a091a00d0f2fd
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7ce3f8e639506975c512c4b0814a091a00d0f2fd

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri Oct 29 09:40:28 2021 -0400

gallium/util: fix util_can_blit_via_copy_region with unbound render condition

It returned false when a render condition was not bound, but it should
have returned true.

The bool stuff is random and incomplete, but that's life.

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13602>

---

 src/gallium/auxiliary/util/u_surface.c           | 14 ++++++++------
 src/gallium/auxiliary/util/u_surface.h           | 10 ++++++----
 src/gallium/drivers/etnaviv/etnaviv_clear_blit.c |  2 +-
 src/gallium/drivers/i915/i915_surface.c          |  2 +-
 src/gallium/drivers/lima/lima_resource.c         |  2 +-
 src/gallium/drivers/llvmpipe/lp_surface.c        |  2 +-
 src/gallium/drivers/nouveau/nv30/nv30_miptree.c  |  2 +-
 src/gallium/drivers/r600/r600_blit.c             |  4 ++--
 src/gallium/drivers/radeonsi/si_blit.c           |  5 +++--
 src/gallium/drivers/softpipe/sp_surface.c        |  2 +-
 src/gallium/drivers/svga/svga_pipe_blit.c        |  6 +++---
 src/gallium/drivers/swr/swr_context.cpp          |  2 +-
 src/gallium/drivers/vc4/vc4_blit.c               |  4 ++--
 src/gallium/drivers/zink/zink_blit.c             |  2 +-
 14 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_surface.c b/src/gallium/auxiliary/util/u_surface.c
index 3906a84b650..af406e826ad 100644
--- a/src/gallium/auxiliary/util/u_surface.c
+++ b/src/gallium/auxiliary/util/u_surface.c
@@ -765,9 +765,10 @@ get_sample_count(const struct pipe_resource *res)
  * the blit src/dst formats are identical, ignoring the resource formats.
  * Otherwise, check for format casting and compatibility.
  */
-boolean
+bool
 util_can_blit_via_copy_region(const struct pipe_blit_info *blit,
-                              boolean tight_format_check)
+                              bool tight_format_check,
+                              bool render_condition_bound)
 {
    const struct util_format_description *src_desc, *dst_desc;
 
@@ -797,7 +798,7 @@ util_can_blit_via_copy_region(const struct pipe_blit_info *blit,
        blit->scissor_enable ||
        blit->num_window_rectangles > 0 ||
        blit->alpha_blend ||
-       blit->render_condition_enable) {
+       (blit->render_condition_enable && render_condition_bound)) {
       return FALSE;
    }
 
@@ -840,11 +841,12 @@ util_can_blit_via_copy_region(const struct pipe_blit_info *blit,
  * It returns FALSE otherwise and the caller must fall back to a more generic
  * codepath for the blit operation. (e.g. by using u_blitter)
  */
-boolean
+bool
 util_try_blit_via_copy_region(struct pipe_context *ctx,
-                              const struct pipe_blit_info *blit)
+                              const struct pipe_blit_info *blit,
+                              bool render_condition_bound)
 {
-   if (util_can_blit_via_copy_region(blit, FALSE)) {
+   if (util_can_blit_via_copy_region(blit, FALSE, render_condition_bound)) {
       ctx->resource_copy_region(ctx, blit->dst.resource, blit->dst.level,
                                 blit->dst.box.x, blit->dst.box.y,
                                 blit->dst.box.z,
diff --git a/src/gallium/auxiliary/util/u_surface.h b/src/gallium/auxiliary/util/u_surface.h
index 61a8d512f4c..1ca8ca31416 100644
--- a/src/gallium/auxiliary/util/u_surface.h
+++ b/src/gallium/auxiliary/util/u_surface.h
@@ -105,13 +105,15 @@ util_clear_depth_stencil(struct pipe_context *pipe,
                          unsigned dstx, unsigned dsty,
                          unsigned width, unsigned height);
 
-boolean
+bool
 util_can_blit_via_copy_region(const struct pipe_blit_info *blit,
-                              boolean tight_format_check);
+                              bool tight_format_check,
+                              bool render_condition_bound);
 
-extern boolean
+extern bool
 util_try_blit_via_copy_region(struct pipe_context *ctx,
-                              const struct pipe_blit_info *blit);
+                              const struct pipe_blit_info *blit,
+                              bool render_condition_bound);
 
 
 #ifdef __cplusplus
diff --git a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c
index 698fe007720..99fd6cc1327 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c
@@ -100,7 +100,7 @@ etna_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
    if (ctx->blit(pctx, &info))
       return;
 
-   if (util_try_blit_via_copy_region(pctx, &info))
+   if (util_try_blit_via_copy_region(pctx, &info, false))
       return;
 
    if (info.mask & PIPE_MASK_S) {
diff --git a/src/gallium/drivers/i915/i915_surface.c b/src/gallium/drivers/i915/i915_surface.c
index 38059b9749e..4d3cc4d2b2c 100644
--- a/src/gallium/drivers/i915/i915_surface.c
+++ b/src/gallium/drivers/i915/i915_surface.c
@@ -255,7 +255,7 @@ i915_blit(struct pipe_context *pipe, const struct pipe_blit_info *blit_info)
    struct i915_context *i915 = i915_context(pipe);
    struct pipe_blit_info info = *blit_info;
 
-   if (util_try_blit_via_copy_region(pipe, &info)) {
+   if (util_try_blit_via_copy_region(pipe, &info, false)) {
       return; /* done */
    }
 
diff --git a/src/gallium/drivers/lima/lima_resource.c b/src/gallium/drivers/lima/lima_resource.c
index 946edc86df8..3356db9a49d 100644
--- a/src/gallium/drivers/lima/lima_resource.c
+++ b/src/gallium/drivers/lima/lima_resource.c
@@ -848,7 +848,7 @@ lima_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
    struct lima_context *ctx = lima_context(pctx);
    struct pipe_blit_info info = *blit_info;
 
-   if (util_try_blit_via_copy_region(pctx, &info)) {
+   if (util_try_blit_via_copy_region(pctx, &info, false)) {
       return; /* done */
    }
 
diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c
index 8e905b8d7a0..a93131121f6 100644
--- a/src/gallium/drivers/llvmpipe/lp_surface.c
+++ b/src/gallium/drivers/llvmpipe/lp_surface.c
@@ -122,7 +122,7 @@ static void lp_blit(struct pipe_context *pipe,
    if (blit_info->render_condition_enable && !llvmpipe_check_render_cond(lp))
       return;
 
-   if (util_try_blit_via_copy_region(pipe, &info)) {
+   if (util_try_blit_via_copy_region(pipe, &info, lp->render_cond_query != NULL)) {
       return; /* done */
    }
 
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_miptree.c b/src/gallium/drivers/nouveau/nv30/nv30_miptree.c
index 1c8acaf731f..aef160ac160 100644
--- a/src/gallium/drivers/nouveau/nv30/nv30_miptree.c
+++ b/src/gallium/drivers/nouveau/nv30/nv30_miptree.c
@@ -229,7 +229,7 @@ nv30_blit(struct pipe_context *pipe,
       return;
    }
 
-   if (util_try_blit_via_copy_region(pipe, &info)) {
+   if (util_try_blit_via_copy_region(pipe, &info, nv30->render_cond_query != NULL)) {
       return; /* done */
    }
 
diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index aca37730233..2ee4744bf0a 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -933,7 +933,7 @@ static void r600_blit(struct pipe_context *ctx,
 	if (rdst->surface.u.legacy.level[info->dst.level].mode ==
 	    RADEON_SURF_MODE_LINEAR_ALIGNED &&
 	    rctx->b.dma_copy &&
-	    util_can_blit_via_copy_region(info, false)) {
+	    util_can_blit_via_copy_region(info, false, rctx->b.render_cond != NULL)) {
 		rctx->b.dma_copy(ctx, info->dst.resource, info->dst.level,
 				 info->dst.box.x, info->dst.box.y,
 				 info->dst.box.z,
@@ -953,7 +953,7 @@ static void r600_blit(struct pipe_context *ctx,
 	}
 
 	if (rctx->screen->b.debug_flags & DBG_FORCE_DMA &&
-	    util_try_blit_via_copy_region(ctx, info))
+	    util_try_blit_via_copy_region(ctx, info, rctx->b.render_cond != NULL))
 		return;
 
 	r600_blitter_begin(ctx, R600_BLIT |
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
index a51ff789b59..8c7860f0de6 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -1220,7 +1220,8 @@ static void si_blit(struct pipe_context *ctx, const struct pipe_blit_info *info)
                         info->dst.level == 0 && info->src.level == 0 &&
                         info->src.box.width == info->dst.resource->width0 &&
                         info->src.box.height == info->dst.resource->height0 &&
-                        info->src.box.depth == 1 && util_can_blit_via_copy_region(info, true);
+                        info->src.box.depth == 1 &&
+                        util_can_blit_via_copy_region(info, true, sctx->render_cond != NULL);
       /* Try SDMA first... */
       if (async_copy && si_sdma_copy_image(sctx, sdst, ssrc))
          return;
@@ -1252,7 +1253,7 @@ static void si_blit(struct pipe_context *ctx, const struct pipe_blit_info *info)
    /* Using compute for copying to a linear texture in GTT is much faster than
     * going through RBs (render backends). This improves DRI PRIME performance.
     */
-   if (util_can_blit_via_copy_region(info, false)) {
+   if (util_can_blit_via_copy_region(info, false, sctx->render_cond != NULL)) {
       si_resource_copy_region(ctx, info->dst.resource, info->dst.level,
                               info->dst.box.x, info->dst.box.y, info->dst.box.z,
                               info->src.resource, info->src.level, &info->src.box);
diff --git a/src/gallium/drivers/softpipe/sp_surface.c b/src/gallium/drivers/softpipe/sp_surface.c
index e0a4841edb0..3f48c94b6e5 100644
--- a/src/gallium/drivers/softpipe/sp_surface.c
+++ b/src/gallium/drivers/softpipe/sp_surface.c
@@ -47,7 +47,7 @@ static void sp_blit(struct pipe_context *pipe,
       return;
    }
 
-   if (util_try_blit_via_copy_region(pipe, info)) {
+   if (util_try_blit_via_copy_region(pipe, info, sp->render_cond_query != NULL)) {
       return; /* done */
    }
 
diff --git a/src/gallium/drivers/svga/svga_pipe_blit.c b/src/gallium/drivers/svga/svga_pipe_blit.c
index 9cb53ef0a45..1d3ec2a185a 100644
--- a/src/gallium/drivers/svga/svga_pipe_blit.c
+++ b/src/gallium/drivers/svga/svga_pipe_blit.c
@@ -322,7 +322,7 @@ can_blit_via_svga_copy_region(struct svga_context *svga,
    local_blit.dst.format = local_blit.src.format;
    if (local_blit.filter == PIPE_TEX_FILTER_LINEAR)
       local_blit.filter = PIPE_TEX_FILTER_NEAREST;
-   if (!util_can_blit_via_copy_region(&local_blit, TRUE))
+   if (!util_can_blit_via_copy_region(&local_blit, TRUE, svga->render_condition))
       return false;
 
    /* For depth+stencil formats, copy with mask != PIPE_MASK_ZS is not
@@ -752,8 +752,8 @@ static bool
 try_cpu_copy_region(struct svga_context *svga,
                     const struct pipe_blit_info *blit)
 {
-   if (util_can_blit_via_copy_region(blit, TRUE) ||
-       util_can_blit_via_copy_region(blit, FALSE)) {
+   if (util_can_blit_via_copy_region(blit, TRUE, svga->render_condition) ||
+       util_can_blit_via_copy_region(blit, FALSE, svga->render_condition)) {
 
       if (svga->render_condition && blit->render_condition_enable) {
          debug_warning("CPU copy_region doesn't support "
diff --git a/src/gallium/drivers/swr/swr_context.cpp b/src/gallium/drivers/swr/swr_context.cpp
index 8498a6b1076..2a07a3767b9 100644
--- a/src/gallium/drivers/swr/swr_context.cpp
+++ b/src/gallium/drivers/swr/swr_context.cpp
@@ -295,7 +295,7 @@ swr_blit(struct pipe_context *pipe, const struct pipe_blit_info *blit_info)
       info.src.resource = resolve_target;
    }
 
-   if (util_try_blit_via_copy_region(pipe, &info)) {
+   if (util_try_blit_via_copy_region(pipe, &info, ctx->render_cond_query != NULL)) {
       return; /* done */
    }
 
diff --git a/src/gallium/drivers/vc4/vc4_blit.c b/src/gallium/drivers/vc4/vc4_blit.c
index d7f756f7294..bdfbbf62a9b 100644
--- a/src/gallium/drivers/vc4/vc4_blit.c
+++ b/src/gallium/drivers/vc4/vc4_blit.c
@@ -402,7 +402,7 @@ fallback:
         /* Do an immediate SW fallback, since the render blit path
          * would just recurse.
          */
-        ok = util_try_blit_via_copy_region(pctx, info);
+        ok = util_try_blit_via_copy_region(pctx, info, false);
         assert(ok); (void)ok;
 
         return true;
@@ -450,7 +450,7 @@ vc4_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
                 return;
 
         if (info.mask & PIPE_MASK_S) {
-                if (util_try_blit_via_copy_region(pctx, &info))
+                if (util_try_blit_via_copy_region(pctx, &info, false))
                         return;
 
                 info.mask &= ~PIPE_MASK_S;
diff --git a/src/gallium/drivers/zink/zink_blit.c b/src/gallium/drivers/zink/zink_blit.c
index 7085c8e033c..1dda73d9f9b 100644
--- a/src/gallium/drivers/zink/zink_blit.c
+++ b/src/gallium/drivers/zink/zink_blit.c
@@ -285,7 +285,7 @@ zink_blit(struct pipe_context *pctx,
           !ctx->render_condition_active)
          new_info.render_condition_enable = false;
 
-      if (util_try_blit_via_copy_region(pctx, &new_info))
+      if (util_try_blit_via_copy_region(pctx, &new_info, ctx->render_condition_active))
          return;
    }
 



More information about the mesa-commit mailing list