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