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];