R-b with pleasure! I'm not sure why we didn't get around to this
earlier, but this is awesome. Thank you! :)
On Tue, Jul 02, 2019 at 03:23:53PM +0200, Boris Brezillon wrote:
> Instead of manually adding the BOs from the various SLAB pools plus
> the one backing the color FB, we insert them in the BO set attached
> to the job and let panfrost_drm_submit_job() pass all BOs from this set
> to the SUBMIT ioctl.
> This means we are now passing all referenced BOs and let the scheduler
> wait on referenced BO fences if needed.
> 
> Signed-off-by: Boris Brezillon <boris.brezil...@collabora.com>
> ---
>  src/gallium/drivers/panfrost/pan_drm.c | 46 +++++++++++++++-----------
>  1 file changed, 27 insertions(+), 19 deletions(-)
> 
> diff --git a/src/gallium/drivers/panfrost/pan_drm.c 
> b/src/gallium/drivers/panfrost/pan_drm.c
> index ac82ec583021..8de4f483435c 100644
> --- a/src/gallium/drivers/panfrost/pan_drm.c
> +++ b/src/gallium/drivers/panfrost/pan_drm.c
> @@ -192,12 +192,13 @@ panfrost_drm_export_bo(struct panfrost_screen *screen, 
> const struct panfrost_bo
>  }
>  
>  static int
> -panfrost_drm_submit_job(struct panfrost_context *ctx, u64 job_desc, int 
> reqs, struct pipe_surface *surf)
> +panfrost_drm_submit_job(struct panfrost_context *ctx, u64 job_desc, int reqs)
>  {
>          struct pipe_context *gallium = (struct pipe_context *) ctx;
>          struct panfrost_screen *screen = pan_screen(gallium->screen);
> +        struct panfrost_job *job = panfrost_get_job_for_fbo(ctx);
>          struct drm_panfrost_submit submit = {0,};
> -        int bo_handles[7];
> +        int *bo_handles, ret;
>  
>          submit.in_syncs = (u64) (uintptr_t) &ctx->out_sync;
>          submit.in_sync_count = 1;
> @@ -207,22 +208,19 @@ panfrost_drm_submit_job(struct panfrost_context *ctx, 
> u64 job_desc, int reqs, st
>       submit.jc = job_desc;
>       submit.requirements = reqs;
>  
> -     if (surf) {
> -             struct panfrost_resource *res = pan_resource(surf->texture);
> -             assert(res->bo->gem_handle > 0);
> -             bo_handles[submit.bo_handle_count++] = res->bo->gem_handle;
> +     bo_handles = calloc(job->bos->entries, sizeof(*bo_handles));
> +     assert(bo_handles);
> +
> +     set_foreach(job->bos, entry) {
> +             struct panfrost_bo *bo = (struct panfrost_bo *)entry->key;
> +             assert(bo->gem_handle > 0);
> +             bo_handles[submit.bo_handle_count++] = bo->gem_handle;
>       }
>  
> -     /* TODO: Add here the transient pools */
> -        /* TODO: Add here the BOs listed in the panfrost_job */
> -        bo_handles[submit.bo_handle_count++] = ctx->shaders.bo->gem_handle;
> -        bo_handles[submit.bo_handle_count++] = 
> ctx->scratchpad.bo->gem_handle;
> -        bo_handles[submit.bo_handle_count++] = 
> ctx->tiler_heap.bo->gem_handle;
> -        bo_handles[submit.bo_handle_count++] = 
> ctx->varying_mem.bo->gem_handle;
> -        bo_handles[submit.bo_handle_count++] = 
> ctx->tiler_polygon_list.bo->gem_handle;
>       submit.bo_handles = (u64) (uintptr_t) bo_handles;
> -
> -     if (drmIoctl(screen->fd, DRM_IOCTL_PANFROST_SUBMIT, &submit)) {
> +     ret = drmIoctl(screen->fd, DRM_IOCTL_PANFROST_SUBMIT, &submit);
> +     free(bo_handles);
> +     if (ret) {
>               fprintf(stderr, "Error submitting: %m\n");
>               return errno;
>       }
> @@ -245,13 +243,23 @@ panfrost_drm_submit_vs_fs_job(struct panfrost_context 
> *ctx, bool has_draws, bool
>  
>          struct panfrost_job *job = panfrost_get_job_for_fbo(ctx);
>  
> +        /* TODO: Add here the transient pools */
> +        panfrost_job_add_bo(job, ctx->shaders.bo);
> +        panfrost_job_add_bo(job, ctx->scratchpad.bo);
> +        panfrost_job_add_bo(job, ctx->tiler_heap.bo);
> +        panfrost_job_add_bo(job, ctx->varying_mem.bo);
> +        panfrost_job_add_bo(job, ctx->tiler_polygon_list.bo);
> +
>          if (job->first_job.gpu) {
> -             ret = panfrost_drm_submit_job(ctx, job->first_job.gpu, 0, NULL);
> -             assert(!ret);
> -     }
> +                ret = panfrost_drm_submit_job(ctx, job->first_job.gpu, 0);
> +                assert(!ret);
> +        }
>  
>          if (job->first_tiler.gpu || job->clear) {
> -                ret = panfrost_drm_submit_job(ctx, 
> panfrost_fragment_job(ctx, has_draws), PANFROST_JD_REQ_FS, surf);
> +                struct panfrost_resource *res = pan_resource(surf->texture);
> +                assert(res->bo);
> +                panfrost_job_add_bo(job, res->bo);
> +                ret = panfrost_drm_submit_job(ctx, 
> panfrost_fragment_job(ctx, has_draws), PANFROST_JD_REQ_FS);
>                  assert(!ret);
>          }
>  
> -- 
> 2.21.0
> 

Attachment: signature.asc
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to