radv: add new upload alloc aligned api
authorDave Airlie <airlied@redhat.com>
Wed, 30 Nov 2022 23:42:03 +0000 (09:42 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 7 Feb 2023 02:47:39 +0000 (12:47 +1000)
The video buffers need to have objects aligned at certain ranges,
this enhances the uploader to allow an alignment to be specified.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20388>

src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_private.h

index defe903..9071994 100644 (file)
@@ -492,8 +492,9 @@ radv_cmd_buffer_resize_upload_buf(struct radv_cmd_buffer *cmd_buffer, uint64_t m
 }
 
 bool
-radv_cmd_buffer_upload_alloc(struct radv_cmd_buffer *cmd_buffer, unsigned size,
-                             unsigned *out_offset, void **ptr)
+radv_cmd_buffer_upload_alloc_aligned(struct radv_cmd_buffer *cmd_buffer, unsigned size,
+                                     unsigned alignment,
+                                     unsigned *out_offset, void **ptr)
 {
    assert(size % 4 == 0);
 
@@ -508,6 +509,8 @@ radv_cmd_buffer_upload_alloc(struct radv_cmd_buffer *cmd_buffer, unsigned size,
    if ((size & (line_size - 1)) > gap)
       offset = align(offset, line_size);
 
+   if (alignment)
+      offset = align(offset, alignment);
    if (offset + size > cmd_buffer->upload.size) {
       if (!radv_cmd_buffer_resize_upload_buf(cmd_buffer, size))
          return false;
@@ -522,6 +525,13 @@ radv_cmd_buffer_upload_alloc(struct radv_cmd_buffer *cmd_buffer, unsigned size,
 }
 
 bool
+radv_cmd_buffer_upload_alloc(struct radv_cmd_buffer *cmd_buffer, unsigned size,
+                             unsigned *out_offset, void **ptr)
+{
+   return radv_cmd_buffer_upload_alloc_aligned(cmd_buffer, size, 0, out_offset, ptr);
+}
+
+bool
 radv_cmd_buffer_upload_data(struct radv_cmd_buffer *cmd_buffer, unsigned size, const void *data,
                             unsigned *out_offset)
 {
index be41a61..f8ccf68 100644 (file)
@@ -1804,6 +1804,9 @@ struct radv_ps_epilog_key radv_generate_ps_epilog_key(const struct radv_graphics
                                                       bool disable_mrt_compaction);
 
 void radv_cmd_buffer_reset_rendering(struct radv_cmd_buffer *cmd_buffer);
+bool radv_cmd_buffer_upload_alloc_aligned(struct radv_cmd_buffer *cmd_buffer, unsigned size,
+                                          unsigned alignment,
+                                          unsigned *out_offset, void **ptr);
 bool radv_cmd_buffer_upload_alloc(struct radv_cmd_buffer *cmd_buffer, unsigned size,
                                   unsigned *out_offset, void **ptr);
 bool radv_cmd_buffer_upload_data(struct radv_cmd_buffer *cmd_buffer, unsigned size,