lima: limit number of draws per job
authorVasily Khoruzhick <anarsoul@gmail.com>
Thu, 8 Apr 2021 06:32:46 +0000 (23:32 -0700)
committerMarge Bot <eric+marge@anholt.net>
Mon, 12 Apr 2021 22:34:12 +0000 (22:34 +0000)
Otherwise we may hit tile heap size limit if an app issues too many
draws per job.

Reviewed-by: Erico Nunes <nunes.erico@gmail.com>
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10121>

src/gallium/drivers/lima/lima_draw.c
src/gallium/drivers/lima/lima_job.c
src/gallium/drivers/lima/lima_job.h

index c66eae1..fc218ee 100644 (file)
@@ -1183,6 +1183,17 @@ lima_draw_vbo(struct pipe_context *pctx,
       lima_draw_vbo_indexed(pctx, info, &draws[0]);
    else
       lima_draw_vbo_count(pctx, info, &draws[0]);
+
+   job->draws++;
+   /* Flush job if we hit the limit of draws per job otherwise we may
+    * hit tile heap size limit */
+   if (job->draws > MAX_DRAWS_PER_JOB) {
+      unsigned resolve = job->resolve;
+      lima_do_job(job);
+      job = lima_job_get(ctx);
+      /* Subsequent job will need to resolve the same buffers */
+      lima_update_job_wb(ctx, resolve);
+   }
 }
 
 void
index 48f3dda..a74e2bb 100644 (file)
@@ -99,6 +99,7 @@ lima_job_create(struct lima_context *ctx)
 
    s->damage_rect.minx = s->damage_rect.miny = 0xffff;
    s->damage_rect.maxx = s->damage_rect.maxy = 0;
+   s->draws = 0;
 
    s->clear.depth = 0x00ffffff;
 
@@ -301,7 +302,7 @@ lima_job_get_damage(struct lima_job *job)
 static bool
 lima_fb_cbuf_needs_reload(struct lima_job *job)
 {
-   if (!(job->key.cbuf && (job->resolve & PIPE_CLEAR_COLOR0)))
+   if (!job->key.cbuf)
       return false;
 
    struct lima_surface *surf = lima_surface(job->key.cbuf);
@@ -323,7 +324,7 @@ lima_fb_cbuf_needs_reload(struct lima_job *job)
 static bool
 lima_fb_zsbuf_needs_reload(struct lima_job *job)
 {
-   if (!(job->key.zsbuf && (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))))
+   if (!job->key.zsbuf)
       return false;
 
    struct lima_surface *surf = lima_surface(job->key.zsbuf);
index f969123..a43b8be 100644 (file)
@@ -31,6 +31,8 @@
 
 #include <pipe/p_state.h>
 
+#define MAX_DRAWS_PER_JOB 2500
+
 struct lima_context;
 struct lima_bo;
 struct lima_dump;
@@ -80,6 +82,8 @@ struct lima_job {
 
    struct lima_job_fb_info fb;
 
+   int draws;
+
    /* for dump command stream */
    struct lima_dump *dump;
 };