[Mesa-dev] [PATCH v2] st/va: count number of slices

Christian König deathsimple at vodafone.de
Tue Jan 5 03:49:06 PST 2016


On 04.01.2016 23:31, Julien Isorce wrote:
> From: Julien Isorce <julien.isorce at gmail.com>
>
> The counter was not set but used by the nouveau driver.
> It is required otherwise visual output is garbage.
>
> Signed-off-by: Julien Isorce <j.isorce at samsung.com>

Reviewed-by: Christian König <christian.koenig at amd.com>

> ---
>   src/gallium/state_trackers/va/picture.c        | 8 ++++++++
>   src/gallium/state_trackers/va/picture_h264.c   | 2 ++
>   src/gallium/state_trackers/va/picture_mpeg12.c | 6 ++++++
>   src/gallium/state_trackers/va/picture_vc1.c    | 7 +++++++
>   src/gallium/state_trackers/va/va_private.h     | 2 ++
>   5 files changed, 25 insertions(+)
>
> diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c
> index 7b30bf8..da9ca5a 100644
> --- a/src/gallium/state_trackers/va/picture.c
> +++ b/src/gallium/state_trackers/va/picture.c
> @@ -174,6 +174,14 @@ static void
>   handleSliceParameterBuffer(vlVaContext *context, vlVaBuffer *buf)
>   {
>      switch (u_reduce_video_profile(context->templat.profile)) {
> +   case PIPE_VIDEO_FORMAT_MPEG12:
> +      vlVaHandleSliceParameterBufferMPEG12(context, buf);
> +      break;
> +
> +   case PIPE_VIDEO_FORMAT_VC1:
> +      vlVaHandleSliceParameterBufferVC1(context, buf);
> +      break;
> +
>      case PIPE_VIDEO_FORMAT_MPEG4_AVC:
>         vlVaHandleSliceParameterBufferH264(context, buf);
>         break;
> diff --git a/src/gallium/state_trackers/va/picture_h264.c b/src/gallium/state_trackers/va/picture_h264.c
> index acbfe5d..883a94a 100644
> --- a/src/gallium/state_trackers/va/picture_h264.c
> +++ b/src/gallium/state_trackers/va/picture_h264.c
> @@ -48,6 +48,7 @@ void vlVaHandlePictureParameterBufferH264(vlVaDriver *drv, vlVaContext *context,
>      unsigned i;
>   
>      assert(buf->size >= sizeof(VAPictureParameterBufferH264) && buf->num_elements == 1);
> +   context->desc.h264.slice_count = 0;
>      /*CurrPic*/
>      context->desc.h264.field_order_cnt[0] = h264->CurrPic.TopFieldOrderCnt;
>      context->desc.h264.field_order_cnt[1] = h264->CurrPic.BottomFieldOrderCnt;
> @@ -162,6 +163,7 @@ void vlVaHandleSliceParameterBufferH264(vlVaContext *context, vlVaBuffer *buf)
>      VASliceParameterBufferH264 *h264 = buf->data;
>   
>      assert(buf->size >= sizeof(VASliceParameterBufferH264) && buf->num_elements == 1);
> +   context->desc.h264.slice_count += buf->num_elements;
>      context->desc.h264.num_ref_idx_l0_active_minus1 =
>         h264->num_ref_idx_l0_active_minus1;
>      context->desc.h264.num_ref_idx_l1_active_minus1 =
> diff --git a/src/gallium/state_trackers/va/picture_mpeg12.c b/src/gallium/state_trackers/va/picture_mpeg12.c
> index e587b1e..812e9e5 100644
> --- a/src/gallium/state_trackers/va/picture_mpeg12.c
> +++ b/src/gallium/state_trackers/va/picture_mpeg12.c
> @@ -32,6 +32,7 @@ void vlVaHandlePictureParameterBufferMPEG12(vlVaDriver *drv, vlVaContext *contex
>      VAPictureParameterBufferMPEG2 *mpeg2 = buf->data;
>   
>      assert(buf->size >= sizeof(VAPictureParameterBufferMPEG2) && buf->num_elements == 1);
> +   context->desc.mpeg12.num_slices = 0;
>      /*horizontal_size;*/
>      /*vertical_size;*/
>      vlVaGetReferenceFrame(drv, mpeg2->forward_reference_picture, &context->desc.mpeg12.ref[0]);
> @@ -78,3 +79,8 @@ void vlVaHandleIQMatrixBufferMPEG12(vlVaContext *context, vlVaBuffer *buf)
>         context->desc.mpeg12.non_intra_matrix = NULL;
>   }
>   
> +void vlVaHandleSliceParameterBufferMPEG12(vlVaContext *context, vlVaBuffer *buf)
> +{
> +   assert(buf->size >= sizeof(VASliceParameterBufferMPEG2) && buf->num_elements == 1);
> +   context->desc.mpeg12.num_slices += buf->num_elements;
> +}
> diff --git a/src/gallium/state_trackers/va/picture_vc1.c b/src/gallium/state_trackers/va/picture_vc1.c
> index f95fd83..6ad1571 100644
> --- a/src/gallium/state_trackers/va/picture_vc1.c
> +++ b/src/gallium/state_trackers/va/picture_vc1.c
> @@ -32,6 +32,7 @@ void vlVaHandlePictureParameterBufferVC1(vlVaDriver *drv, vlVaContext *context,
>      VAPictureParameterBufferVC1 * vc1 = buf->data;
>   
>      assert(buf->size >= sizeof(VAPictureParameterBufferVC1) && buf->num_elements == 1);
> +   context->desc.vc1.slice_count = 0;
>      vlVaGetReferenceFrame(drv, vc1->forward_reference_picture, &context->desc.vc1.ref[0]);
>      vlVaGetReferenceFrame(drv, vc1->backward_reference_picture, &context->desc.vc1.ref[1]);
>      context->desc.vc1.picture_type = vc1->picture_fields.bits.picture_type;
> @@ -65,3 +66,9 @@ void vlVaHandlePictureParameterBufferVC1(vlVaDriver *drv, vlVaContext *context,
>      context->desc.vc1.deblockEnable = vc1->post_processing != 0;
>      context->desc.vc1.pquant = vc1->pic_quantizer_fields.bits.pic_quantizer_scale;
>   }
> +
> +void vlVaHandleSliceParameterBufferVC1(vlVaContext *context, vlVaBuffer *buf)
> +{
> +   assert(buf->size >= sizeof(VASliceParameterBufferVC1) && buf->num_elements == 1);
> +   context->desc.vc1.slice_count += buf->num_elements;
> +}
> diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h
> index fa6e0fb..bf9d24b 100644
> --- a/src/gallium/state_trackers/va/va_private.h
> +++ b/src/gallium/state_trackers/va/va_private.h
> @@ -351,10 +351,12 @@ VAStatus vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContex
>   void vlVaGetReferenceFrame(vlVaDriver *drv, VASurfaceID surface_id, struct pipe_video_buffer **ref_frame);
>   void vlVaHandlePictureParameterBufferMPEG12(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandleIQMatrixBufferMPEG12(vlVaContext *context, vlVaBuffer *buf);
> +void vlVaHandleSliceParameterBufferMPEG12(vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandlePictureParameterBufferH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandleIQMatrixBufferH264(vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandleSliceParameterBufferH264(vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandlePictureParameterBufferVC1(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
> +void vlVaHandleSliceParameterBufferVC1(vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandlePictureParameterBufferMPEG4(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandleIQMatrixBufferMPEG4(vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandleSliceParameterBufferMPEG4(vlVaContext *context, vlVaBuffer *buf);



More information about the mesa-dev mailing list