v3dv: precompute more tiling info at framebuffer creation time

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c
index 6a7ff27..334e2e6 100644
--- a/src/broadcom/vulkan/v3dv_device.c
+++ b/src/broadcom/vulkan/v3dv_device.c
@@ -1336,6 +1336,26 @@
       DIV_ROUND_UP(framebuffer->width, framebuffer->tile_width);
    framebuffer->draw_tiles_y =
       DIV_ROUND_UP(framebuffer->height, framebuffer->tile_height);
+
+   /* Size up our supertiles until we get under the limit */
+   const uint32_t max_supertiles = 256;
+   framebuffer->supertile_width = 1;
+   framebuffer->supertile_height = 1;
+   for (;;) {
+      framebuffer->frame_width_in_supertiles =
+         DIV_ROUND_UP(framebuffer->draw_tiles_x, framebuffer->supertile_width);
+      framebuffer->frame_height_in_supertiles =
+         DIV_ROUND_UP(framebuffer->draw_tiles_y, framebuffer->supertile_height);
+      const uint32_t num_supertiles = framebuffer->frame_width_in_supertiles *
+                                      framebuffer->frame_height_in_supertiles;
+      if (num_supertiles < max_supertiles)
+         break;
+
+      if (framebuffer->supertile_width < framebuffer->supertile_height)
+         framebuffer->supertile_width++;
+      else
+         framebuffer->supertile_height++;
+   }
 }
 
 VkResult
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index f7fd5e7..5bd2e94 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -338,6 +338,10 @@
    uint32_t tile_height;
    uint32_t draw_tiles_x;
    uint32_t draw_tiles_y;
+   uint32_t supertile_width;
+   uint32_t supertile_height;
+   uint32_t frame_width_in_supertiles;
+   uint32_t frame_height_in_supertiles;
 
    uint32_t attachment_count;
    struct v3dv_image_view *attachments[0];