v3dv: pass alignment to v3dv_buffer_init
authorAlejandro Piñeiro <apinheiro@igalia.com>
Wed, 11 Jan 2023 13:04:26 +0000 (14:04 +0100)
committerMarge Bot <emma+marge@anholt.net>
Mon, 16 Jan 2023 14:10:21 +0000 (14:10 +0000)
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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19950>

src/broadcom/vulkan/v3dv_device.c
src/broadcom/vulkan/v3dv_meta_copy.c
src/broadcom/vulkan/v3dv_private.h

index d0f4cc7..3a95857 100644 (file)
@@ -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);
index 5129ab2..ac00eaa 100644 (file)
@@ -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,
index 85209fc..0628d43 100644 (file)
@@ -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);