Mesa (main): zink: use scissor region for discarding clears during blit
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jun 11 13:11:43 UTC 2021
Module: Mesa
Branch: main
Commit: 5f61382280dc4a82528bce31a8df2c8eed052386
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5f61382280dc4a82528bce31a8df2c8eed052386
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Thu Jun 10 15:52:18 2021 -0400
zink: use scissor region for discarding clears during blit
ensure that clears aren't being mistakenly discarded or applied due to
scissor region being ignored and full surface geometry being used
Fixes: a8e047e8f4a ("zink: discard pending clears during blit/copy if we'll overwrite the data")
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11307>
---
src/gallium/drivers/zink/zink_blit.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_blit.c b/src/gallium/drivers/zink/zink_blit.c
index 3ea9ac7ca86..9de8e566f00 100644
--- a/src/gallium/drivers/zink/zink_blit.c
+++ b/src/gallium/drivers/zink/zink_blit.c
@@ -8,6 +8,17 @@
#include "util/u_surface.h"
#include "util/format/u_format.h"
+static void
+apply_dst_clears(struct zink_context *ctx, const struct pipe_blit_info *info, bool discard_only)
+{
+ if (info->scissor_enable) {
+ struct u_rect rect = { info->scissor.minx, info->scissor.maxx,
+ info->scissor.miny, info->scissor.maxy };
+ zink_fb_clears_apply_or_discard(ctx, info->dst.resource, rect, discard_only);
+ } else
+ zink_fb_clears_apply_or_discard(ctx, info->dst.resource, zink_rect_from_box(&info->dst.box), discard_only);
+}
+
static bool
blit_resolve(struct zink_context *ctx, const struct pipe_blit_info *info)
{
@@ -38,7 +49,7 @@ blit_resolve(struct zink_context *ctx, const struct pipe_blit_info *info)
util_range_add(info->dst.resource, &dst->valid_buffer_range,
info->dst.box.x, info->dst.box.x + info->dst.box.width);
- zink_fb_clears_apply_or_discard(ctx, info->dst.resource, zink_rect_from_box(&info->dst.box), false);
+ apply_dst_clears(ctx, info, false);
zink_fb_clears_apply_region(ctx, info->src.resource, zink_rect_from_box(&info->src.box));
struct zink_batch *batch = zink_batch_no_rp(ctx);
@@ -143,7 +154,7 @@ blit_native(struct zink_context *ctx, const struct pipe_blit_info *info)
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT))
return false;
- zink_fb_clears_apply_or_discard(ctx, info->dst.resource, zink_rect_from_box(&info->dst.box), false);
+ apply_dst_clears(ctx, info, false);
zink_fb_clears_apply_region(ctx, info->src.resource, zink_rect_from_box(&info->src.box));
struct zink_batch *batch = zink_batch_no_rp(ctx);
zink_batch_reference_resource_rw(batch, src, false);
@@ -276,7 +287,10 @@ zink_blit(struct pipe_context *pctx,
return;
}
- zink_fb_clears_apply_or_discard(ctx, info->dst.resource, zink_rect_from_box(&info->dst.box), true);
+ /* this is discard_only because we're about to start a renderpass that will
+ * flush all pending clears anyway
+ */
+ apply_dst_clears(ctx, info, true);
if (info->dst.resource->target == PIPE_BUFFER)
util_range_add(info->dst.resource, &dst->valid_buffer_range,
More information about the mesa-commit
mailing list