[Libva] [libva-intel-driver PATCH] Add support for VEBOX on SKL (v2)
Xiang, Haihao
haihao.xiang at intel.com
Thu Dec 11 06:28:29 PST 2014
Use separate functions to setup VEBOX states
v2: SURFACE_STATE for VEBOX is also changed
Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
---
src/gen75_picture_process.c | 4 +-
src/gen75_vpp_gpe.c | 12 +-
src/gen75_vpp_vebox.c | 464 +++++++++++++++++++++++++++++++++++++++++++-
src/gen75_vpp_vebox.h | 3 +
4 files changed, 477 insertions(+), 6 deletions(-)
diff --git a/src/gen75_picture_process.c b/src/gen75_picture_process.c
index f79ef2c..d64ef05 100644
--- a/src/gen75_picture_process.c
+++ b/src/gen75_picture_process.c
@@ -84,7 +84,9 @@ gen75_vpp_vebox(VADriverContextP ctx,
va_status = gen75_vebox_process_picture(ctx, proc_ctx->vpp_vebox_ctx);
else if (IS_GEN8(i965->intel.device_info))
va_status = gen8_vebox_process_picture(ctx, proc_ctx->vpp_vebox_ctx);
-
+ else if (IS_GEN9(i965->intel.device_info))
+ va_status = gen9_vebox_process_picture(ctx, proc_ctx->vpp_vebox_ctx);
+
return va_status;
}
diff --git a/src/gen75_vpp_gpe.c b/src/gen75_vpp_gpe.c
index 042e4e6..d5cfc9d 100644
--- a/src/gen75_vpp_gpe.c
+++ b/src/gen75_vpp_gpe.c
@@ -611,7 +611,8 @@ vpp_gpe_process(VADriverContextP ctx,
struct i965_driver_data *i965 = i965_driver_data(ctx);
if (IS_HASWELL(i965->intel.device_info))
return gen75_gpe_process(ctx, vpp_gpe_ctx);
- else if (IS_GEN8(i965->intel.device_info))
+ else if (IS_GEN8(i965->intel.device_info) ||
+ IS_GEN9(i965->intel.device_info))
return gen8_gpe_process(ctx, vpp_gpe_ctx);
return VA_STATUS_ERROR_UNIMPLEMENTED;
@@ -651,7 +652,8 @@ vpp_gpe_process_sharpening(VADriverContextP ctx,
struct i965_kernel * vpp_kernels;
if (IS_HASWELL(i965->intel.device_info))
vpp_kernels = gen75_vpp_sharpening_kernels;
- else if (IS_GEN8(i965->intel.device_info))
+ else if (IS_GEN8(i965->intel.device_info) ||
+ IS_GEN9(i965->intel.device_info)) // TODO: build the sharpening kernel for GEN9
vpp_kernels = gen8_vpp_sharpening_kernels;
vpp_gpe_ctx->gpe_load_kernels(ctx,
@@ -875,7 +877,8 @@ vpp_gpe_context_init(VADriverContextP ctx)
struct i965_gpe_context *gpe_ctx = &(vpp_gpe_ctx->gpe_ctx);
assert(IS_HASWELL(i965->intel.device_info) ||
- IS_GEN8(i965->intel.device_info));
+ IS_GEN8(i965->intel.device_info) ||
+ IS_GEN9(i965->intel.device_info));
vpp_gpe_ctx->surface_tmp = VA_INVALID_ID;
vpp_gpe_ctx->surface_tmp_object = NULL;
@@ -899,7 +902,8 @@ vpp_gpe_context_init(VADriverContextP ctx)
gpe_ctx->idrt.max_entries = MAX_INTERFACE_DESC_GEN6;
gpe_ctx->idrt.entry_size = sizeof(struct gen6_interface_descriptor_data);
- } else if (IS_GEN8(i965->intel.device_info)) {
+ } else if (IS_GEN8(i965->intel.device_info) ||
+ IS_GEN9(i965->intel.device_info)) {
vpp_gpe_ctx->gpe_context_init = gen8_gpe_context_init;
vpp_gpe_ctx->gpe_context_destroy = gen8_gpe_context_destroy;
vpp_gpe_ctx->gpe_load_kernels = gen8_gpe_load_kernels;
diff --git a/src/gen75_vpp_vebox.c b/src/gen75_vpp_vebox.c
index a5b8ca2..1912695 100644
--- a/src/gen75_vpp_vebox.c
+++ b/src/gen75_vpp_vebox.c
@@ -221,7 +221,8 @@ void hsw_veb_dndi_table(VADriverContextP ctx, struct intel_vebox_context *proc_c
13 << 6 | // chr temp diff th
7 ); // chr temp diff low
- if (IS_GEN8(i965->intel.device_info))
+ if (IS_GEN8(i965->intel.device_info) ||
+ IS_GEN9(i965->intel.device_info))
*p_table ++ = 0; // parameters for hot pixel,
}
@@ -1657,3 +1658,464 @@ gen8_vebox_process_picture(VADriverContextP ctx,
return VA_STATUS_SUCCESS;
}
+
+void
+skl_veb_dndi_table(VADriverContextP ctx, struct intel_vebox_context *proc_ctx)
+{
+ unsigned int* p_table ;
+ unsigned int progressive_dn = 1;
+ unsigned int dndi_top_first = 0;
+ unsigned int is_mcdi_enabled = 0;
+
+ if (proc_ctx->is_di_enabled) {
+ const VAProcFilterParameterBufferDeinterlacing * const deint_params =
+ proc_ctx->filter_di;
+
+ progressive_dn = 0;
+
+ /* If we are in "First Frame" mode, i.e. past frames are not
+ available for motion measure, then don't use the TFF flag */
+ dndi_top_first = !(deint_params->flags & (proc_ctx->is_first_frame ?
+ VA_DEINTERLACING_BOTTOM_FIELD :
+ VA_DEINTERLACING_BOTTOM_FIELD_FIRST));
+
+ is_mcdi_enabled =
+ (deint_params->algorithm == VAProcDeinterlacingMotionCompensated);
+ }
+
+ /*
+ VAProcFilterParameterBufferDeinterlacing *di_param =
+ (VAProcFilterParameterBufferDeinterlacing *) proc_ctx->filter_di;
+
+ VAProcFilterParameterBuffer * dn_param =
+ (VAProcFilterParameterBuffer *) proc_ctx->filter_dn;
+ */
+ p_table = (unsigned int *)proc_ctx->dndi_state_table.ptr;
+
+ *p_table ++ = ( 140 << 20 | // denoise stad threshold . w1
+ 192 << 12 | // dnmh_history_max
+ 7 << 8 | // dnmh_delta[3:0]
+ 1 ); // denoise moving pixel threshold
+
+ *p_table ++ = ( 38 << 20 | // denoise asd threshold
+ 0 << 10 | // temporal diff th
+ 0 ); // low temporal diff th
+
+ *p_table ++ = ( progressive_dn << 28 | // progressive dn
+ 38 << 16 | // denoise th for sum of complexity measure
+ 32 << 10 | // dnmh_history_init[5:0]
+ 0 ); // reserved
+
+ *p_table ++ = ( 0 << 28 | // hot pixel count
+ 0 << 20 | // hot pixel threshold
+ 1 << 12 | // block noise estimate edge threshold
+ 20 ); // block noise estimate noise threshold
+
+ *p_table ++ = ( 140<< 16 | // chroma denoise stad threshold
+ 0 << 13 | // reserved
+ 1 << 12 | // chrome denoise enable
+ 13 << 6 | // chr temp diff th
+ 7 ); // chr temp diff low
+
+ *p_table ++ = 0; // weight
+
+ *p_table ++ = ( 0 << 16 | // dn_thmax
+ 0 ); // dn_thmin
+
+ *p_table ++ = ( 0 << 16 | // dn_prt5
+ 0 ); // dn_dyn_thmin
+
+ *p_table ++ = ( 0 << 16 | // dn_prt4
+ 0 ); // dn_prt3
+
+ *p_table ++ = ( 0 << 16 | // dn_prt2
+ 0 ); // dn_prt1
+
+ *p_table ++ = ( 0 << 16 | // dn_prt0
+ 0 << 10 | // dn_wd22
+ 0 << 5 | // dh_wd21
+ 0 ); // dh_wd20
+
+ *p_table ++ = ( 0 << 25 | // dn_wd12
+ 0 << 20 | // dn_wd11
+ 0 << 15 | // dn_wd10
+ 0 << 10 | // dn_wd02
+ 0 << 5 | // dn_wd01
+ 0 ); // dn_wd00
+
+ *p_table ++ = ( 2 << 10 | // stmm c2
+ 9 << 6 | // cat slope minus 1
+ 5 << 2 | // sad tight threshold
+ 0 ); // smooth mv th
+
+ *p_table ++ = ( 0 << 31 | // stmm blending constant select
+ 64 << 24 | // stmm trc1
+ 125<< 16 | // stmm trc2
+ 0 << 14 | // reserved
+ 30 << 8 | // multiplier for vecm
+ 150 ); // maximum stmm
+
+ *p_table ++ = ( 118<< 24 | // minumum stmm
+ 0 << 22 | // stmm shift down
+ 1 << 20 | // stmm shift up
+ 5 << 16 | // stmm output shift
+ 100 << 8 | // sdi threshold
+ 5 ); // sdi delta
+
+ *p_table ++ = ( 50 << 24 | // sdi fallback mode 1 t1 constant
+ 100 << 16 | // sdi fallback mode 1 t2 constant
+ 37 << 8 | // sdi fallback mode 2 constant(angle2x1)
+ 175 ); // fmd temporal difference threshold
+
+ *p_table ++ = ( 16 << 24 | // fmd #1 vertical difference th . w7
+ 100<< 16 | // fmd #2 vertical difference th
+ 0 << 14 | // cat threshold
+ 2 << 8 | // fmd tear threshold
+ is_mcdi_enabled << 7 | // mcdi enable, use motion compensated deinterlace algorithm
+ dndi_top_first << 3 | // dn/di top first
+ 0 ); // reserved
+
+ *p_table ++ = ( 10 << 19 | // neighbor pixel threshold
+ 0 << 16 | // fmd for 2nd field of previous frame
+ 25 << 10 | // mc pixel consistency threshold
+ 0 << 8 | // fmd for 1st field for current frame
+ 10 << 4 | // sad thb
+ 5 ); // sad tha
+}
+
+void skl_veb_iecp_csc_table(VADriverContextP ctx, struct intel_vebox_context *proc_ctx)
+{
+ unsigned int *p_table = (unsigned int*)(proc_ctx->iecp_state_table.ptr + 220);
+ float tran_coef[9] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
+ float v_coef[3] = {0.0, 0.0, 0.0};
+ float u_coef[3] = {0.0, 0.0, 0.0};
+ int is_transform_enabled = 0;
+
+ if(!(proc_ctx->filters_mask & VPP_IECP_CSC)){
+ memset(p_table, 0, 12 * 4);
+ return;
+ }
+
+ if(proc_ctx->fourcc_input == VA_FOURCC_RGBA &&
+ (proc_ctx->fourcc_output == VA_FOURCC_NV12 ||
+ proc_ctx->fourcc_output == VA_FOURCC_YV12 ||
+ proc_ctx->fourcc_output == VA_FOURCC_YVY2 ||
+ proc_ctx->fourcc_output == VA_FOURCC_AYUV)) {
+
+ tran_coef[0] = 0.257;
+ tran_coef[1] = 0.504;
+ tran_coef[2] = 0.098;
+ tran_coef[3] = -0.148;
+ tran_coef[4] = -0.291;
+ tran_coef[5] = 0.439;
+ tran_coef[6] = 0.439;
+ tran_coef[7] = -0.368;
+ tran_coef[8] = -0.071;
+
+ u_coef[0] = 16 * 4;
+ u_coef[1] = 128 * 4;
+ u_coef[2] = 128 * 4;
+
+ is_transform_enabled = 1;
+ }else if((proc_ctx->fourcc_input == VA_FOURCC_NV12 ||
+ proc_ctx->fourcc_input == VA_FOURCC_YV12 ||
+ proc_ctx->fourcc_input == VA_FOURCC_YUY2 ||
+ proc_ctx->fourcc_input == VA_FOURCC_AYUV) &&
+ proc_ctx->fourcc_output == VA_FOURCC_RGBA) {
+ tran_coef[0] = 1.164;
+ tran_coef[1] = 0.000;
+ tran_coef[2] = 1.569;
+ tran_coef[3] = 1.164;
+ tran_coef[4] = -0.813;
+ tran_coef[5] = -0.392;
+ tran_coef[6] = 1.164;
+ tran_coef[7] = 2.017;
+ tran_coef[8] = 0.000;
+
+ v_coef[0] = -16 * 4;
+ v_coef[1] = -128 * 4;
+ v_coef[2] = -128 * 4;
+
+ is_transform_enabled = 1;
+ }else if(proc_ctx->fourcc_input != proc_ctx->fourcc_output){
+ //enable when input and output format are different.
+ is_transform_enabled = 1;
+ }
+
+ if(is_transform_enabled == 0){
+ memset(p_table, 0, 12 * 4);
+ }else{
+ *p_table ++ = ( is_transform_enabled << 31 |
+ 0 << 29 | // yuv_channel swap
+ intel_format_convert(tran_coef[0], 2, 16, 1)); //c0, s2.16 format
+
+ *p_table ++ = ( 0 << 19 | //reserved
+ intel_format_convert(tran_coef[1], 2, 16, 1)); //c1, s2.16 format
+
+ *p_table ++ = ( 0 << 19 | //reserved
+ intel_format_convert(tran_coef[2], 2, 16, 1)); //c2, s2.16 format
+
+ *p_table ++ = ( 0 << 19 | //reserved
+ intel_format_convert(tran_coef[3], 2, 16, 1)); //c3, s2.16 format
+
+ *p_table ++ = ( 0 << 19 | //reserved
+ intel_format_convert(tran_coef[4], 2, 16, 1)); //c4, s2.16 format
+
+ *p_table ++ = ( 0 << 19 | //reserved
+ intel_format_convert(tran_coef[5], 2, 16, 1)); //c5, s2.16 format
+
+ *p_table ++ = ( 0 << 19 | //reserved
+ intel_format_convert(tran_coef[6], 2, 16, 1)); //c6, s2.16 format
+
+ *p_table ++ = ( 0 << 19 | //reserved
+ intel_format_convert(tran_coef[7], 2, 16, 1)); //c7, s2.16 format
+
+ *p_table ++ = ( 0 << 19 | //reserved
+ intel_format_convert(tran_coef[8], 2, 16, 1)); //c8, s2.16 format
+
+ *p_table ++ = ( intel_format_convert(u_coef[0], 16, 0, 1) << 16 |
+ intel_format_convert(v_coef[0], 16, 0, 1));
+
+ *p_table ++ = ( intel_format_convert(u_coef[1], 16, 0, 1) << 16 |
+ intel_format_convert(v_coef[1], 16, 0, 1));
+
+ *p_table ++ = ( intel_format_convert(u_coef[2], 16, 0, 1) << 16 |
+ intel_format_convert(v_coef[2], 16, 0, 1));
+ }
+}
+
+void skl_veb_iecp_aoi_table(VADriverContextP ctx, struct intel_vebox_context *proc_ctx)
+{
+ unsigned int *p_table = (unsigned int*)(proc_ctx->iecp_state_table.ptr + 27 * sizeof(unsigned int));
+
+ if (!(proc_ctx->filters_mask & VPP_IECP_AOI)) {
+ memset(p_table, 0, 3 * 4);
+ } else {
+ *p_table ++ = 0x00000000;
+ *p_table ++ = 0x00030000;
+ *p_table ++ = 0x00030000;
+ }
+}
+
+void skl_veb_state_table_setup(VADriverContextP ctx, struct intel_vebox_context *proc_ctx)
+{
+ if(proc_ctx->filters_mask & VPP_DNDI_MASK) {
+ dri_bo *dndi_bo = proc_ctx->dndi_state_table.bo;
+ dri_bo_map(dndi_bo, 1);
+ proc_ctx->dndi_state_table.ptr = dndi_bo->virtual;
+
+ skl_veb_dndi_table(ctx, proc_ctx);
+
+ dri_bo_unmap(dndi_bo);
+ }
+
+ if(proc_ctx->filters_mask & VPP_IECP_MASK) {
+ dri_bo *iecp_bo = proc_ctx->iecp_state_table.bo;
+ dri_bo_map(iecp_bo, 1);
+ proc_ctx->iecp_state_table.ptr = iecp_bo->virtual;
+
+ hsw_veb_iecp_std_table(ctx, proc_ctx);
+ hsw_veb_iecp_ace_table(ctx, proc_ctx);
+ hsw_veb_iecp_tcc_table(ctx, proc_ctx);
+ hsw_veb_iecp_pro_amp_table(ctx, proc_ctx);
+ skl_veb_iecp_csc_table(ctx, proc_ctx);
+ skl_veb_iecp_aoi_table(ctx, proc_ctx);
+
+ dri_bo_unmap(iecp_bo);
+ }
+}
+
+void
+skl_veb_state_command(VADriverContextP ctx, struct intel_vebox_context *proc_ctx)
+{
+ struct intel_batchbuffer *batch = proc_ctx->batch;
+
+ BEGIN_VEB_BATCH(batch, 0x10);
+ OUT_VEB_BATCH(batch, VEB_STATE | (0x10 - 2));
+ OUT_VEB_BATCH(batch,
+ 0 << 25 | // state surface control bits
+ 0 << 23 | // reserved.
+ 0 << 22 | // gamut expansion position
+ 0 << 15 | // reserved.
+ 0 << 14 | // single slice vebox enable
+ 0 << 13 | // hot pixel filter enable
+ 0 << 12 | // alpha plane enable
+ 0 << 11 | // vignette enable
+ 0 << 10 | // demosaic enable
+ proc_ctx->current_output_type << 8 | // DI output frame
+ 1 << 7 | // 444->422 downsample method
+ 1 << 6 | // 422->420 downsample method
+ proc_ctx->is_first_frame << 5 | // DN/DI first frame
+ proc_ctx->is_di_enabled << 4 | // DI enable
+ proc_ctx->is_dn_enabled << 3 | // DN enable
+ proc_ctx->is_iecp_enabled << 2 | // global IECP enabled
+ 0 << 1 | // ColorGamutCompressionEnable
+ 0 ) ; // ColorGamutExpansionEnable.
+
+ OUT_RELOC(batch,
+ proc_ctx->dndi_state_table.bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+
+ OUT_VEB_BATCH(batch, 0);
+
+ OUT_RELOC(batch,
+ proc_ctx->iecp_state_table.bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+
+ OUT_VEB_BATCH(batch, 0);
+
+ OUT_RELOC(batch,
+ proc_ctx->gamut_state_table.bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+
+ OUT_VEB_BATCH(batch, 0);
+
+ OUT_RELOC(batch,
+ proc_ctx->vertex_state_table.bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+
+ OUT_VEB_BATCH(batch, 0);
+
+ OUT_VEB_BATCH(batch, 0);/*caputre pipe state pointer*/
+ OUT_VEB_BATCH(batch, 0);
+
+ OUT_VEB_BATCH(batch, 0);/*lace lut table state pointer*/
+ OUT_VEB_BATCH(batch, 0);
+
+ OUT_VEB_BATCH(batch, 0);/*gamma correction values address*/
+ OUT_VEB_BATCH(batch, 0);
+
+ ADVANCE_VEB_BATCH(batch);
+}
+
+void skl_veb_surface_state(VADriverContextP ctx, struct intel_vebox_context *proc_ctx, unsigned int is_output)
+{
+ struct intel_batchbuffer *batch = proc_ctx->batch;
+ unsigned int u_offset_y = 0, v_offset_y = 0;
+ unsigned int is_uv_interleaved = 0, tiling = 0, swizzle = 0;
+ unsigned int surface_format = PLANAR_420_8;
+ struct object_surface* obj_surf = NULL;
+ unsigned int surface_pitch = 0;
+ unsigned int half_pitch_chroma = 0;
+ unsigned int derived_pitch;
+
+ if (is_output) {
+ obj_surf = proc_ctx->frame_store[FRAME_OUT_CURRENT].obj_surface;
+ } else {
+ obj_surf = proc_ctx->frame_store[FRAME_IN_CURRENT].obj_surface;
+ }
+
+ 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);
+
+ if (obj_surf->fourcc == VA_FOURCC_NV12) {
+ surface_format = PLANAR_420_8;
+ surface_pitch = obj_surf->width;
+ is_uv_interleaved = 1;
+ half_pitch_chroma = 0;
+ } else if (obj_surf->fourcc == VA_FOURCC_YUY2) {
+ surface_format = YCRCB_NORMAL;
+ surface_pitch = obj_surf->width * 2;
+ is_uv_interleaved = 0;
+ half_pitch_chroma = 0;
+ } else if (obj_surf->fourcc == VA_FOURCC_AYUV) {
+ surface_format = PACKED_444A_8;
+ surface_pitch = obj_surf->width * 4;
+ is_uv_interleaved = 0;
+ half_pitch_chroma = 0;
+ } else if (obj_surf->fourcc == VA_FOURCC_RGBA) {
+ surface_format = R8G8B8A8_UNORM_SRGB;
+ surface_pitch = obj_surf->width * 4;
+ is_uv_interleaved = 0;
+ half_pitch_chroma = 0;
+ }
+
+ derived_pitch = surface_pitch;
+
+ u_offset_y = obj_surf->y_cb_offset;
+ v_offset_y = obj_surf->y_cr_offset;
+
+ dri_bo_get_tiling(obj_surf->bo, &tiling, &swizzle);
+
+ BEGIN_VEB_BATCH(batch, 9);
+ OUT_VEB_BATCH(batch, VEB_SURFACE_STATE | (9 - 2));
+ OUT_VEB_BATCH(batch,
+ 0 << 1 | // reserved
+ is_output); // surface indentification.
+
+ OUT_VEB_BATCH(batch,
+ (obj_surf->height - 1) << 18 | // height . w3
+ (obj_surf->width -1 ) << 4 | // width
+ 0); // reserve
+
+ OUT_VEB_BATCH(batch,
+ surface_format << 28 | // surface format, YCbCr420. w4
+ is_uv_interleaved << 27 | // interleave chrome , two seperate palar
+ 0 << 20 | // reserved
+ (surface_pitch - 1) << 3 | // surface pitch, 64 align
+ half_pitch_chroma << 2 | // half pitch for chrome
+ !!tiling << 1 | // tiled surface, linear surface used
+ (tiling == I915_TILING_Y)); // tiled walk, ignored when liner surface
+
+ OUT_VEB_BATCH(batch,
+ 0 << 16 | // X offset for V(Cb)
+ u_offset_y); // Y offset for V(Cb)
+
+ OUT_VEB_BATCH(batch,
+ 0 << 16 | // X offset for V(Cr)
+ v_offset_y ); // Y offset for V(Cr)
+
+ OUT_VEB_BATCH(batch, 0);
+
+ OUT_VEB_BATCH(batch, derived_pitch - 1);
+
+ OUT_VEB_BATCH(batch, 0);
+
+ ADVANCE_VEB_BATCH(batch);
+}
+
+VAStatus
+gen9_vebox_process_picture(VADriverContextP ctx,
+ struct intel_vebox_context *proc_ctx)
+{
+ VAStatus status;
+
+ status = gen75_vebox_init_pipe_params(ctx, proc_ctx);
+ if (status != VA_STATUS_SUCCESS)
+ return status;
+
+ status = gen75_vebox_init_filter_params(ctx, proc_ctx);
+ if (status != VA_STATUS_SUCCESS)
+ return status;
+
+ hsw_veb_pre_format_convert(ctx, proc_ctx);
+
+ status = gen75_vebox_ensure_surfaces(ctx, proc_ctx);
+ if (status != VA_STATUS_SUCCESS)
+ return status;
+
+ status = gen75_vebox_ensure_surfaces_storage(ctx, proc_ctx);
+ if (status != VA_STATUS_SUCCESS)
+ return status;
+
+ if (proc_ctx->format_convert_flags & POST_COPY_CONVERT) {
+ assert(proc_ctx->is_second_field);
+ /* directly copy the saved frame in the second call */
+ } else {
+ intel_batchbuffer_start_atomic_veb(proc_ctx->batch, 0x1000);
+ intel_batchbuffer_emit_mi_flush(proc_ctx->batch);
+ skl_veb_state_table_setup(ctx, proc_ctx);
+ skl_veb_state_command(ctx, proc_ctx);
+ skl_veb_surface_state(ctx, proc_ctx, INPUT_SURFACE);
+ skl_veb_surface_state(ctx, proc_ctx, OUTPUT_SURFACE);
+ bdw_veb_dndi_iecp_command(ctx, proc_ctx);
+ intel_batchbuffer_end_atomic(proc_ctx->batch);
+ intel_batchbuffer_flush(proc_ctx->batch);
+ }
+
+ hsw_veb_post_format_convert(ctx, proc_ctx);
+
+ return VA_STATUS_SUCCESS;
+}
diff --git a/src/gen75_vpp_vebox.h b/src/gen75_vpp_vebox.h
index d857b87..a0d5e2e 100644
--- a/src/gen75_vpp_vebox.h
+++ b/src/gen75_vpp_vebox.h
@@ -164,4 +164,7 @@ struct intel_vebox_context * gen75_vebox_context_init(VADriverContextP ctx);
VAStatus gen8_vebox_process_picture(VADriverContextP ctx,
struct intel_vebox_context *proc_ctx);
+VAStatus gen9_vebox_process_picture(VADriverContextP ctx,
+ struct intel_vebox_context *proc_ctx);
+
#endif
--
1.9.1
More information about the Libva
mailing list