From 5897ade22dc34911706ed33a588b8f46ea5e37c6 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sun, 5 Jun 2022 09:14:30 -0400 Subject: [PATCH] zink: flag renderpass for change if image resource changes valid state the next renderpass instance will need to use different load ops, so flag it here to ensure that gets picked up Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_batch.c | 5 ++++- src/gallium/drivers/zink/zink_resource.c | 13 ++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 9cc316a5234..514a4b77b01 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -502,8 +502,11 @@ zink_batch_resource_usage_set(struct zink_batch *batch, struct zink_resource *re res->obj->dt_has_data = true; } } - if (write && !res->obj->is_buffer) + if (write && !res->obj->is_buffer) { + if (!res->valid && res->fb_binds) + batch->state->ctx->rp_changed = true; res->valid = true; + } zink_resource_usage_set(res, batch->state, write); /* multiple array entries are fine */ if (!res->obj->coherent && res->obj->persistent_maps) diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index ae5a5137fd2..cd748d9c467 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -1544,8 +1544,12 @@ zink_resource_invalidate(struct pipe_context *pctx, struct pipe_resource *pres) { if (pres->target == PIPE_BUFFER) invalidate_buffer(zink_context(pctx), zink_resource(pres)); - else - zink_resource(pres)->valid = false; + else { + struct zink_resource *res = zink_resource(pres); + if (res->valid && res->fb_binds) + zink_context(pctx)->rp_changed = true; + res->valid = false; + } } static void @@ -1934,8 +1938,11 @@ zink_image_map(struct pipe_context *pctx, } if (!ptr) goto fail; - if (usage & PIPE_MAP_WRITE) + if (usage & PIPE_MAP_WRITE) { + if (!res->valid && res->fb_binds) + ctx->rp_changed = true; res->valid = true; + } if (sizeof(void*) == 4) trans->base.b.usage |= ZINK_MAP_TEMPORARY;