Module: Mesa Branch: main Commit: fb52be93762b34d49c547058478c36a449a28383 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb52be93762b34d49c547058478c36a449a28383
Author: Boris Brezillon <[email protected]> Date: Tue Apr 19 11:12:53 2022 +0200 dzn: Lower alignment requirements when allocating buffers or single-sample images VkMemoryDedicatedAllocateInfo, when present, provides us with extra information about the memory usage, which allow us to lower the alignment requirements. Reviewed-by: Erik Faye-Lund <[email protected]> Reviewed-by: Jesse Natalie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16926> --- src/microsoft/vulkan/dzn_device.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c index 65a113c1f1c..d156f9c8864 100644 --- a/src/microsoft/vulkan/dzn_device.c +++ b/src/microsoft/vulkan/dzn_device.c @@ -2142,6 +2142,9 @@ dzn_device_memory_create(struct dzn_device *device, mem->size = pAllocateInfo->allocationSize; + const struct dzn_buffer *buffer = NULL; + const struct dzn_image *image = NULL; + vk_foreach_struct_const(ext, pAllocateInfo->pNext) { switch (ext->sType) { case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: { @@ -2152,6 +2155,15 @@ dzn_device_memory_create(struct dzn_device *device, assert(exp->handleTypes == 0); break; } + case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: { + const VkMemoryDedicatedAllocateInfo *dedicated = + (const VkMemoryDedicatedAllocateInfo *)ext; + + buffer = dzn_buffer_from_handle(dedicated->buffer); + image = dzn_image_from_handle(dedicated->image); + assert(!buffer || !image); + break; + } default: dzn_debug_ignored_stype(ext->sType); break; @@ -2162,12 +2174,22 @@ dzn_device_memory_create(struct dzn_device *device, &pdevice->memory.memoryTypes[pAllocateInfo->memoryTypeIndex]; D3D12_HEAP_DESC heap_desc = { 0 }; - // TODO: fix all of these: + heap_desc.SizeInBytes = pAllocateInfo->allocationSize; - heap_desc.Alignment = - heap_desc.SizeInBytes >= D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT ? - D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT : - D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; + if (buffer) { + heap_desc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; + } else if (image) { + heap_desc.Alignment = + image->vk.samples > 1 ? + D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT : + D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; + } else { + heap_desc.Alignment = + heap_desc.SizeInBytes >= D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT ? + D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT : + D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; + } + heap_desc.Flags = dzn_physical_device_get_heap_flags_for_mem_type(pdevice, pAllocateInfo->memoryTypeIndex);
