From 5da667ad3e5fc3cce98828a265c9801cc3200a7e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 1 Feb 2024 10:26:10 -0500 Subject: [PATCH] zink: fix sparse bo placement the util function here takes a bitmask of memory type indices, not properties. rename the function and correct the usage fixes sparse on nvidia blob Fixes: c71287e70c2 ("zink: correct sparse bo mem_type_idx placement") Part-of: (cherry picked from commit 3b025d6b42476d27f5e8d6e2347f85874a50eb72) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_bo.c | 2 +- src/gallium/drivers/zink/zink_bo.h | 4 ++-- src/gallium/drivers/zink/zink_resource.c | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index c3464bf255a..cf4d2ee09b4 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -10224,7 +10224,7 @@ "description": "zink: fix sparse bo placement", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "c71287e70c2bf4aac96b24635e48ec13cd31fddf", "notes": null diff --git a/src/gallium/drivers/zink/zink_bo.c b/src/gallium/drivers/zink/zink_bo.c index b5b4f070765..7d4fa522b3e 100644 --- a/src/gallium/drivers/zink/zink_bo.c +++ b/src/gallium/drivers/zink/zink_bo.c @@ -548,7 +548,7 @@ bo_sparse_create(struct zink_screen *screen, uint64_t size) bo->base.base.alignment_log2 = util_logbase2(ZINK_SPARSE_BUFFER_PAGE_SIZE); bo->base.base.size = size; bo->base.vtbl = &bo_sparse_vtbl; - unsigned placement = zink_mem_type_idx_from_bits(screen, ZINK_HEAP_DEVICE_LOCAL_SPARSE, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + unsigned placement = zink_mem_type_idx_from_types(screen, ZINK_HEAP_DEVICE_LOCAL_SPARSE, UINT32_MAX); assert(placement != UINT32_MAX); bo->base.base.placement = placement; bo->unique_id = p_atomic_inc_return(&screen->pb.next_bo_unique_id); diff --git a/src/gallium/drivers/zink/zink_bo.h b/src/gallium/drivers/zink/zink_bo.h index f747df6d869..cd7338aff5a 100644 --- a/src/gallium/drivers/zink/zink_bo.h +++ b/src/gallium/drivers/zink/zink_bo.h @@ -94,10 +94,10 @@ zink_heap_from_domain_flags(VkMemoryPropertyFlags domains, enum zink_alloc_flag } static ALWAYS_INLINE unsigned -zink_mem_type_idx_from_bits(struct zink_screen *screen, enum zink_heap heap, uint32_t bits) +zink_mem_type_idx_from_types(struct zink_screen *screen, enum zink_heap heap, uint32_t types) { for (unsigned i = 0; i < screen->heap_count[heap]; i++) { - if (bits & BITFIELD_BIT(screen->heap_map[heap][i])) { + if (types & BITFIELD_BIT(screen->heap_map[heap][i])) { return screen->heap_map[heap][i]; } } diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index b2b85014855..92f9d720ba3 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -1267,7 +1267,7 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t alignment = MAX2(alignment, screen->info.props.limits.minMemoryMapAlignment); obj->alignment = alignment; - if (zink_mem_type_idx_from_bits(screen, heap, reqs.memoryTypeBits) == UINT32_MAX) { + if (zink_mem_type_idx_from_types(screen, heap, reqs.memoryTypeBits) == UINT32_MAX) { /* not valid based on reqs; demote to more compatible type */ switch (heap) { case ZINK_HEAP_DEVICE_LOCAL_VISIBLE: @@ -1279,7 +1279,7 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t default: break; } - assert(zink_mem_type_idx_from_bits(screen, heap, reqs.memoryTypeBits) != UINT32_MAX); + assert(zink_mem_type_idx_from_types(screen, heap, reqs.memoryTypeBits) != UINT32_MAX); } retry: