#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,
{
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),
};
#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;
#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"
.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,