Mesa (main): zink: collapse 'dedicated' allocation into zink_bo
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Aug 17 20:59:00 UTC 2021
Module: Mesa
Branch: main
Commit: 67239cf7540b2c38d70352f1722f3e79a4d8b1bd
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=67239cf7540b2c38d70352f1722f3e79a4d8b1bd
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Jul 30 10:09:23 2021 -0400
zink: collapse 'dedicated' allocation into zink_bo
this simplifies all the map and memory management code
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12421>
---
src/gallium/drivers/zink/zink_bo.c | 16 ++++----
src/gallium/drivers/zink/zink_bo.h | 2 +-
src/gallium/drivers/zink/zink_resource.c | 67 ++++++++------------------------
src/gallium/drivers/zink/zink_resource.h | 46 ++--------------------
4 files changed, 30 insertions(+), 101 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_bo.c b/src/gallium/drivers/zink/zink_bo.c
index b73d6cfbb9d..29c1bd0b729 100644
--- a/src/gallium/drivers/zink/zink_bo.c
+++ b/src/gallium/drivers/zink/zink_bo.c
@@ -231,7 +231,8 @@ bo_create_internal(struct zink_screen *screen,
uint64_t size,
unsigned alignment,
enum zink_heap heap,
- unsigned flags)
+ unsigned flags,
+ const void *pNext)
{
struct zink_bo *bo;
bool init_pb_cache;
@@ -255,8 +256,9 @@ bo_create_internal(struct zink_screen *screen,
pb_cache_init_entry(&screen->pb.bo_cache, bo->cache_entry, &bo->base, heap);
}
- VkMemoryAllocateInfo mai = {0};
+ VkMemoryAllocateInfo mai;
mai.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ mai.pNext = pNext;
mai.allocationSize = size;
mai.memoryTypeIndex = screen->heap_map[heap];
if (screen->info.mem_props.memoryTypes[mai.memoryTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
@@ -339,7 +341,7 @@ sparse_backing_alloc(struct zink_screen *screen, struct zink_bo *bo,
size = MAX2(size, ZINK_SPARSE_BUFFER_PAGE_SIZE);
buf = zink_bo_create(screen, size, ZINK_SPARSE_BUFFER_PAGE_SIZE,
- bo->base.placement, ZINK_ALLOC_NO_SUBALLOC);
+ bo->base.placement, ZINK_ALLOC_NO_SUBALLOC, NULL);
if (!buf) {
FREE(best_backing->chunks);
FREE(best_backing);
@@ -517,7 +519,7 @@ error_alloc_commitments:
}
struct pb_buffer *
-zink_bo_create(struct zink_screen *screen, uint64_t size, unsigned alignment, enum zink_heap heap, enum zink_alloc_flag flags)
+zink_bo_create(struct zink_screen *screen, uint64_t size, unsigned alignment, enum zink_heap heap, enum zink_alloc_flag flags, const void *pNext)
{
struct zink_bo *bo;
/* pull in sparse flag */
@@ -606,12 +608,12 @@ no_slab:
}
/* Create a new one. */
- bo = bo_create_internal(screen, size, alignment, heap, flags);
+ bo = bo_create_internal(screen, size, alignment, heap, flags, pNext);
if (!bo) {
/* Clean up buffer managers and try again. */
clean_up_buffer_managers(screen);
- bo = bo_create_internal(screen, size, alignment, heap, flags);
+ bo = bo_create_internal(screen, size, alignment, heap, flags, pNext);
if (!bo)
return NULL;
}
@@ -896,7 +898,7 @@ bo_slab_alloc(void *priv, unsigned heap, unsigned entry_size, unsigned group_ind
}
assert(slab_size != 0);
- slab->buffer = zink_bo(zink_bo_create(screen, slab_size, slab_size, heap, 0));
+ slab->buffer = zink_bo(zink_bo_create(screen, slab_size, slab_size, heap, 0, NULL));
if (!slab->buffer)
goto fail;
diff --git a/src/gallium/drivers/zink/zink_bo.h b/src/gallium/drivers/zink/zink_bo.h
index f189a89ec41..403e2d6de5a 100644
--- a/src/gallium/drivers/zink/zink_bo.h
+++ b/src/gallium/drivers/zink/zink_bo.h
@@ -175,7 +175,7 @@ void
zink_bo_deinit(struct zink_screen *screen);
struct pb_buffer *
-zink_bo_create(struct zink_screen *screen, uint64_t size, unsigned alignment, enum zink_heap heap, enum zink_alloc_flag flags);
+zink_bo_create(struct zink_screen *screen, uint64_t size, unsigned alignment, enum zink_heap heap, enum zink_alloc_flag flags, const void *pNext);
static inline uint64_t
zink_bo_get_offset(const struct zink_bo *bo)
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 8aa21c0cef5..ff6400fceac 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -88,10 +88,7 @@ zink_destroy_resource_object(struct zink_screen *screen, struct zink_resource_ob
util_dynarray_fini(&obj->tmp);
zink_descriptor_set_refs_clear(&obj->desc_set_refs, obj);
- if (obj->dedicated)
- vkFreeMemory(screen->dev, obj->mem, NULL);
- else
- zink_bo_unref(screen, obj->bo);
+ zink_bo_unref(screen, obj->bo);
FREE(obj);
}
@@ -645,31 +642,19 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
mai.pNext = &memory_wsi_info;
}
- if (!mai.pNext) {
- unsigned alignment = MAX2(reqs.alignment, 256);
- if (templ->usage == PIPE_USAGE_STAGING && obj->is_buffer)
- alignment = MAX2(alignment, screen->info.props.limits.minMemoryMapAlignment);
- obj->alignment = alignment;
- obj->bo = zink_bo(zink_bo_create(screen, reqs.size, alignment, heap, 0));
- if (!obj->bo)
- goto fail2;
- if (aflags == ZINK_ALLOC_SPARSE) {
- obj->size = templ->width0;
- } else {
- obj->offset = zink_bo_get_offset(obj->bo);
- obj->mem = zink_bo_get_mem(obj->bo);
- obj->size = zink_bo_get_size(obj->bo);
- }
+ unsigned alignment = MAX2(reqs.alignment, 256);
+ if (templ->usage == PIPE_USAGE_STAGING && obj->is_buffer)
+ alignment = MAX2(alignment, screen->info.props.limits.minMemoryMapAlignment);
+ obj->alignment = alignment;
+ obj->bo = zink_bo(zink_bo_create(screen, reqs.size, alignment, heap, mai.pNext ? ZINK_ALLOC_NO_SUBALLOC : 0, mai.pNext));
+ if (!obj->bo)
+ goto fail2;
+ if (aflags == ZINK_ALLOC_SPARSE) {
+ obj->size = templ->width0;
} else {
- obj->dedicated = true;
- obj->offset = 0;
- obj->size = reqs.size;
- }
-
- /* TODO: sparse buffers should probably allocate multiple regions of memory instead of giant blobs? */
- if (obj->dedicated && vkAllocateMemory(screen->dev, &mai, NULL, &obj->mem) != VK_SUCCESS) {
- debug_printf("vkAllocateMemory failed\n");
- goto fail2;
+ obj->offset = zink_bo_get_offset(obj->bo);
+ obj->mem = zink_bo_get_mem(obj->bo);
+ obj->size = zink_bo_get_size(obj->bo);
}
if (templ->target == PIPE_BUFFER) {
@@ -683,7 +668,7 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
return obj;
fail3:
- vkFreeMemory(screen->dev, obj->mem, NULL);
+ zink_bo_unref(screen, obj->bo);
fail2:
if (templ->target == PIPE_BUFFER)
@@ -1042,30 +1027,14 @@ zink_resource_init_mem_range(struct zink_screen *screen, struct zink_resource_ob
static void *
map_resource(struct zink_screen *screen, struct zink_resource *res)
{
- VkResult result = VK_SUCCESS;
- if (res->obj->map)
- return res->obj->map;
assert(res->obj->host_visible);
- if (!res->obj->dedicated)
- return zink_bo_map(screen, res->obj->bo);
- result = vkMapMemory(screen->dev, res->obj->mem, res->obj->offset,
- res->obj->size, 0, &res->obj->map);
- if (zink_screen_handle_vkresult(screen, result))
- return res->obj->map;
- return NULL;
+ return zink_bo_map(screen, res->obj->bo);
}
static void
unmap_resource(struct zink_screen *screen, struct zink_resource *res)
{
- if (!res->obj->dedicated)
- zink_bo_unmap(screen, res->obj->bo);
- else {
- if (!p_atomic_dec_zero(&res->obj->map_count))
- return;
- vkUnmapMemory(screen->dev, res->obj->mem);
- }
- res->obj->map = NULL;
+ zink_bo_unmap(screen, res->obj->bo);
}
static void *
@@ -1196,7 +1165,7 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne
VkDeviceSize offset = res->obj->offset + trans->offset;
VkMappedMemoryRange range = zink_resource_init_mem_range(screen, res->obj, offset, size);
if (vkInvalidateMappedMemoryRanges(screen->dev, 1, &range) != VK_SUCCESS) {
- vkUnmapMemory(screen->dev, res->obj->mem);
+ zink_bo_unmap(screen, res->obj->bo);
return NULL;
}
}
@@ -1326,8 +1295,6 @@ zink_transfer_map(struct pipe_context *pctx,
}
if (sizeof(void*) == 4)
trans->base.b.usage |= ZINK_MAP_TEMPORARY;
- if (res->obj->dedicated)
- p_atomic_inc(&res->obj->map_count);
}
if ((usage & PIPE_MAP_PERSISTENT) && !(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 ceed23ea5e8..b58e8f66304 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -60,8 +60,6 @@ struct zink_resource_object {
struct zink_batch_usage *reads;
struct zink_batch_usage *writes;
- void *map;
- unsigned map_count;
struct util_dynarray tmp;
@@ -82,7 +80,6 @@ struct zink_resource_object {
VkDeviceMemory mem;
VkDeviceSize offset, size, alignment;
- bool dedicated;
bool host_visible;
bool coherent;
};
@@ -189,17 +186,12 @@ zink_resource_object_init_storage(struct zink_context *ctx, struct zink_resource
static inline bool
zink_resource_usage_is_unflushed(const struct zink_resource *res)
{
- if (res->obj->dedicated)
- return zink_batch_usage_is_unflushed(res->obj->reads) ||
- zink_batch_usage_is_unflushed(res->obj->writes);
return zink_bo_has_unflushed_usage(res->obj->bo);
}
static inline bool
zink_resource_usage_is_unflushed_write(const struct zink_resource *res)
{
- if (res->obj->dedicated)
- return zink_batch_usage_is_unflushed(res->obj->writes);
return zink_batch_usage_is_unflushed(res->obj->bo->writes);
}
@@ -207,75 +199,43 @@ zink_resource_usage_is_unflushed_write(const struct zink_resource *res)
static inline bool
zink_resource_usage_matches(const struct zink_resource *res, const struct zink_batch_state *bs)
{
- if (res->obj->dedicated)
- return zink_batch_usage_matches(res->obj->reads, bs) ||
- zink_batch_usage_matches(res->obj->writes, bs);
return zink_bo_usage_matches(res->obj->bo, bs);
}
static inline bool
zink_resource_has_usage(const struct zink_resource *res)
{
- if (res->obj->dedicated)
- return zink_batch_usage_exists(res->obj->reads) ||
- zink_batch_usage_exists(res->obj->writes);
return zink_bo_has_usage(res->obj->bo);
}
static inline bool
zink_resource_has_unflushed_usage(const struct zink_resource *res)
{
- if (res->obj->dedicated)
- return zink_batch_usage_is_unflushed(res->obj->reads) ||
- zink_batch_usage_is_unflushed(res->obj->writes);
return zink_bo_has_unflushed_usage(res->obj->bo);
}
static inline bool
zink_resource_usage_check_completion(struct zink_screen *screen, struct zink_resource *res, enum zink_resource_access access)
{
- if (res->obj->dedicated) {
- 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;
- }
return zink_bo_usage_check_completion(screen, res->obj->bo, access);
}
static inline void
zink_resource_usage_wait(struct zink_context *ctx, struct zink_resource *res, enum zink_resource_access access)
{
- if (res->obj->dedicated) {
- 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);
- } else
- zink_bo_usage_wait(ctx, res->obj->bo, access);
+ zink_bo_usage_wait(ctx, res->obj->bo, access);
}
static inline void
zink_resource_usage_set(struct zink_resource *res, struct zink_batch_state *bs, bool write)
{
- if (res->obj->dedicated) {
- if (write)
- zink_batch_usage_set(&res->obj->writes, bs);
- else
- zink_batch_usage_set(&res->obj->reads, bs);
- } else
- zink_bo_usage_set(res->obj->bo, bs, write);
+ zink_bo_usage_set(res->obj->bo, bs, write);
}
static inline void
zink_resource_object_usage_unset(struct zink_resource_object *obj, struct zink_batch_state *bs)
{
- if (obj->dedicated) {
- zink_batch_usage_unset(&obj->reads, bs);
- zink_batch_usage_unset(&obj->writes, bs);
- } else
- zink_bo_usage_unset(obj->bo, bs);
+ zink_bo_usage_unset(obj->bo, bs);
}
#endif
More information about the mesa-commit
mailing list