v3dv: move the framebuffer setup code for buffer copy/fill to a helper

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c
index 523f3ce..10f8111 100644
--- a/src/broadcom/vulkan/v3dv_meta_copy.c
+++ b/src/broadcom/vulkan/v3dv_meta_copy.c
@@ -625,6 +625,42 @@
    cl_emit(rcl, END_OF_RENDERING, end);
 }
 
+/* Figure out a TLB size configuration for a number of pixels to process.
+ * Beware that we can't "render" more than 4096x4096 pixels in a single job,
+ * if the pixel count is larger than this, the caller might need to split
+ * the job and call this function multiple times.
+ */
+static void
+setup_framebuffer_for_pixel_count(struct v3dv_framebuffer *framebuffer,
+                                  uint32_t num_pixels,
+                                  uint32_t internal_bpp)
+{
+   const uint32_t max_dim_pixels = 4096;
+   const uint32_t max_pixels = max_dim_pixels * max_dim_pixels;
+
+   uint32_t w, h;
+   if (num_pixels > max_pixels) {
+      w = max_dim_pixels;
+      h = max_dim_pixels;
+   } else {
+      w = num_pixels;
+      h = 1;
+      while (w > max_dim_pixels || ((w % 2) == 0 && w > 2 * h)) {
+         w >>= 1;
+         h <<= 1;
+      }
+   }
+   assert(w <= max_dim_pixels && h <= max_dim_pixels);
+   assert(w * h <= num_pixels);
+
+   /* Skip tiling calculations if the framebuffer setup has not changed */
+   if (w != framebuffer->width ||
+       h != framebuffer->height ||
+       internal_bpp != framebuffer->internal_bpp) {
+      setup_framebuffer_params(framebuffer, w, h, 1, internal_bpp);
+   }
+}
+
 static struct v3dv_job *
 copy_buffer(struct v3dv_cmd_buffer *cmd_buffer,
             struct v3dv_bo *dst,
@@ -662,32 +698,9 @@
    struct v3dv_job *job;
    uint32_t src_offset = region->srcOffset;
    uint32_t dst_offset = region->dstOffset;
+   struct v3dv_framebuffer framebuffer = { .width = 0 };
    while (num_items > 0) {
-      /* Figure out a TLB size configuration for the number of items to copy.
-       * We can't "render" more than 4096x4096 pixels in a single job, so make
-       * sure we don't exceed that by splitting the job into multiple jobs if
-       * needed.
-       */
-      const uint32_t max_dim_items = 4096;
-      const uint32_t max_items = max_dim_items * max_dim_items;
-      uint32_t width, height;
-      if (num_items > max_items) {
-         width = max_dim_items;
-         height = max_dim_items;
-      } else {
-         width = num_items;
-         height = 1;
-         while (width > max_dim_items ||
-                ((width % 2) == 0 && width > 2 * height)) {
-            width >>= 1;
-            height <<= 1;
-         }
-      }
-      assert(width <= max_dim_items && height <= max_dim_items);
-      assert(width * height <= num_items);
-
-      struct v3dv_framebuffer framebuffer;
-      setup_framebuffer_params(&framebuffer, width, height, 1, internal_bpp);
+      setup_framebuffer_for_pixel_count(&framebuffer, num_items, internal_bpp);
 
       job = v3dv_cmd_buffer_start_job(cmd_buffer, false);
       v3dv_cmd_buffer_start_frame(cmd_buffer, &framebuffer);
@@ -699,7 +712,7 @@
 
       v3dv_cmd_buffer_finish_job(cmd_buffer);
 
-      const uint32_t items_copied = width * height;
+      const uint32_t items_copied = framebuffer.width * framebuffer.height;
       const uint32_t bytes_copied = items_copied * item_size;
       num_items -= items_copied;
       src_offset += bytes_copied;
@@ -951,27 +964,9 @@
    const uint32_t internal_type = V3D_INTERNAL_TYPE_8UI;
    uint32_t num_items = size / 4;
 
+   struct v3dv_framebuffer framebuffer = { .width = 0 };
    while (num_items > 0) {
-      const uint32_t max_dim_items = 4096;
-      const uint32_t max_items = max_dim_items * max_dim_items;
-      uint32_t width, height;
-      if (num_items > max_items) {
-         width = max_dim_items;
-         height = max_dim_items;
-      } else {
-         width = num_items;
-         height = 1;
-         while (width > max_dim_items ||
-                ((width % 2) == 0 && width > 2 * height)) {
-            width >>= 1;
-            height <<= 1;
-         }
-      }
-      assert(width <= max_dim_items && height <= max_dim_items);
-      assert(width * height <= num_items);
-
-      struct v3dv_framebuffer framebuffer;
-      setup_framebuffer_params(&framebuffer, width, height, 1, internal_bpp);
+      setup_framebuffer_for_pixel_count(&framebuffer, num_items, internal_bpp);
 
       struct v3dv_job *job = v3dv_cmd_buffer_start_job(cmd_buffer, false);
       v3dv_cmd_buffer_start_frame(cmd_buffer, &framebuffer);
@@ -983,7 +978,7 @@
 
       v3dv_cmd_buffer_finish_job(cmd_buffer);
 
-      const uint32_t items_copied = width * height;
+      const uint32_t items_copied = framebuffer.width * framebuffer.height;
       const uint32_t bytes_copied = items_copied * 4;
       num_items -= items_copied;
       offset += bytes_copied;