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;
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);
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;
}
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--;
#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,
struct zink_batch_usage *reads;
struct zink_batch_usage *writes;
void *map;
+ unsigned map_count;
bool is_buffer;
bool host_visible;
bool coherent;