panfrost: Compute and use polygon list body size
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 14 Jun 2019 14:08:51 +0000 (07:08 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 17 Jun 2019 14:59:14 +0000 (07:59 -0700)
This is a bit of a hack, but it gets the point across.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_tiler.c

index f66ee434c04cff31fd22c288b23c5a2b3adb12d8..3c9c8a9f8e68c1af2a4ffdbfcd4a9aea53f6ed04 100644 (file)
@@ -153,7 +153,6 @@ panfrost_emit_mfbd(struct panfrost_context *ctx)
 
                 /* See pan_tiler.c */
                 .tiler_polygon_list  = ctx->misc_0.gpu,
-                .tiler_polygon_list_size = 0x0,
 
                 .width1 = MALI_POSITIVE(width),
                 .height1 = MALI_POSITIVE(height),
@@ -176,9 +175,15 @@ panfrost_emit_mfbd(struct panfrost_context *ctx)
         unsigned header_size = panfrost_tiler_header_size(
                         width, height, framebuffer.tiler_hierarchy_mask);
 
+        unsigned body_size = panfrost_tiler_body_size(
+                        width, height, framebuffer.tiler_hierarchy_mask);
+
         framebuffer.tiler_polygon_list_body =
                 framebuffer.tiler_polygon_list + header_size;
 
+        framebuffer.tiler_polygon_list_size =
+                header_size + body_size;
+
         return framebuffer;
 }
 
index 22482ff1f916144d78ca6befa8a3e158e009a16f..ef5a09104f682f406e5c2545a5ccd501bb21fee1 100644 (file)
@@ -254,3 +254,17 @@ panfrost_tiler_header_size(unsigned width, unsigned height, uint8_t mask)
 
         return panfrost_raw_header_size(width, height, masked_count);
 }
+
+/* The body seems to be about 512 bytes per tile. Noting that the header is
+ * about 8 bytes per tile, we can be a little sloppy and estimate the body size
+ * to be equal to the header size * (512/8). Given the header size is a
+ * considerable overestimate, this is fine. Eventually, we should maybe figure
+ * out how to actually implement this. */
+
+unsigned
+panfrost_tiler_body_size(unsigned width, unsigned height, uint8_t mask)
+{
+        unsigned header_size = panfrost_tiler_header_size(width, height, mask);
+        return ALIGN_POT(header_size * 512 / 8, 512);
+}
+