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