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