2014-08-08 5:50 GMT+02:00 Zhong Li <zhong...@intel.com>: > HW requires driver to add a phantom slice when FirstMbX and FirstMbY are > not 0, in order to avc decoding error concealment. Otherwise, GPU may hang. > This patch is a workround for bug: > https://bugs.freedesktop.org/show_bug.cgi?id=81447 > > v1->v2: Follow haihao's suggestion to use common funcion of gen6 phantom > slice. > > Signed-off-by: Zhong Li <zhong...@intel.com> > --- > src/gen75_mfd.c | 12 ++++++++++++ > src/gen7_mfd.c | 12 ++++++++++++ > src/gen8_mfd.c | 13 +++++++++++++ > 3 files changed, 37 insertions(+) > > diff --git a/src/gen75_mfd.c b/src/gen75_mfd.c > index b14db61..1847d2c 100644 > --- a/src/gen75_mfd.c > +++ b/src/gen75_mfd.c > @@ -812,6 +812,15 @@ gen75_mfd_avc_directmode_state(VADriverContextP ctx, > } > > static void > +gen75_mfd_avc_phantom_slice_first(VADriverContextP ctx, > + VAPictureParameterBufferH264 *pic_param, > + VASliceParameterBufferH264 > *next_slice_param, > + struct gen7_mfd_context *gen7_mfd_context) > +{ > + gen6_mfd_avc_phantom_slice(ctx, pic_param, next_slice_param, > gen7_mfd_context->base.batch); > +} > + > +static void > gen75_mfd_avc_slice_state(VADriverContextP ctx, > VAPictureParameterBufferH264 *pic_param, > VASliceParameterBufferH264 *slice_param, > @@ -1145,6 +1154,9 @@ gen75_mfd_avc_decode_picture(VADriverContextP ctx, > else > next_slice_group_param = (VASliceParameterBufferH264 > *)decode_state->slice_params[j + 1]->buffer; > > + if (j == 0 && slice_param->first_mb_in_slice) > + gen75_mfd_avc_phantom_slice_first(ctx, pic_param, slice_param, > gen7_mfd_context); > + > for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) { > assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL); > assert((slice_param->slice_type == SLICE_TYPE_I) || > diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c > index 46a07a0..376eeb6 100755 > --- a/src/gen7_mfd.c > +++ b/src/gen7_mfd.c > @@ -506,6 +506,15 @@ gen7_mfd_avc_directmode_state(VADriverContextP ctx, > } > > static void > +gen7_mfd_avc_phantom_slice_first(VADriverContextP ctx, > + VAPictureParameterBufferH264 *pic_param, > + VASliceParameterBufferH264 > *next_slice_param, > + struct gen7_mfd_context *gen7_mfd_context) > +{ > + gen6_mfd_avc_phantom_slice(ctx, pic_param, next_slice_param, > gen7_mfd_context->base.batch); > +} > + > +static void > gen7_mfd_avc_slice_state(VADriverContextP ctx, > VAPictureParameterBufferH264 *pic_param, > VASliceParameterBufferH264 *slice_param, > @@ -842,6 +851,9 @@ gen7_mfd_avc_decode_picture(VADriverContextP ctx, > else > next_slice_group_param = (VASliceParameterBufferH264 > *)decode_state->slice_params[j + 1]->buffer; > > + if (j == 0 && slice_param->first_mb_in_slice) > + gen7_mfd_avc_phantom_slice_first(ctx, pic_param, slice_param, > gen7_mfd_context); > + > for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) { > assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL); > assert((slice_param->slice_type == SLICE_TYPE_I) || > diff --git a/src/gen8_mfd.c b/src/gen8_mfd.c > index d08dd43..83ca384 100644 > --- a/src/gen8_mfd.c > +++ b/src/gen8_mfd.c > @@ -575,6 +575,15 @@ gen8_mfd_avc_directmode_state(VADriverContextP ctx, > } > > static void > +gen8_mfd_avc_phantom_slice_first(VADriverContextP ctx, > + VAPictureParameterBufferH264 *pic_param, > + VASliceParameterBufferH264 > *next_slice_param, > + struct gen7_mfd_context *gen7_mfd_context) > +{ > + gen6_mfd_avc_phantom_slice(ctx, pic_param, next_slice_param, > gen7_mfd_context->base.batch); > +} > + > +static void > gen8_mfd_avc_slice_state(VADriverContextP ctx, > VAPictureParameterBufferH264 *pic_param, > VASliceParameterBufferH264 *slice_param,
> @@ -908,6 +917,10 @@ gen8_mfd_avc_decode_picture(VADriverContextP ctx, > else > next_slice_group_param = (VASliceParameterBufferH264 > *)decode_state->slice_params[j + 1]->buffer; > > + if (j == 0 && slice_param->first_mb_in_slice) > + gen8_mfd_avc_phantom_slice_first(ctx, pic_param, slice_param, > gen7_mfd_context); > + > + > for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) { > assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL); > assert((slice_param->slice_type == SLICE_TYPE_I) || Extraneous newline here, but overall OK. Thanks, -- Gwenole Beauchesne Intel Corporation SAS / 2 rue de Paris, 92196 Meudon Cedex, France Registration Number (RCS): Nanterre B 302 456 199 _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva