[Mesa-dev] [PATCH v2 22/37] panfrost: Extend the panfrost_batch_add_bo() API to pass access flags

Boris Brezillon boris.brezillon at collabora.com
Mon Sep 16 14:13:45 UTC 2019


On Mon, 16 Sep 2019 09:59:15 -0400
Alyssa Rosenzweig <alyssa at rosenzweig.io> wrote:

> PAN_BO_GPU_ACCESS_* is rather wordy. We're a GPU driver, of course it's
> GPU access :)

Well, the driver can also do CPU accesses to the same BOs :P.

> 
> Could we just do PAN_BO_ACCESS_* instead?

I guess that's fine as long as it's documented.

> 
> >  static mali_ptr
> >  panfrost_upload_tex(
> >          struct panfrost_context *ctx,
> > +        enum pipe_shader_type st,
> >          struct panfrost_sampler_view *view)
> >  {
> >          if (!view)
> > @@ -610,7 +611,11 @@ panfrost_upload_tex(
> >  
> >          /* Add the BO to the job so it's retained until the job is done. */
> >          struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
> > -        panfrost_batch_add_bo(batch, rsrc->bo);
> > +        panfrost_batch_add_bo(batch, rsrc->bo,
> > +                              PAN_BO_GPU_ACCESS_SHARED | PAN_BO_GPU_ACCESS_READ |
> > +                              PAN_BO_GPU_ACCESS_VERTEX_TILER |
> > +                              (st == PIPE_SHADER_FRAGMENT ?
> > +                               PAN_BO_GPU_ACCESS_FRAGMENT : 0));  
> 
> I'm not sure this is quite right... should it maybe be:
> 
> (st == PIPE_SHADER_FRAGMENT ? PAN_BO_ACCESS_FRAGMENT :
> PAN_BO_ACCESS_VERTEX_TILER)

That's a good question. I wasn't sure so I decided to put the
vertex/tiler unconditionally.

> 
> I.e., if it's accessed from the fragment shader, is it necessarily
> needed for the vertex/tiler part?
> 
> > -        panfrost_batch_add_bo(batch, bo);
> > +        panfrost_batch_add_bo(batch, bo,
> > +                              PAN_BO_GPU_ACCESS_SHARED | PAN_BO_GPU_ACCESS_RW |
> > +                              PAN_BO_GPU_ACCESS_VERTEX_TILER |
> > +                              (st == PIPE_SHADER_FRAGMENT ?
> > +                               PAN_BO_GPU_ACCESS_FRAGMENT : 0));  
> 
> Ditto. We should maybe have a `pan_bo_access_for_stage(enum
> pipe_shader_type)` to abstract this logic.

Good idea.

> 
> > @@ -803,7 +813,12 @@ panfrost_map_constant_buffer_gpu(
> >          struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
> >  
> >          if (rsrc) {
> > -                panfrost_batch_add_bo(batch, rsrc->bo);
> > +                panfrost_batch_add_bo(batch, rsrc->bo,
> > +                                      PAN_BO_GPU_ACCESS_SHARED |
> > +                                      PAN_BO_GPU_ACCESS_READ |
> > +                                      PAN_BO_GPU_ACCESS_VERTEX_TILER |
> > +                                      (st == PIPE_SHADER_FRAGMENT ?
> > +                                       PAN_BO_GPU_ACCESS_FRAGMENT : 0));  
> 
> Ditto.
> 
> >          if (!info->has_user_indices) {
> >                  /* Only resources can be directly mapped */
> > -                panfrost_batch_add_bo(batch, rsrc->bo);
> > +                panfrost_batch_add_bo(batch, rsrc->bo,
> > +                                      PAN_BO_GPU_ACCESS_FRAGMENT);
> >                  return rsrc->bo->gpu + offset;  
> 
> The index buffer is to determine geometry, so it is definitely accessed
> from the vertex/tiler chain.

Oops, that's a mistake. I meant PAN_BO_GPU_ACCESS_VERTEX_TILER here.

> 
> I'm not sure if it's also accessed by the fragment chain. Also, should
> this have ACCESS_SHARED | ACCESS_READ to be consistent with the others?

It should definitely have ACCESS_SHARED | ACCESS_READ.

> 
> > @@ -69,7 +69,10 @@ panfrost_emit_streamout(
> >          /* Grab the BO and bind it to the batch */
> >          struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
> >          struct panfrost_bo *bo = pan_resource(target->buffer)->bo;
> > -        panfrost_batch_add_bo(batch, bo);
> > +        panfrost_batch_add_bo(batch, bo,
> > +                              PAN_BO_GPU_ACCESS_SHARED |
> > +                              PAN_BO_GPU_ACCESS_WRITE |
> > +                              PAN_BO_GPU_ACCESS_VERTEX_TILER);  
> 
> We operate somewhat like:
> 
> [ Vertices ] -- vertex shader --> [ Varyings ] -- tiler --> [ Geometry ]
> 
> So varyings are WRITE from the perspective of the VERTEX but READ from
> the perspective of the TILER and FRAGMENT.
> 
> Now, this is for streamout. However, streamout does not imply rasterize
> discard. Hence, it is legal to have streamout and also render that
> geometry with a FRAGMENT job. So it's premature to drop the READ and
> FRAGMENT flags (this will presumably regress a bunch of dEQP-GLES3 tests
> for streamout).

Okay, will add PAN_BO_GPU_ACCESS_FRAGMENT and turn
PAN_BO_GPU_ACCESS_WRITE into PAN_BO_GPU_ACCESS_RW.

Thanks for the review.

Boris


More information about the mesa-dev mailing list