[Libva] [PATCH] VPP: Refine the usage mode for blending

Xiang, Haihao haihao.xiang at intel.com
Sun Jul 28 19:34:01 PDT 2013


On Fri, 2013-07-26 at 23:09 +0800, Li Xiaowei wrote: 
> Blend the src & dst surface to dst surface, instead
> of blending src & ref surfaces to dst surface.
> 
> signed-off-by: Li, Xiaowei <xiaowei.a.li at intel.com>
> ---
>  src/i965_post_processing.c                     |   80 +-
>  src/shaders/post_processing/gen7/blending.g75b | 1247 ++++++++++++------------
>  src/shaders/post_processing/gen7/blending.g7b  | 1215 +++++++++++------------
>  3 files changed, 1269 insertions(+), 1273 deletions(-)
> 
> diff --git a/src/i965_post_processing.c b/src/i965_post_processing.c
> index 7a41060..e65a8ca 100755
> --- a/src/i965_post_processing.c
> +++ b/src/i965_post_processing.c
> @@ -700,8 +700,8 @@ static VAStatus gen7_pp_rgbx_avs_initialize(VADriverContextP ctx, struct i965_po
>  static VAStatus gen7_pp_nv12_blending_initialize(VADriverContextP ctx, struct i965_post_processing_context *pp_context,
>                                             const struct i965_surface *src_surface,
>                                             const VARectangle *src_rect,
> -                                           struct i965_surface *ref_surface,
> -                                           const VARectangle *ref_rect,
> +                                           struct i965_surface *dst_surface,
> +                                           const VARectangle *dst_rect,
>                                             void *filter_param);
>  
>  static struct pp_module pp_modules_gen7[] = {
> @@ -4021,8 +4021,8 @@ static VAStatus
>  gen7_pp_nv12_blending_initialize(VADriverContextP ctx, struct i965_post_processing_context *pp_context,
>                             const struct i965_surface *src_surface,
>                             const VARectangle *src_rect,
> -                           struct i965_surface *ref_surface,
> -                           const VARectangle *ref_rect,
> +                           struct i965_surface *dst_surface,
> +                           const VARectangle *dst_rect,
>                             void *filter_param)
>  {
>      struct gen7_pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
> @@ -4051,7 +4051,7 @@ gen7_pp_nv12_blending_initialize(VADriverContextP ctx, struct i965_post_processi
>                                1, 0);
>  
>      /* reference/mask surface state */
> -    obj_surface = (struct object_surface *)ref_surface->base;
> +    obj_surface = (struct object_surface *)dst_surface->base;
>      orig_w = obj_surface->orig_width;
>      orig_h = obj_surface->orig_height;
>      w = obj_surface->width;
> @@ -4074,8 +4074,8 @@ gen7_pp_nv12_blending_initialize(VADriverContextP ctx, struct i965_post_processi
>      pp_context->pp_y_steps = gen7_pp_blending_y_steps;
>      pp_context->pp_set_block_parameter = gen7_pp_blending_set_block_parameter;
>  
> -    pp_blending_context->dest_w = ALIGN(ref_rect->width, 16);
> -    pp_blending_context->dest_h = ALIGN(ref_rect->height, 16);
> +    pp_blending_context->dest_w = ALIGN(dst_rect->width, 16);
> +    pp_blending_context->dest_h = ALIGN(dst_rect->height, 16);
>  
>      pp_static_parameter->grf1.blending_flags = blend_state->flags;
>      pp_static_parameter->grf1.blending_alpha = blend_state->global_alpha;
> @@ -5485,36 +5485,6 @@ i965_proc_picture(VADriverContextP ctx,
>          }
>      }
>  
> -    if (pipeline_param->blend_state && IS_GEN7(i965->intel.device_id)){
> -        const VABlendState* blend_state = pipeline_param->blend_state;
> -        struct i965_surface ref_surface;
> -        VARectangle ref_rect;
> -        assert(blend_state->flags & VA_BLEND_GLOBAL_ALPHA ||
> -               blend_state->flags & VA_BLEND_LUMA_KEY);
> -
> -        assert(pipeline_param->forward_references != NULL);
> -
> -        VASurfaceID forward_reference = pipeline_param->forward_references[0];
> -        obj_surface = SURFACE(forward_reference);
> -        assert(obj_surface && obj_surface->fourcc == VA_FOURCC('N','V','1','2'));
> -
> -        ref_surface.base = (struct object_base *)obj_surface;
> -        ref_surface.type = I965_SURFACE_TYPE_SURFACE;
> -
> -        ref_rect.x = 0;
> -        ref_rect.y = 0;
> -        ref_rect.width = obj_surface->orig_width;
> -        ref_rect.height = obj_surface->orig_height;
> -
> -        status = i965_post_processing_internal(ctx, &proc_context->pp_context,
> -                                               &src_surface,
> -                                               &src_rect,
> -                                               &ref_surface,
> -                                               &ref_rect,
> -                                               PP_NV12_BLEND,
> -                                               (void*)blend_state);
> -    }
> -
>      obj_surface = SURFACE(proc_state->current_render_target);
>      assert(obj_surface);
>      
> @@ -5543,7 +5513,17 @@ i965_proc_picture(VADriverContextP ctx,
>      }
>  
>      dst_surface.type = I965_SURFACE_TYPE_SURFACE;
> -    i965_vpp_clear_surface(ctx, &proc_context->pp_context, obj_surface, pipeline_param->output_background_color); 
> +
> +    int blending_needed = 0;
> +    if (IS_GEN7(i965->intel.device_id) && pipeline_param->blend_state &&
> +        obj_surface->fourcc == VA_FOURCC('N','V','1','2')){
> +        const VABlendState *blend_state = pipeline_param->blend_state;
> +        if ((blend_state->flags & VA_BLEND_GLOBAL_ALPHA)||(blend_state->flags & VA_BLEND_LUMA_KEY))
> +            blending_needed = 1;
> +    }
> +
> +    if (!blending_needed)
> +        i965_vpp_clear_surface(ctx, &proc_context->pp_context, obj_surface, pipeline_param->output_background_color);

Is blending needed if src_rect != dest_rect ? 

> 
>      // load/save doesn't support different origin offset for src and dst surface
>      if (src_rect.width == dst_rect.width &&
> @@ -5551,13 +5531,23 @@ i965_proc_picture(VADriverContextP ctx,
>          src_rect.x == dst_rect.x &&
>          src_rect.y == dst_rect.y) {
>  
> -        i965_post_processing_internal(ctx, &proc_context->pp_context,
> -                                      &src_surface,
> -                                      &src_rect,
> -                                      &dst_surface,
> -                                      &dst_rect,
> -                                      PP_NV12_LOAD_SAVE_N12,
> -                                      NULL);
> +        if (blending_needed) {
> +            i965_post_processing_internal(ctx, &proc_context->pp_context,
> +                                          &src_surface,
> +                                          &src_rect,
> +                                          &dst_surface,
> +                                          &dst_rect,
> +                                          PP_NV12_BLEND,
> +                                          (void*)pipeline_param->blend_state);
> +        } else {
> +            i965_post_processing_internal(ctx, &proc_context->pp_context,
> +                                          &src_surface,
> +                                          &src_rect,
> +                                          &dst_surface,
> +                                          &dst_rect,
> +                                          PP_NV12_LOAD_SAVE_N12,
> +                                          NULL);
> +       }
>      } else {
>  
>          i965_post_processing_internal(ctx, &proc_context->pp_context,

You need to fix vaQueryVideoProcPipelineCaps() to return the
corresponding capability of the pipeline so that the application is
aware of blending.

Thanks
Haihao







More information about the Libva mailing list