Mesa (main): zink: attempt to handle some resource unmap cases in 32bit envs
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jun 30 13:23:44 UTC 2021
Module: Mesa
Branch: main
Commit: 936c21d37674ee49850fd5de59c60e8457c57487
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=936c21d37674ee49850fd5de59c60e8457c57487
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri May 7 19:08:18 2021 -0400
zink: attempt to handle some resource unmap cases in 32bit envs
address space is limited here, so in some cases it's worthwhile to
unmap resources
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11594>
---
src/gallium/drivers/zink/zink_resource.c | 15 ++++++++++++++-
src/gallium/drivers/zink/zink_resource.h | 3 +++
src/gallium/drivers/zink/zink_screen.h | 2 ++
3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 419f66572cf..060f54babf0 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -116,6 +116,11 @@ cache_or_free_mem(struct zink_screen *screen, struct zink_resource_object *obj)
mkey->seen_count--;
if (util_dynarray_num_elements(array, struct mem_cache_entry) < seen) {
struct mem_cache_entry mc = { obj->mem, obj->map };
+ screen->mem_cache_size += obj->size;
+ if (sizeof(void*) == 4 && obj->map) {
+ vkUnmapMemory(screen->dev, obj->mem);
+ mc.map = NULL;
+ }
util_dynarray_append(array, struct mem_cache_entry, mc);
simple_mtx_unlock(&screen->mem_cache_mtx);
return;
@@ -548,6 +553,8 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
struct mem_cache_entry mc = util_dynarray_pop(array, struct mem_cache_entry);
obj->mem = mc.mem;
obj->map = mc.map;
+ screen->mem_cache_size -= reqs.size;
+ screen->mem_cache_count--;
}
} else {
mkey = ralloc(screen->resource_mem_cache, struct mem_key);
@@ -1086,11 +1093,16 @@ zink_transfer_map(struct pipe_context *pctx,
vkFlushMappedMemoryRanges(screen->dev, 1, &range);
}
ptr = ((uint8_t *)base) + offset;
+ if (sizeof(void*) == 4)
+ trans->base.b.usage |= ZINK_MAP_TEMPORARY;
}
}
if ((usage & PIPE_MAP_PERSISTENT) && !(usage & PIPE_MAP_COHERENT))
res->obj->persistent_maps++;
+ if (trans->base.b.usage & (PIPE_MAP_ONCE | ZINK_MAP_TEMPORARY))
+ p_atomic_inc(&res->obj->map_count);
+
*transfer = &trans->base.b;
return ptr;
}
@@ -1148,7 +1160,8 @@ zink_transfer_unmap(struct pipe_context *pctx,
zink_transfer_flush_region(pctx, ptrans, &ptrans->box);
}
- if (trans->base.b.usage & PIPE_MAP_ONCE && !trans->staging_res && !screen->threaded)
+ if ((trans->base.b.usage & PIPE_MAP_ONCE && !trans->staging_res && !screen->threaded) ||
+ (trans->base.b.usage & ZINK_MAP_TEMPORARY && !p_atomic_dec_return(&res->obj->map_count)))
unmap_resource(screen, res);
if ((trans->base.b.usage & PIPE_MAP_PERSISTENT) && !(trans->base.b.usage & PIPE_MAP_COHERENT))
res->obj->persistent_maps--;
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index bb00ffe6f77..0db91aedce1 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -42,6 +42,8 @@ struct zink_context;
#include <vulkan/vulkan.h>
+#define ZINK_MAP_TEMPORARY (PIPE_MAP_DRV_PRV << 0)
+
enum zink_resource_access {
ZINK_RESOURCE_ACCESS_READ = 1,
ZINK_RESOURCE_ACCESS_WRITE = 32,
@@ -81,6 +83,7 @@ struct zink_resource_object {
struct zink_batch_usage *reads;
struct zink_batch_usage *writes;
void *map;
+ unsigned map_count;
bool is_buffer;
bool host_visible;
bool coherent;
diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h
index ef786898b35..6b10c32215d 100644
--- a/src/gallium/drivers/zink/zink_screen.h
+++ b/src/gallium/drivers/zink/zink_screen.h
@@ -90,6 +90,8 @@ struct zink_screen {
simple_mtx_t mem_cache_mtx;
struct hash_table *resource_mem_cache;
+ uint64_t mem_cache_size;
+ unsigned mem_cache_count;
unsigned shader_id;
More information about the mesa-commit
mailing list