From: Faith Ekstrand Date: Wed, 19 Jul 2023 22:34:27 +0000 (-0500) Subject: nvk: Add a buffer alignment helper X-Git-Tag: upstream/23.3.3~3844 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0498eeba32f18ca22550c9cfdfe29dd902bfd36e;p=platform%2Fupstream%2Fmesa.git nvk: Add a buffer alignment helper This consolodates buffer alignment calculations into one place, including physical device queries, buffer creation, and buffer memory requirements queries. Part-of: --- diff --git a/src/nouveau/vulkan/nvk_buffer.c b/src/nouveau/vulkan/nvk_buffer.c index bf8fa3c..1351ddc 100644 --- a/src/nouveau/vulkan/nvk_buffer.c +++ b/src/nouveau/vulkan/nvk_buffer.c @@ -4,6 +4,26 @@ #include "nvk_device_memory.h" #include "nvk_physical_device.h" +uint32_t +nvk_get_buffer_alignment(UNUSED const struct nvk_physical_device *pdev, + VkBufferUsageFlags usage_flags, + UNUSED VkBufferCreateFlags create_flags) +{ + uint32_t alignment = 16; + + if (usage_flags & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) + alignment = MAX2(alignment, NVK_MIN_UBO_ALIGNMENT); + + if (usage_flags & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) + alignment = MAX2(alignment, NVK_MIN_SSBO_ALIGNMENT); + + if (usage_flags & (VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) + alignment = MAX2(alignment, NVK_MIN_UBO_ALIGNMENT); + + return alignment; +} + VKAPI_ATTR VkResult VKAPI_CALL nvk_CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, @@ -45,9 +65,14 @@ nvk_GetDeviceBufferMemoryRequirements( { VK_FROM_HANDLE(nvk_device, dev, device); + const uint32_t alignment = + nvk_get_buffer_alignment(nvk_device_physical(dev), + pInfo->pCreateInfo->usage, + pInfo->pCreateInfo->flags); + pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) { - .size = pInfo->pCreateInfo->size, - .alignment = 64, /* TODO */ + .size = ALIGN_POT(pInfo->pCreateInfo->size, alignment), + .alignment = alignment, .memoryTypeBits = BITFIELD_MASK(dev->pdev->mem_type_cnt), }; diff --git a/src/nouveau/vulkan/nvk_buffer.h b/src/nouveau/vulkan/nvk_buffer.h index 495bb05..0237572 100644 --- a/src/nouveau/vulkan/nvk_buffer.h +++ b/src/nouveau/vulkan/nvk_buffer.h @@ -8,6 +8,12 @@ #include "vulkan/runtime/vk_buffer.h" struct nvk_device_memory; +struct nvk_physical_device; + +uint32_t ATTRIBUTE_PURE +nvk_get_buffer_alignment(const struct nvk_physical_device *pdev, + VkBufferUsageFlags usage_flags, + VkBufferCreateFlags create_flags); struct nvk_buffer { struct vk_buffer vk; diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 46daab4..538f6ae 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -1,6 +1,7 @@ #include "nvk_physical_device.h" #include "nvk_bo_sync.h" +#include "nvk_buffer.h" #include "nvk_entrypoints.h" #include "nvk_format.h" #include "nvk_image.h" @@ -110,9 +111,14 @@ nvk_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, .lineWidthGranularity = 0.0625, .nonCoherentAtomSize = 64, .minMemoryMapAlignment = 64, - .minUniformBufferOffsetAlignment = NVK_MIN_UBO_ALIGNMENT, - .minTexelBufferOffsetAlignment = NVK_MIN_UBO_ALIGNMENT, - .minStorageBufferOffsetAlignment = NVK_MIN_SSBO_ALIGNMENT, + .minUniformBufferOffsetAlignment = + nvk_get_buffer_alignment(pdev, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, 0), + .minTexelBufferOffsetAlignment = + nvk_get_buffer_alignment(pdev, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, + 0), + .minStorageBufferOffsetAlignment = + nvk_get_buffer_alignment(pdev, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, 0), .maxVertexInputAttributeOffset = 2047, .maxVertexInputAttributes = 32, .maxVertexInputBindingStride = 2048,