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