Applied. Thanks Haihao
> v2: > 1, remove VPP P016 related code > 2, optimize NV12->P010 > 3, enable IECP if all DI&DN are disabled > > v1: > initial > > Signed-off-by: peng.chen <[email protected]> > --- > src/gen75_picture_process.c | 266 > +++++++++++++++++++++++++++++++++++--------- > src/gen75_vpp_vebox.c | 21 +++- > src/i965_device_info.c | 2 +- > src/i965_drv_video.c | 17 +++ > src/i965_drv_video.h | 1 + > 5 files changed, 251 insertions(+), 56 deletions(-) > > diff --git a/src/gen75_picture_process.c > b/src/gen75_picture_process.c > index ed50532..8699fc5 100644 > --- a/src/gen75_picture_process.c > +++ b/src/gen75_picture_process.c > @@ -28,6 +28,7 @@ > #include <stdio.h> > #include <stdlib.h> > #include <assert.h> > +#include <string.h> > > #include "intel_batchbuffer.h" > #include "intel_driver.h" > @@ -123,6 +124,15 @@ gen75_proc_picture(VADriverContextP ctx, > (VAProcPipelineParameterBuffer *)proc_st- > >pipeline_param->buffer; > struct object_surface *obj_dst_surf = NULL; > struct object_surface *obj_src_surf = NULL; > + > + VAProcPipelineParameterBuffer pipeline_param2; > + struct object_surface *stage1_dst_surf = NULL; > + struct object_surface *stage2_dst_surf = NULL; > + VARectangle src_rect, dst_rect; > + VASurfaceID tmp_surfaces[2]; > + VASurfaceID out_surface_id1 = VA_INVALID_ID, out_surface_id2 = > VA_INVALID_ID; > + int num_tmp_surfaces = 0; > + > VAStatus status; > > proc_ctx->pipeline_param = pipeline_param; > @@ -168,69 +178,221 @@ gen75_proc_picture(VADriverContextP ctx, > proc_ctx->surface_pipeline_input_object = obj_src_surf; > assert(pipeline_param->num_filters <= 4); > > + int vpp_stage1 = 0, vpp_stage2 = 1, vpp_stage3 = 0; > + > + if (pipeline_param->surface_region) { > + src_rect.x = pipeline_param->surface_region->x; > + src_rect.y = pipeline_param->surface_region->y; > + src_rect.width = pipeline_param->surface_region->width; > + src_rect.height = pipeline_param->surface_region->height; > + } else { > + src_rect.x = 0; > + src_rect.y = 0; > + src_rect.width = obj_src_surf->orig_width; > + src_rect.height = obj_src_surf->orig_height; > + } > + > + if (pipeline_param->output_region) { > + dst_rect.x = pipeline_param->output_region->x; > + dst_rect.y = pipeline_param->output_region->y; > + dst_rect.width = pipeline_param->output_region->width; > + dst_rect.height = pipeline_param->output_region->height; > + } else { > + dst_rect.x = 0; > + dst_rect.y = 0; > + dst_rect.width = obj_dst_surf->orig_width; > + dst_rect.height = obj_dst_surf->orig_height; > + } > + > + if(obj_src_surf->fourcc == VA_FOURCC_P010) { > + vpp_stage1 = 1; > + vpp_stage2 = 0; > + vpp_stage3 = 0; > + if(pipeline_param->num_filters == 0 || pipeline_param- > >filters == NULL) { > + if(src_rect.x != dst_rect.x || > + src_rect.y != dst_rect.y || > + src_rect.width != dst_rect.width || > + src_rect.height != dst_rect.height) > + vpp_stage2 = 1; > + > + if(obj_dst_surf->fourcc != VA_FOURCC_NV12 && > + obj_dst_surf->fourcc != VA_FOURCC_P010) > + vpp_stage2 = 1; > + } > + else > + vpp_stage2 = 1; > + > + if(vpp_stage2 == 1) { > + if(obj_dst_surf->fourcc == VA_FOURCC_P010) > + vpp_stage3 = 1; > + } > + } > + else if(obj_dst_surf->fourcc == VA_FOURCC_P010) { > + vpp_stage2 = 1; > + vpp_stage3 = 1; > + > + if((obj_src_surf->fourcc == VA_FOURCC_NV12) && > + (pipeline_param->num_filters == 0 || pipeline_param- > >filters == NULL)) { > + if((src_rect.x == dst_rect.x) && > + (src_rect.y == dst_rect.y) && > + (src_rect.width == dst_rect.width) && > + (src_rect.height == dst_rect.height)) > + vpp_stage2 = 0; > + } > + } > + > + if(vpp_stage1 == 1){ > + memset((void *)&pipeline_param2, 0, > sizeof(pipeline_param2)); > + pipeline_param2.surface = pipeline_param->surface; > + pipeline_param2.surface_region = &src_rect; > + pipeline_param2.output_region = &src_rect; > + pipeline_param2.filter_flags = 0; > + pipeline_param2.num_filters = 0; > + > + proc_ctx->pipeline_param = &pipeline_param2; > + > + if(vpp_stage2 == 1) { > + status = i965_CreateSurfaces(ctx, > + obj_src_surf->orig_width, > + obj_src_surf->orig_height, > + VA_RT_FORMAT_YUV420, > + 1, > + &out_surface_id1); > + assert(status == VA_STATUS_SUCCESS); > + tmp_surfaces[num_tmp_surfaces++] = out_surface_id1; > + stage1_dst_surf = SURFACE(out_surface_id1); > + assert(stage1_dst_surf); > + i965_check_alloc_surface_bo(ctx, stage1_dst_surf, 1, > VA_FOURCC_NV12, SUBSAMPLE_YUV420); > + > + proc_ctx->surface_render_output_object = > stage1_dst_surf; > + } > + > + gen75_vpp_vebox(ctx, proc_ctx); > + } > + > + if((vpp_stage3 == 1) && (vpp_stage2 == 1)) { > + status = i965_CreateSurfaces(ctx, > + obj_dst_surf->orig_width, > + obj_dst_surf->orig_height, > + VA_RT_FORMAT_YUV420, > + 1, > + &out_surface_id2); > + assert(status == VA_STATUS_SUCCESS); > + tmp_surfaces[num_tmp_surfaces++] = out_surface_id2; > + stage2_dst_surf = SURFACE(out_surface_id2); > + assert(stage2_dst_surf); > + i965_check_alloc_surface_bo(ctx, stage2_dst_surf, 1, > VA_FOURCC_NV12, SUBSAMPLE_YUV420); > + } > + > VABufferID *filter_id = (VABufferID*) pipeline_param->filters; > - > - if(pipeline_param->num_filters == 0 || pipeline_param->filters > == NULL ){ > - /* implicity surface format coversion and scaling */ > - gen75_vpp_fmt_cvt(ctx, profile, codec_state, hw_context); > - }else if(pipeline_param->num_filters == 1) { > - struct object_buffer * obj_buf = BUFFER((*filter_id) + 0); > - > - assert(obj_buf && obj_buf->buffer_store && obj_buf- > >buffer_store->buffer); > - > - if (!obj_buf || > - !obj_buf->buffer_store || > - !obj_buf->buffer_store->buffer) { > - status = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; > - goto error; > - } > - > - VAProcFilterParameterBuffer* filter = > - (VAProcFilterParameterBuffer*)obj_buf-> buffer_store- > >buffer; > - > - if (filter->type == VAProcFilterNoiseReduction || > - filter->type == VAProcFilterDeinterlacing || > - filter->type == VAProcFilterSkinToneEnhancement || > - filter->type == VAProcFilterColorBalance){ > - gen75_vpp_vebox(ctx, proc_ctx); > - }else if(filter->type == VAProcFilterSharpening){ > - if (obj_src_surf->fourcc != VA_FOURCC_NV12 || > - obj_dst_surf->fourcc != VA_FOURCC_NV12) { > - status = VA_STATUS_ERROR_UNIMPLEMENTED; > + > + if(vpp_stage2 == 1) { > + if(stage1_dst_surf != NULL) { > + proc_ctx->surface_pipeline_input_object = > stage1_dst_surf; > + proc_ctx->surface_render_output_object = obj_dst_surf; > + > + pipeline_param->surface = out_surface_id1; > + } > + > + if(stage2_dst_surf != NULL) { > + proc_ctx->surface_render_output_object = > stage2_dst_surf; > + > + proc_st->current_render_target = out_surface_id2; > + } > + > + proc_ctx->pipeline_param = pipeline_param; > + > + if(pipeline_param->num_filters == 0 || pipeline_param- > >filters == NULL ){ > + /* implicity surface format coversion and scaling */ > + > + gen75_vpp_fmt_cvt(ctx, profile, codec_state, > hw_context); > + }else if(pipeline_param->num_filters == 1) { > + struct object_buffer * obj_buf = BUFFER((*filter_id) + > 0); > + > + assert(obj_buf && obj_buf->buffer_store && obj_buf- > >buffer_store->buffer); > + > + if (!obj_buf || > + !obj_buf->buffer_store || > + !obj_buf->buffer_store->buffer) { > + status = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; > goto error; > } > > - gen75_vpp_gpe(ctx, proc_ctx); > - } > - }else if (pipeline_param->num_filters >= 2) { > - unsigned int i = 0; > - for (i = 0; i < pipeline_param->num_filters; i++){ > - struct object_buffer * obj_buf = BUFFER(pipeline_param- > >filters[i]); > - > - if (!obj_buf || > - !obj_buf->buffer_store || > - !obj_buf->buffer_store->buffer) { > - status = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; > - goto error; > + VAProcFilterParameterBuffer* filter = > + (VAProcFilterParameterBuffer*)obj_buf-> buffer_store- > >buffer; > + > + if (filter->type == VAProcFilterNoiseReduction || > + filter->type == VAProcFilterDeinterlacing || > + filter->type == VAProcFilterSkinToneEnhancement || > + filter->type == VAProcFilterColorBalance){ > + gen75_vpp_vebox(ctx, proc_ctx); > + }else if(filter->type == VAProcFilterSharpening){ > + if (proc_ctx->surface_pipeline_input_object->fourcc > != VA_FOURCC_NV12 || > + proc_ctx->surface_render_output_object->fourcc != > VA_FOURCC_NV12) { > + status = VA_STATUS_ERROR_UNIMPLEMENTED; > + goto error; > + } > + > + gen75_vpp_gpe(ctx, proc_ctx); > + } > + }else if (pipeline_param->num_filters >= 2) { > + unsigned int i = 0; > + for (i = 0; i < pipeline_param->num_filters; i++){ > + struct object_buffer * obj_buf = > BUFFER(pipeline_param->filters[i]); > + > + if (!obj_buf || > + !obj_buf->buffer_store || > + !obj_buf->buffer_store->buffer) { > + status = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; > + goto error; > + } > + > + VAProcFilterParameterBuffer* filter = > + (VAProcFilterParameterBuffer*)obj_buf-> > buffer_store->buffer; > + > + if (filter->type != > VAProcFilterNoiseReduction && > + filter->type != > VAProcFilterDeinterlacing && > + filter->type != > VAProcFilterSkinToneEnhancement && > + filter->type != VAProcFilterColorBalance) { > + fprintf(stderr, "Do not support multiply > filters outside vebox pipeline \n"); > + assert(0); > + } > } > + gen75_vpp_vebox(ctx, proc_ctx); > + } > + } > > - VAProcFilterParameterBuffer* filter = > - (VAProcFilterParameterBuffer*)obj_buf-> > buffer_store->buffer; > + if(vpp_stage3 == 1) > + { > + if(vpp_stage2 == 1) { > + memset(&pipeline_param2, 0, sizeof(pipeline_param2)); > + pipeline_param2.surface = out_surface_id2; > + pipeline_param2.surface_region = &dst_rect; > + pipeline_param2.output_region = &dst_rect; > + pipeline_param2.filter_flags = 0; > + pipeline_param2.num_filters = 0; > + > + proc_ctx->pipeline_param = &pipeline_param2; > + proc_ctx->surface_pipeline_input_object = proc_ctx- > >surface_render_output_object; > + proc_ctx->surface_render_output_object = obj_dst_surf; > + } > + > + gen75_vpp_vebox(ctx, proc_ctx); > + } > > - if (filter->type != VAProcFilterNoiseReduction && > - filter->type != VAProcFilterDeinterlacing && > - filter->type != VAProcFilterSkinToneEnhancement && > - filter->type != VAProcFilterColorBalance) { > - fprintf(stderr, "Do not support multiply filters > outside vebox pipeline \n"); > - assert(0); > - } > - } > - gen75_vpp_vebox(ctx, proc_ctx); > - } > + if (num_tmp_surfaces) > + i965_DestroySurfaces(ctx, > + tmp_surfaces, > + num_tmp_surfaces); > > return VA_STATUS_SUCCESS; > > error: > + if (num_tmp_surfaces) > + i965_DestroySurfaces(ctx, > + tmp_surfaces, > + num_tmp_surfaces); > + > return status; > } > > diff --git a/src/gen75_vpp_vebox.c b/src/gen75_vpp_vebox.c > index 06c27f8..1b4232d 100644 > --- a/src/gen75_vpp_vebox.c > +++ b/src/gen75_vpp_vebox.c > @@ -1408,7 +1408,9 @@ int hsw_veb_pre_format_convert(VADriverContextP > ctx, > > } else if(obj_surf_input->fourcc == VA_FOURCC_AYUV || > obj_surf_input->fourcc == VA_FOURCC_YUY2 || > - obj_surf_input->fourcc == VA_FOURCC_NV12){ > + obj_surf_input->fourcc == VA_FOURCC_NV12 || > + obj_surf_input->fourcc == VA_FOURCC_P010){ > + > // nothing to do here > } else { > /* not support other format as input */ > @@ -1447,7 +1449,9 @@ int hsw_veb_pre_format_convert(VADriverContextP > ctx, > proc_ctx->format_convert_flags |= POST_FORMAT_CONVERT; > } else if(obj_surf_output->fourcc == VA_FOURCC_AYUV || > obj_surf_output->fourcc == VA_FOURCC_YUY2 || > - obj_surf_output->fourcc == VA_FOURCC_NV12){ > + obj_surf_input->fourcc == VA_FOURCC_NV12 || > + obj_surf_input->fourcc == VA_FOURCC_P010){ > + > /* Nothing to do here */ > } else { > /* not support other format as input */ > @@ -1602,6 +1606,11 @@ > gen75_vebox_init_filter_params(VADriverContextP ctx, > proc_ctx->is_first_frame = 0; > proc_ctx->is_second_field = 0; > > + if(!proc_ctx->is_di_enabled && !proc_ctx->is_dn_enabled) { > + // MUST enable IECP if all DI&DN are disabled > + proc_ctx->is_iecp_enabled = 1; > + } > + > /* Check whether we are deinterlacing the second field */ > if (proc_ctx->is_di_enabled) { > const VAProcFilterParameterBufferDeinterlacing * const > deint_params = > @@ -2290,7 +2299,8 @@ void skl_veb_surface_state(VADriverContextP > ctx, struct intel_vebox_context *pro > assert(obj_surf->fourcc == VA_FOURCC_NV12 || > obj_surf->fourcc == VA_FOURCC_YUY2 || > obj_surf->fourcc == VA_FOURCC_AYUV || > - obj_surf->fourcc == VA_FOURCC_RGBA); > + obj_surf->fourcc == VA_FOURCC_RGBA || > + obj_surf->fourcc == VA_FOURCC_P010); > > if (obj_surf->fourcc == VA_FOURCC_NV12) { > surface_format = PLANAR_420_8; > @@ -2312,6 +2322,11 @@ void skl_veb_surface_state(VADriverContextP > ctx, struct intel_vebox_context *pro > surface_pitch = obj_surf->width * 4; > is_uv_interleaved = 0; > half_pitch_chroma = 0; > + } else if (obj_surf->fourcc == VA_FOURCC_P010) { > + surface_format = PLANAR_420_16; > + surface_pitch = obj_surf->width; > + is_uv_interleaved = 1; > + half_pitch_chroma = 0; > } > > derived_pitch = surface_pitch; > diff --git a/src/i965_device_info.c b/src/i965_device_info.c > index 4921922..b14fda9 100644 > --- a/src/i965_device_info.c > +++ b/src/i965_device_info.c > @@ -401,6 +401,7 @@ static struct hw_codec_info bxt_hw_codec_info = { > .has_hevc_encoding = 1, > .has_hevc10_decoding = 1, > .has_vp9_decoding = 1, > + .has_vpp_p010 = 1, > > .num_filters = 5, > .filters = { > @@ -412,7 +413,6 @@ static struct hw_codec_info bxt_hw_codec_info = { > }, > }; > > - > struct hw_codec_info * > i965_get_codec_info(int devid) > { > diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c > index db82b27..cfdce2b 100644 > --- a/src/i965_drv_video.c > +++ b/src/i965_drv_video.c > @@ -112,6 +112,9 @@ > #define HAS_HEVC10_DECODING(ctx) ((ctx)->codec_info- > >has_hevc10_decoding && \ > (ctx)->intel.has_bsd) > > +#define HAS_VPP_P010(ctx) ((ctx)->codec_info->has_vpp_p010 && > \ > + (ctx)->intel.has_bsd) > + > static int get_sampling_from_fourcc(unsigned int fourcc); > > /* Check whether we are rendering to X11 (VA/X11 or VA/GLX API) */ > @@ -878,6 +881,12 @@ i965_get_default_chroma_formats(VADriverContextP > ctx, VAProfile profile, > if (HAS_HEVC10_DECODING(i965) && entrypoint == > VAEntrypointVLD) > chroma_formats |= i965->codec_info- > >hevc_dec_chroma_formats; > break; > + > + case VAProfileNone: > + if(HAS_VPP_P010(i965)) > + chroma_formats |= VA_RT_FORMAT_YUV420_10BPP; > + break; > + > default: > break; > } > @@ -5688,6 +5697,14 @@ i965_QuerySurfaceAttributes(VADriverContextP > ctx, > attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | > VA_SURFACE_ATTRIB_SETTABLE; > attribs[i].value.value.i = VA_FOURCC_YV16; > i++; > + > + if(HAS_VPP_P010(i965)) { > + attribs[i].type = VASurfaceAttribPixelFormat; > + attribs[i].value.type = VAGenericValueTypeInteger; > + attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | > VA_SURFACE_ATTRIB_SETTABLE; > + attribs[i].value.value.i = VA_FOURCC_P010; > + i++; > + } > } > } > } > diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h > index bdb7512..36a9039 100644 > --- a/src/i965_drv_video.h > +++ b/src/i965_drv_video.h > @@ -388,6 +388,7 @@ struct hw_codec_info > unsigned int has_hevc_encoding:1; > unsigned int has_hevc10_decoding:1; > unsigned int has_vp9_decoding:1; > + unsigned int has_vpp_p010:1; > > unsigned int num_filters; > struct i965_filter filters[VAProcFilterCount]; _______________________________________________ Libva mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libva
