<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 17 December 2015 at 04:02, Ilia Mirkin <span dir="ltr"><<a href="mailto:imirkin@alum.mit.edu" target="_blank">imirkin@alum.mit.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>On Wed, Dec 16, 2015 at 9:39 AM, Julien Isorce <<a href="mailto:j.isorce@samsung.com" target="_blank">j.isorce@samsung.com</a>> wrote:<br>
> It allows to call nouveau_vp3_bsp_next multiple times<br>
> between one begin/end.<br>
><br>
> It is required to support st/va.<br>
><br>
> <a href="https://bugs.freedesktop.org/show_bug.cgi?id=89969" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=89969</a><br>
><br>
> Signed-off-by: Julien Isorce <<a href="mailto:j.isorce@samsung.com" target="_blank">j.isorce@samsung.com</a>><br>
> ---<br>
>  src/gallium/drivers/nouveau/nouveau_vp3_video.h    | 16 +++-<br>
>  .../drivers/nouveau/nouveau_vp3_video_bsp.c        | 96 ++++++++++++++--------<br>
>  src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c  |  5 +-<br>
>  src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c  |  5 +-<br>
>  4 files changed, 78 insertions(+), 44 deletions(-)<br>
><br>
> diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video.h b/src/gallium/drivers/nouveau/nouveau_vp3_video.h<br>
> index 58df5ee..9db8c63 100644<br>
> --- a/src/gallium/drivers/nouveau/nouveau_vp3_video.h<br>
> +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video.h<br>
> @@ -114,6 +114,10 @@ struct nouveau_vp3_decoder {<br>
>     unsigned fence_seq, fw_sizes, last_frame_num, tmp_stride, ref_stride;<br>
><br>
>     unsigned bsp_idx, vp_idx, ppp_idx;<br>
> +<br>
> +   /* End of the bsp bo where new data should be appended between one begin/end<br>
> +    * frame. */<br>
> +   char *bsp_ptr;<br>
>  };<br>
><br>
>  struct comm {<br>
> @@ -208,11 +212,15 @@ nouveau_vp3_load_firmware(struct nouveau_vp3_decoder *dec,<br>
>                            enum pipe_video_profile profile,<br>
>                            unsigned chipset);<br>
><br>
> +void<br>
> +nouveau_vp3_bsp_begin(struct nouveau_vp3_decoder *dec);<br>
> +<br>
> +void<br>
> +nouveau_vp3_bsp_next(struct nouveau_vp3_decoder *dec, unsigned num_buffers,<br>
> +                     const void *const *data, const unsigned *num_bytes);<br>
> +<br>
>  uint32_t<br>
> -nouveau_vp3_bsp(struct nouveau_vp3_decoder *dec,  union pipe_desc desc,<br>
> -                struct nouveau_vp3_video_buffer *target,<br>
> -                unsigned comm_seq, unsigned num_buffers,<br>
> -                const void *const *data, const unsigned *num_bytes);<br>
> +nouveau_vp3_bsp_end(struct nouveau_vp3_decoder *dec, union pipe_desc desc);<br>
><br>
>  void<br>
>  nouveau_vp3_vp_caps(struct nouveau_vp3_decoder *dec, union pipe_desc desc,<br>
> diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video_bsp.c b/src/gallium/drivers/nouveau/nouveau_vp3_video_bsp.c<br>
> index 692772e..2c15955 100644<br>
> --- a/src/gallium/drivers/nouveau/nouveau_vp3_video_bsp.c<br>
> +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video_bsp.c<br>
> @@ -230,20 +230,61 @@ nouveau_vp3_fill_picparm_h264_bsp(struct nouveau_vp3_decoder *dec,<br>
>     return caps | 3;<br>
>  }<br>
><br>
> +void<br>
> +nouveau_vp3_bsp_begin(struct nouveau_vp3_decoder *dec)<br>
> +{<br>
> +   uint32_t comm_seq = dec->fence_seq;<br>
> +   struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];<br>
> +   struct strparm_bsp *str_bsp = NULL;<br>
> +<br>
> +   dec->bsp_ptr = bsp_bo->map;<br>
> +<br>
> +   dec->bsp_ptr += 0x100;<br>
> +<br>
> +   str_bsp = (struct strparm_bsp *)dec->bsp_ptr;<br>
> +   memset(str_bsp, 0, 0x80);<br>
> +   str_bsp->w0[0] = 16;<br>
<br>
</div></div>This field is, ostensibly, the number of bytes in the buffer. This 16<br>
should get added when you actually add the end sequence. Here it<br>
should get initialized to 0.<br></blockquote><div><br></div><div>All right I'll move that to _end. It will also simplify <span>nouveau_vp3_bsp_next.<br></span></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span><br>
> +   str_bsp->w1[0] = 0x1;<br>
> +   dec->bsp_ptr += 0x100;<br>
> +   /* Reserved for picparm_vp */<br>
> +   dec->bsp_ptr += 0x300;<br>
> +   /* Reserved for comm */<br>
> +   #if !NOUVEAU_VP3_DEBUG_FENCE<br>
<br>
</span>I'm surprised this compiles... I thought macro processor stuff had to<br>
be on column 0. Either way, nowhere do we put spaces before the #.<br>
<br>
git grep -P '^\s+#' -- *.c\*<br>
<br>
just a handful of results.<br></blockquote><div><br></div><div>Ack :)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span><br>
> +   memset(dec->bsp_ptr, 0, 0x200);<br>
> +   #endif<br>
> +   dec->bsp_ptr += 0x200;<br>
> +}<br>
> +<br>
> +void<br>
> +nouveau_vp3_bsp_next(struct nouveau_vp3_decoder *dec, unsigned num_buffers,<br>
> +                     const void *const *data, const unsigned *num_bytes)<br>
> +{<br>
> +   uint32_t comm_seq = dec->fence_seq;<br>
> +   struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];<br>
> +   char *bsp_origin = bsp_bo->map;<br>
> +   struct strparm_bsp *str_bsp = NULL;<br>
> +   int i = 0;<br>
> +<br>
> +   bsp_origin += 0x100;<br>
> +   str_bsp = (struct strparm_bsp *)bsp_origin;<br>
<br>
</span>Seems easier to write this as (struct strparm_bsp *)(bsp_bo->map + 0x100)<br>
<br>
Technically void ptr arithmetic is "bad", but in practice it's pretty<br>
well defined, and nouveau is only built with well-behaved compilers.<br></blockquote><div><br></div><div>Ack but I'll remove it since I'll update str_bsp->w0[0] in _end.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span><br>
> +<br>
> +   for (i = 0; i < num_buffers; ++i) {<br>
<br>
</span>assert that we don't overflow the bo... something like<br>
<br>
assert(bsp_bo->map + bsp_bo->size <= dec->bsp_ptr + num_bytes[i])<br></blockquote><div><br></div><div>Ack<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><div><br>
> +      memcpy(dec->bsp_ptr, data[i], num_bytes[i]);<br>
> +      dec->bsp_ptr += num_bytes[i];<br>
> +      str_bsp->w0[0] += num_bytes[i];<br>
> +   }<br>
> +}<br>
> +<br>
>  uint32_t<br>
> -nouveau_vp3_bsp(struct nouveau_vp3_decoder *dec,  union pipe_desc desc,<br>
> -                struct nouveau_vp3_video_buffer *target,<br>
> -                unsigned comm_seq, unsigned num_buffers,<br>
> -                const void *const *data, const unsigned *num_bytes)<br>
> +nouveau_vp3_bsp_end(struct nouveau_vp3_decoder *dec, union pipe_desc desc)<br>
>  {<br>
> -   enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile);<br>
> +   uint32_t comm_seq = dec->fence_seq;<br>
>     struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];<br>
> -   char *bsp;<br>
> -   uint32_t endmarker, caps;<br>
> -   struct strparm_bsp *str_bsp;<br>
> -   int i;<br>
> +   enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile);<br>
> +   uint32_t caps = 0;<br>
> +   uint32_t endmarker = 0;<br>
> +   char *bsp = bsp_bo->map;<br>
><br>
> -   bsp = bsp_bo->map;<br>
>     /*<br>
>      * 0x000..0x100: picparm_bsp<br>
>      * 0x200..0x500: picparm_vp<br>
> @@ -277,34 +318,17 @@ nouveau_vp3_bsp(struct nouveau_vp3_decoder *dec,  union pipe_desc desc,<br>
>     caps |= 1 << 17; // enable watchdog<br>
>     caps |= 0 << 18; // do not report error to VP, so it can continue decoding what we have<br>
>     caps |= 0 << 19; // if enabled, use crypto crap?<br>
> -   bsp += 0x100;<br>
> -<br>
> -   str_bsp = (struct strparm_bsp *)bsp;<br>
> -   memset(str_bsp, 0, 0x80);<br>
> -   str_bsp->w0[0] = 16;<br>
> -   str_bsp->w1[0] = 0x1;<br>
> -   bsp += 0x100;<br>
> -   /* Reserved for picparm_vp */<br>
> -   bsp += 0x300;<br>
> -   /* Reserved for comm */<br>
> -#if !NOUVEAU_VP3_DEBUG_FENCE<br>
> -   memset(bsp, 0, 0x200);<br>
> -#endif<br>
> -   bsp += 0x200;<br>
> -   for (i = 0; i < num_buffers; ++i) {<br>
> -      memcpy(bsp, data[i], num_bytes[i]);<br>
> -      bsp += num_bytes[i];<br>
> -      str_bsp->w0[0] += num_bytes[i];<br>
> -   }<br>
><br>
>     /* Append end sequence */<br>
> -   *(uint32_t *)bsp = endmarker;<br>
> -   bsp += 4;<br>
> -   *(uint32_t *)bsp = 0x00000000;<br>
> -   bsp += 4;<br>
> -   *(uint32_t *)bsp = endmarker;<br>
> -   bsp += 4;<br>
> -   *(uint32_t *)bsp = 0x00000000;<br>
> +   *(uint32_t *)dec->bsp_ptr = endmarker;<br>
> +   dec->bsp_ptr += 4;<br>
> +   *(uint32_t *)dec->bsp_ptr = 0x00000000;<br>
> +   dec->bsp_ptr += 4;<br>
> +   *(uint32_t *)dec->bsp_ptr  = endmarker;<br>
> +   dec->bsp_ptr += 4;<br>
> +   *(uint32_t *)dec->bsp_ptr = 0x00000000;<br>
<br>
</div></div>And then here also do w0[0] += 16<br></blockquote><div><br></div><div>Ack <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><div><br>
> +<br>
> +   dec->bsp_ptr = NULL;<br>
><br>
>     return caps;<br>
>  }<br>
> diff --git a/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c b/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c<br>
> index dbde1bf..a0c36c3 100644<br>
> --- a/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c<br>
> +++ b/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c<br>
> @@ -106,8 +106,9 @@ nv98_decoder_bsp(struct nouveau_vp3_decoder *dec, union pipe_desc desc,<br>
>        return -1;<br>
>     }<br>
><br>
> -   caps = nouveau_vp3_bsp(dec, desc, target, comm_seq,<br>
> -                          num_buffers, data, num_bytes);<br>
> +   nouveau_vp3_bsp_begin(dec);<br>
> +   nouveau_vp3_bsp_next(dec, num_buffers, data, num_bytes);<br>
> +   caps = nouveau_vp3_bsp_end(dec, desc);<br>
><br>
>     nouveau_vp3_vp_caps(dec, desc, target, comm_seq, vp_caps, is_ref, refs);<br>
><br>
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c b/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c<br>
> index 4392f62..b0ee4a4 100644<br>
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c<br>
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c<br>
> @@ -114,8 +114,9 @@ nvc0_decoder_bsp(struct nouveau_vp3_decoder *dec, union pipe_desc desc,<br>
>        return -1;<br>
>     }<br>
><br>
> -   caps = nouveau_vp3_bsp(dec, desc, target, comm_seq,<br>
> -                          num_buffers, data, num_bytes);<br>
> +   nouveau_vp3_bsp_begin(dec);<br>
> +   nouveau_vp3_bsp_next(dec, num_buffers, data, num_bytes);<br>
> +   caps = nouveau_vp3_bsp_end(dec, desc);<br>
><br>
>     nouveau_vp3_vp_caps(dec, desc, target, comm_seq, vp_caps, is_ref, refs);<br>
><br>
> --<br>
> 1.9.1<br>
><br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</div></div></blockquote></div><br></div></div>