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;