From aa31d38bcf9be3d6485613c6d1fa4e8f0ccd3958 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alejandro=20Pi=C3=B1eiro?= Date: Wed, 11 Jan 2023 14:04:26 +0100 Subject: [PATCH] v3dv: pass alignment to v3dv_buffer_init Although for any buffer created by the user, or any API that can be called by the user (like GetDeviceBufferMemoryRequirements) the alignment is V3D_NON_COHERENT_ATOM_SIZE, there are internal uses of a buffer that could require a fine-grained alignment (like when used as a alias for a image, that has different alignment requirements). Note that an alternative would have created a v3dv_buffer_init_with_alignment (or similar name), but this option seemed easier. Part-of: --- src/broadcom/vulkan/v3dv_device.c | 11 ++++++----- src/broadcom/vulkan/v3dv_meta_copy.c | 3 ++- src/broadcom/vulkan/v3dv_private.h | 3 ++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index d0f4cc7..3a95857 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -2699,12 +2699,13 @@ v3dv_BindImageMemory2(VkDevice _device, void v3dv_buffer_init(struct v3dv_device *device, - const VkBufferCreateInfo *pCreateInfo, - struct v3dv_buffer *buffer) + const VkBufferCreateInfo *pCreateInfo, + struct v3dv_buffer *buffer, + uint32_t alignment) { buffer->size = pCreateInfo->size; buffer->usage = pCreateInfo->usage; - buffer->alignment = V3D_NON_COHERENT_ATOM_SIZE; + buffer->alignment = alignment; } static void @@ -2751,7 +2752,7 @@ v3dv_GetDeviceBufferMemoryRequirementsKHR( V3DV_FROM_HANDLE(v3dv_device, device, _device); struct v3dv_buffer buffer = { 0 }; - v3dv_buffer_init(device, pInfo->pCreateInfo, &buffer); + v3dv_buffer_init(device, pInfo->pCreateInfo, &buffer, V3D_NON_COHERENT_ATOM_SIZE); get_buffer_memory_requirements(&buffer, pMemoryRequirements); } @@ -2806,7 +2807,7 @@ v3dv_CreateBuffer(VkDevice _device, if (buffer == NULL) return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - v3dv_buffer_init(device, pCreateInfo, buffer); + v3dv_buffer_init(device, pCreateInfo, buffer, V3D_NON_COHERENT_ATOM_SIZE); /* Limit allocations to 32-bit */ const VkDeviceSize aligned_size = align64(buffer->size, buffer->alignment); diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c index 5129ab2..ac00eaa 100644 --- a/src/broadcom/vulkan/v3dv_meta_copy.c +++ b/src/broadcom/vulkan/v3dv_meta_copy.c @@ -1246,7 +1246,8 @@ copy_image_linear_texel_buffer(struct v3dv_cmd_buffer *cmd_buffer, .usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, }; - v3dv_buffer_init(cmd_buffer->device, &buf_create_info, &src_buffer); + v3dv_buffer_init(cmd_buffer->device, &buf_create_info, &src_buffer, + src->alignment); const VkBindBufferMemoryInfo buf_bind_info = { .sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO, diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 85209fc..0628d43 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -736,7 +736,8 @@ struct v3dv_buffer { void v3dv_buffer_init(struct v3dv_device *device, const VkBufferCreateInfo *pCreateInfo, - struct v3dv_buffer *buffer); + struct v3dv_buffer *buffer, + uint32_t alignment); void v3dv_buffer_bind_memory(const VkBindBufferMemoryInfo *info); -- 2.7.4