[Mesa-dev] [PATCH 02/12] nvc0: allow to push constant buffers for compute on Fermi

Ilia Mirkin imirkin at alum.mit.edu
Sat Feb 6 22:52:42 UTC 2016


On Sat, Feb 6, 2016 at 5:38 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> Constant buffers must be bound for compute like for 3D. This is done
> by adding a new 'shader' parameter to nvc0_cb_bo_push() which allows
> to use the compute channel for compute shaders, and the 3D channel
> for other shader types.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/gallium/drivers/nouveau/nvc0/nvc0_context.h        |  2 +-
>  src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c |  2 +-
>  src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c       | 15 +++++++++++----
>  3 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
> index 2e726e6..2ab70e8 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
> @@ -301,7 +301,7 @@ nve4_p2mf_push_linear(struct nouveau_context *nv,
>                        unsigned size, const void *data);
>  void
>  nvc0_cb_bo_push(struct nouveau_context *,
> -                struct nouveau_bo *bo, unsigned domain,
> +                struct nouveau_bo *bo, unsigned domain, unsigned shader,
>                  unsigned base, unsigned size,
>                  unsigned offset, unsigned words, const uint32_t *data);
>
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
> index 2bb9b44..97fcfbc 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
> @@ -441,7 +441,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0)
>                 PUSH_DATA (push, (0 << 4) | 1);
>              }
>              nvc0_cb_bo_push(&nvc0->base, bo, NV_VRAM_DOMAIN(&nvc0->screen->base),
> -                         base, nvc0->state.uniform_buffer_bound[s],
> +                         base, nvc0->state.uniform_buffer_bound[s], s,
>                           0, (size + 3) / 4,
>                           nvc0->constbuf[s][0].u.data);
>           } else {
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
> index 279c7e9..5cea822 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c
> @@ -4,6 +4,7 @@
>  #include "nvc0/nvc0_context.h"
>
>  #include "nv50/nv50_defs.xml.h"
> +#include "nvc0/nvc0_compute.xml.h"
>
>  struct nvc0_transfer {
>     struct pipe_transfer base;
> @@ -532,7 +533,7 @@ nvc0_cb_push(struct nouveau_context *nv,
>
>     if (cb) {
>        nvc0_cb_bo_push(nv, res->bo, res->domain,
> -                      res->offset + cb->offset, cb->size,
> +                      res->offset + cb->offset, cb->size, s,

I think you want s - 1 here. Also if a CB is bound to both a graphics
and compute pipeline, it'll get uploaded via the graphics pipeline.
Which leads me to my below comment:

>                        offset - cb->offset, words, data);
>     } else {
>        nv->push_data(nv, res->bo, res->offset + offset, res->domain,
> @@ -543,7 +544,7 @@ nvc0_cb_push(struct nouveau_context *nv,
>  void
>  nvc0_cb_bo_push(struct nouveau_context *nv,
>                  struct nouveau_bo *bo, unsigned domain,
> -                unsigned base, unsigned size,
> +                unsigned base, unsigned size, unsigned shader,
>                  unsigned offset, unsigned words, const uint32_t *data)
>  {
>     struct nouveau_pushbuf *push = nv->pushbuf;
> @@ -557,7 +558,10 @@ nvc0_cb_bo_push(struct nouveau_context *nv,
>     assert(offset < size);
>     assert(offset + words * 4 <= size);
>
> -   BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
> +   if (unlikely(shader == 5))
> +      BEGIN_NVC0(push, NVC0_COMPUTE(CB_SIZE), 3);
> +   else
> +      BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);

Did you observe this to *actually* matter (i.e. using the compute cb
upload thing)? I find that hard to believe... Also aren't these gone
on kepler compute? That'll be fun...

>     PUSH_DATA (push, size);
>     PUSH_DATAh(push, bo->offset + base);
>     PUSH_DATA (push, bo->offset + base);
> @@ -567,7 +571,10 @@ nvc0_cb_bo_push(struct nouveau_context *nv,
>
>        PUSH_SPACE(push, nr + 2);
>        PUSH_REFN (push, bo, NOUVEAU_BO_WR | domain);
> -      BEGIN_1IC0(push, NVC0_3D(CB_POS), nr + 1);
> +      if (unlikely(shader == 5))
> +         BEGIN_1IC0(push, NVC0_COMPUTE(CB_POS), nr + 1);
> +      else
> +         BEGIN_1IC0(push, NVC0_3D(CB_POS), nr + 1);
>        PUSH_DATA (push, offset);
>        PUSH_DATAp(push, data, nr);
>
> --
> 2.6.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list