diff --git a/src/gallium/drivers/lima/lima_draw.c b/src/gallium/drivers/lima/lima_draw.c index c66eae1ae10..fc218eea544 100644 --- a/src/gallium/drivers/lima/lima_draw.c +++ b/src/gallium/drivers/lima/lima_draw.c @@ -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 diff --git a/src/gallium/drivers/lima/lima_job.c b/src/gallium/drivers/lima/lima_job.c index 48f3ddafac3..a74e2bb91e9 100644 --- a/src/gallium/drivers/lima/lima_job.c +++ b/src/gallium/drivers/lima/lima_job.c @@ -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); diff --git a/src/gallium/drivers/lima/lima_job.h b/src/gallium/drivers/lima/lima_job.h index f9691236db5..a43b8be1c10 100644 --- a/src/gallium/drivers/lima/lima_job.h +++ b/src/gallium/drivers/lima/lima_job.h @@ -31,6 +31,8 @@ #include +#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; };