Mesa (staging/21.1): zink: use scissor region for discarding clears during blit
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jun 16 06:40:59 UTC 2021
Module: Mesa
Branch: staging/21.1
Commit: 97c35a1932c1918cbc4d1ed08b605c3c9c8f524f
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=97c35a1932c1918cbc4d1ed08b605c3c9c8f524f
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>
(cherry picked from commit 5f61382280dc4a82528bce31a8df2c8eed052386)
---
.pick_status.json | 2 +-
src/gallium/drivers/zink/zink_blit.c | 20 +++++++++++++++++---
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/.pick_status.json b/.pick_status.json
index 0dfffbe4a7e..a186a77f011 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1993,7 +1993,7 @@
"description": "zink: use scissor region for discarding clears during blit",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "a8e047e8f4a4ec544632fec20d1d6b441fd3ef31"
},
diff --git a/src/gallium/drivers/zink/zink_blit.c b/src/gallium/drivers/zink/zink_blit.c
index 062bc484e47..9f9de99f0f8 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);
@@ -137,7 +148,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);
@@ -270,7 +281,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