Mesa (master): zink: beef up zink_transfer_flush_region
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Feb 23 04:01:54 UTC 2021
Module: Mesa
Branch: master
Commit: 16792ccaa187184873e26f4e3dd8376f4ebed9e5
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=16792ccaa187184873e26f4e3dd8376f4ebed9e5
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Sep 4 09:41:30 2020 -0400
zink: beef up zink_transfer_flush_region
this now takes over from previous call sites in zink_transfer_unmap
we add a flush here if we had pending usage to ensure that the resource
gets properly synced
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9146>
---
src/gallium/drivers/zink/zink_resource.c | 40 +++++++++++++++++++-------------
1 file changed, 24 insertions(+), 16 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index d03babee456..9fc0161684b 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -676,13 +676,31 @@ zink_transfer_map(struct pipe_context *pctx,
}
static void
-zink_transfer_flush_region(struct pipe_context *ctx,
+zink_transfer_flush_region(struct pipe_context *pctx,
struct pipe_transfer *ptrans,
const struct pipe_box *box)
{
+ struct zink_context *ctx = zink_context(pctx);
struct zink_resource *res = zink_resource(ptrans->resource);
- if (res->base.target == PIPE_BUFFER)
- util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
+ struct zink_transfer *trans = (struct zink_transfer *)ptrans;
+
+ if (trans->base.usage & PIPE_MAP_WRITE) {
+ if (trans->staging_res) {
+ uint32_t batch_uses = zink_get_resource_usage(res);
+ if (batch_uses & (ZINK_RESOURCE_ACCESS_WRITE << ZINK_COMPUTE_BATCH_ID)) {
+ zink_wait_on_batch(ctx, ZINK_COMPUTE_BATCH_ID);
+ batch_uses &= ~(ZINK_RESOURCE_ACCESS_WRITE << ZINK_COMPUTE_BATCH_ID);
+ batch_uses &= ~(ZINK_RESOURCE_ACCESS_READ << ZINK_COMPUTE_BATCH_ID);
+ }
+
+ struct zink_resource *staging_res = zink_resource(trans->staging_res);
+ zink_transfer_copy_bufimage(ctx, res, staging_res, trans, true);
+ if (batch_uses)
+ pctx->flush(pctx, NULL, 0);
+ }
+ if (res->base.target == PIPE_BUFFER)
+ util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
+ }
}
static void
@@ -696,19 +714,6 @@ zink_transfer_unmap(struct pipe_context *pctx,
if (trans->staging_res) {
struct zink_resource *staging_res = zink_resource(trans->staging_res);
vkUnmapMemory(screen->dev, staging_res->mem);
-
- if (trans->base.usage & PIPE_MAP_WRITE) {
- struct zink_context *ctx = zink_context(pctx);
- uint32_t batch_uses = zink_get_resource_usage(res);
- if (batch_uses >= ZINK_RESOURCE_ACCESS_WRITE) {
- if (batch_uses & (ZINK_RESOURCE_ACCESS_WRITE << ZINK_COMPUTE_BATCH_ID))
- zink_wait_on_batch(ctx, ZINK_COMPUTE_BATCH_ID);
- zink_fence_wait(pctx);
- }
- zink_transfer_copy_bufimage(ctx, res, staging_res, trans, true);
- }
-
- pipe_resource_reference(&trans->staging_res, NULL);
} else
vkUnmapMemory(screen->dev, res->mem);
if ((trans->base.usage & PIPE_MAP_PERSISTENT) && !(trans->base.usage & PIPE_MAP_COHERENT))
@@ -716,6 +721,9 @@ zink_transfer_unmap(struct pipe_context *pctx,
if (!(trans->base.usage & (PIPE_MAP_FLUSH_EXPLICIT | PIPE_MAP_COHERENT))) {
zink_transfer_flush_region(pctx, ptrans, &ptrans->box);
}
+
+ if (trans->staging_res)
+ pipe_resource_reference(&trans->staging_res, NULL);
pipe_resource_reference(&trans->base.resource, NULL);
slab_free(&ctx->transfer_pool, ptrans);
}
More information about the mesa-commit
mailing list