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@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11594>
This commit is contained in:
Mike Blumenkrantz 2021-05-07 19:08:18 -04:00 committed by Marge Bot
parent 9d599ed417
commit 936c21d376
3 changed files with 19 additions and 1 deletions

View file

@ -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--;

View file

@ -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;

View file

@ -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;