Mesa (main): zink: track invalidation for image resources
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jun 6 00:51:24 UTC 2022
Module: Mesa
Branch: main
Commit: 3e2c65281d7a460c8f05ff025fc9e742a509030b
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3e2c65281d7a460c8f05ff025fc9e742a509030b
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Jun 3 13:50:55 2022 -0400
zink: track invalidation for image resources
an image only has valid data if:
* it's imported
* it's written to
* it's mapped for write
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16877>
---
src/gallium/drivers/zink/zink_batch.c | 2 ++
src/gallium/drivers/zink/zink_resource.c | 17 ++++++++++++++---
src/gallium/drivers/zink/zink_resource.h | 1 +
3 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index 47b2f20293d..9cc316a5234 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -502,6 +502,8 @@ 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)
+ 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 6decdd6fefa..ae5a5137fd2 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -1429,8 +1429,12 @@ zink_resource_from_handle(struct pipe_screen *pscreen,
modifier_count = 1;
}
struct pipe_resource *pres = resource_create(pscreen, &templ2, whandle, usage, &modifier, modifier_count, NULL);
- if (pres)
- zink_resource(pres)->drm_format = whandle->format;
+ if (pres) {
+ struct zink_resource *res = zink_resource(pres);
+ res->drm_format = whandle->format;
+ if (pres->target != PIPE_BUFFER)
+ res->valid = true;
+ }
return pres;
#else
return NULL;
@@ -1492,7 +1496,10 @@ zink_resource_from_memobj(struct pipe_screen *pscreen,
{
struct zink_memory_object *memobj = (struct zink_memory_object *)pmemobj;
- return resource_create(pscreen, templ, &memobj->whandle, 0, NULL, 0, NULL);
+ struct pipe_resource *pres = resource_create(pscreen, templ, &memobj->whandle, 0, NULL, 0, NULL);
+ if (pres && pres->target != PIPE_BUFFER)
+ zink_resource(pres)->valid = true;
+ return pres;
}
static bool
@@ -1537,6 +1544,8 @@ 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;
}
static void
@@ -1925,6 +1934,8 @@ zink_image_map(struct pipe_context *pctx,
}
if (!ptr)
goto fail;
+ if (usage & PIPE_MAP_WRITE)
+ res->valid = true;
if (sizeof(void*) == 4)
trans->base.b.usage |= ZINK_MAP_TEMPORARY;
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index f2726d962f7..d27ca955786 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -135,6 +135,7 @@ struct zink_resource {
VkImageAspectFlags aspect;
bool optimal_tiling;
bool need_2D;
+ bool valid;
uint8_t fb_binds; //not counted in all_binds
};
};
More information about the mesa-commit
mailing list