diff --git a/.pick_status.json b/.pick_status.json index 5ffde43683a..7e1fb16c180 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -574,7 +574,7 @@ "description": "anv: allocate sparse descriptor buffers from the correct heap", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "c6a91f16952cfe9f685cc6a0a185161364fdcdcf", "notes": null diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 4f3b38d6d1c..b704a147de6 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -5178,6 +5178,16 @@ VkResult anv_CreateBuffer( fprintf(stderr, "=== %s %s:%d flags:0x%08x\n", __func__, __FILE__, __LINE__, pCreateInfo->flags); + if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) && + device->physical->sparse_type == ANV_SPARSE_TYPE_TRTT) { + VkBufferUsageFlags2KHR usages = get_buffer_usages(pCreateInfo); + if (usages & (VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT | + VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT)) { + return vk_errorf(device, VK_ERROR_UNKNOWN, + "Cannot support sparse descriptor buffers with TRTT."); + } + } + /* Don't allow creating buffers bigger than our address space. The real * issue here is that we may align up the buffer size and we don't want * doing so to cause roll-over. However, no one has any business @@ -5215,6 +5225,14 @@ VkResult anv_CreateBuffer( client_address = *((const uint64_t *)opaque_info->opaqueCaptureDescriptorData); } + /* If this buffer will be used as a descriptor buffer, make sure we + * allocate it on the correct heap. + */ + if (buffer->vk.usage & (VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT | + VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT)) { + alloc_flags |= ANV_BO_ALLOC_DYNAMIC_VISIBLE_POOL; + } + VkResult result = anv_init_sparse_bindings(device, buffer->vk.size, &buffer->sparse_data, alloc_flags, client_address,