Mesa (main): zink: add some resource util functions for batch usage

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 27 00:05:29 UTC 2021


Module: Mesa
Branch: main
Commit: 13d732ec5b44c603edf5534d1f70f469ec071aaf
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=13d732ec5b44c603edf5534d1f70f469ec071aaf

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Wed Jul  7 09:36:45 2021 -0400

zink: add some resource util functions for batch usage

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12008>

---

 src/gallium/drivers/zink/zink_resource.c | 11 +----
 src/gallium/drivers/zink/zink_resource.h | 77 ++++++++++++++++++++++++++++++--
 2 files changed, 76 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index f0ae8ba9bb5..895b66cad4f 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -1090,13 +1090,6 @@ zink_transfer_copy_bufimage(struct zink_context *ctx,
                                 0, &box);
 }
 
-bool
-zink_resource_has_usage(struct zink_resource *res, enum zink_resource_access usage)
-{
-   uint32_t batch_uses = get_resource_usage(res);
-   return batch_uses & usage;
-}
-
 ALWAYS_INLINE static void
 align_offset_size(const VkDeviceSize alignment, VkDeviceSize *offset, VkDeviceSize *size, VkDeviceSize obj_size)
 {
@@ -1186,7 +1179,7 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne
    }
 
    if ((usage & PIPE_MAP_WRITE) &&
-       (usage & PIPE_MAP_DISCARD_RANGE || (!(usage & PIPE_MAP_READ) && zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_RW))) &&
+       (usage & PIPE_MAP_DISCARD_RANGE || (!(usage & PIPE_MAP_READ) && zink_resource_has_usage(res))) &&
        ((!res->obj->host_visible) || !(usage & (PIPE_MAP_UNSYNCHRONIZED | PIPE_MAP_PERSISTENT)))) {
 
       /* Check if mapping this buffer would cause waiting for the GPU.
@@ -1359,7 +1352,7 @@ zink_transfer_map(struct pipe_context *pctx,
          base = map_resource(screen, res);
          if (!base)
             return NULL;
-         if (zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_RW)) {
+         if (zink_resource_has_usage(res)) {
             if (usage & PIPE_MAP_WRITE)
                zink_fence_wait(pctx);
             else
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index 3c362e6ba6a..15533fed611 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -161,9 +161,6 @@ zink_resource_init_mem_range(struct zink_screen *screen, struct zink_resource_ob
 void
 zink_resource_setup_transfer_layouts(struct zink_context *ctx, struct zink_resource *src, struct zink_resource *dst);
 
-bool
-zink_resource_has_usage(struct zink_resource *res, enum zink_resource_access usage);
-
 void
 zink_destroy_resource_object(struct zink_screen *screen, struct zink_resource_object *resource_object);
 
@@ -188,4 +185,78 @@ zink_resource_tmp_buffer(struct zink_screen *screen, struct zink_resource *res,
 
 bool
 zink_resource_object_init_storage(struct zink_context *ctx, struct zink_resource *res);
+
+#ifndef __cplusplus
+
+static inline bool
+zink_resource_usage_is_unflushed(const struct zink_resource *res)
+{
+   return zink_batch_usage_is_unflushed(res->obj->reads) ||
+          zink_batch_usage_is_unflushed(res->obj->writes);
+}
+
+static inline bool
+zink_resource_usage_is_unflushed_write(const struct zink_resource *res)
+{
+   return zink_batch_usage_is_unflushed(res->obj->writes);
+}
+
+
+static inline bool
+zink_resource_usage_matches(const struct zink_resource *res, const struct zink_batch_state *bs)
+{
+   return zink_batch_usage_matches(res->obj->reads, bs) ||
+          zink_batch_usage_matches(res->obj->writes, bs);
+}
+
+static inline bool
+zink_resource_has_usage(const struct zink_resource *res)
+{
+   return zink_batch_usage_exists(res->obj->reads) ||
+          zink_batch_usage_exists(res->obj->writes);
+}
+
+static inline bool
+zink_resource_has_unflushed_usage(const struct zink_resource *res)
+{
+   return zink_batch_usage_is_unflushed(res->obj->reads) ||
+          zink_batch_usage_is_unflushed(res->obj->writes);
+}
+
+static inline bool
+zink_resource_usage_check_completion(struct zink_screen *screen, struct zink_resource *res, enum zink_resource_access access)
+{
+   if (access & ZINK_RESOURCE_ACCESS_READ && !zink_screen_usage_check_completion(screen, res->obj->reads))
+      return false;
+   if (access & ZINK_RESOURCE_ACCESS_WRITE && !zink_screen_usage_check_completion(screen, res->obj->writes))
+      return false;
+   return true;
+}
+
+static inline void
+zink_resource_usage_wait(struct zink_context *ctx, struct zink_resource *res, enum zink_resource_access access)
+{
+   if (access & ZINK_RESOURCE_ACCESS_READ)
+      zink_batch_usage_wait(ctx, res->obj->reads);
+   if (access & ZINK_RESOURCE_ACCESS_WRITE)
+      zink_batch_usage_wait(ctx, res->obj->writes);
+}
+
+static inline void
+zink_resource_usage_set(struct zink_resource *res, struct zink_batch_state *bs, bool write)
+{
+   if (write)
+      zink_batch_usage_set(&res->obj->writes, bs);
+   else
+      zink_batch_usage_set(&res->obj->reads, bs);
+}
+
+static inline void
+zink_resource_object_usage_unset(struct zink_resource_object *obj, struct zink_batch_state *bs)
+{
+   zink_batch_usage_unset(&obj->reads, bs);
+   zink_batch_usage_unset(&obj->writes, bs);
+}
+
+#endif
 #endif



More information about the mesa-commit mailing list