summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQu Pengfei <Pengfei.qu@intel.com>2017-10-13 16:21:04 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2018-01-11 08:25:16 +0800
commit4c1992b1aae12487c2578ee8dc2b5c2640ef797a (patch)
tree4f43c8a69dac971f89c8de99629c4548673f8154
parent6557bb485cd57543170cb0958146e72a62031bf8 (diff)
downloadlibva-intel-driver-4c1992b1aae12487c2578ee8dc2b5c2640ef797a.tar.gz
ENC: enable avc encoder on cnl
Signed-off-by: Pengfei Qu <pengfei.qu@intel.com> Signed-off-by: peng.chen <peng.c.chen@intel.com>
-rw-r--r--src/i965_avc_encoder.c63
-rw-r--r--src/i965_drv_video.c8
-rw-r--r--src/i965_encoder.c10
-rw-r--r--test/i965_avce_context_test.cpp3
4 files changed, 60 insertions, 24 deletions
diff --git a/src/i965_avc_encoder.c b/src/i965_avc_encoder.c
index a334e0af..6cad1cc3 100644
--- a/src/i965_avc_encoder.c
+++ b/src/i965_avc_encoder.c
@@ -2438,6 +2438,7 @@ gen9_avc_init_brc_const_data(VADriverContextP ctx,
}
if (IS_KBL(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info) ||
IS_GLK(i965->intel.device_info)) {
data += size;
@@ -2892,6 +2893,7 @@ gen9_avc_send_surface_brc_frame_update(VADriverContextP ctx,
IS_GEN8(i965->intel.device_info))
is_g95 = 0;
else if (IS_KBL(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info) ||
IS_GLK(i965->intel.device_info))
is_g95 = 1;
@@ -3519,6 +3521,7 @@ gen9_avc_set_curbe_mbenc(VADriverContextP ctx,
}
} else if (IS_KBL(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info) ||
IS_GLK(i965->intel.device_info)) {
cmd.g95 = (gen95_avc_mbenc_curbe_data *)i965_gpe_context_map_curbe(gpe_context);
if (!cmd.g95)
@@ -3676,17 +3679,15 @@ gen9_avc_set_curbe_mbenc(VADriverContextP ctx,
if (avc_state->adaptive_transform_decision_enable) {
if (generic_state->frame_type != SLICE_TYPE_I) {
- cmd.g9->dw34.enable_adaptive_tx_decision = 1;
- if (is_g95) {
- cmd.g95->dw60.mb_texture_threshold = 1024;
- cmd.g95->dw60.tx_decision_threshold = 128;
+ if (is_g9) {
+ cmd.g9->dw34.enable_adaptive_tx_decision = 1;
+ cmd.g9->dw58.mb_texture_threshold = 1024;
+ cmd.g9->dw58.tx_decision_threshold = 128;
+ } else if (is_g95) {
+ cmd.g95->dw34.enable_adaptive_tx_decision = 1;
+ cmd.g9->dw58.mb_texture_threshold = 1024;
+ cmd.g9->dw58.tx_decision_threshold = 128;
}
-
- }
-
- if (is_g9) {
- cmd.g9->dw58.mb_texture_threshold = 1024;
- cmd.g9->dw58.tx_decision_threshold = 128;
}
}
@@ -3858,7 +3859,10 @@ gen9_avc_set_curbe_mbenc(VADriverContextP ctx,
}
cmd.g9->dw34.enable_per_mb_static_check = avc_state->sfd_enable && generic_state->hme_enabled;
- cmd.g9->dw34.enable_adaptive_search_window_size = avc_state->adaptive_search_window_enable;
+ if (is_g9)
+ cmd.g9->dw34.enable_adaptive_search_window_size = avc_state->adaptive_search_window_enable;
+ else if (is_g95)
+ cmd.g95->dw34.enable_adaptive_search_window_size = avc_state->adaptive_search_window_enable;
/*roi set disable by now. 49-56*/
if (curbe_param->roi_enabled) {
@@ -4464,6 +4468,7 @@ gen9_avc_send_surface_mbenc(VADriverContextP ctx,
IS_BXT(i965->intel.device_info))
is_g95 = 0;
else if (IS_KBL(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info) ||
IS_GLK(i965->intel.device_info))
is_g95 = 1;
@@ -4788,11 +4793,14 @@ gen9_avc_send_surface_mbenc(VADriverContextP ctx,
gpe_resource = &(avc_ctx->res_sfd_cost_table_b_frame_buffer);
}
if (generic_state->frame_type != SLICE_TYPE_I) {
- i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
- gpe_resource,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- (is_g95 ? GEN95_AVC_MBENC_SFD_COST_TABLE_INDEX : GEN9_AVC_MBENC_SFD_COST_TABLE_INDEX));
+ size = 64;
+ i965_add_buffer_gpe_surface(ctx,
+ gpe_context,
+ gpe_resource,
+ 0,
+ size / 4,
+ 0,
+ (is_g95 ? GEN95_AVC_MBENC_SFD_COST_TABLE_INDEX : GEN9_AVC_MBENC_SFD_COST_TABLE_INDEX));
}
@@ -7426,6 +7434,7 @@ gen9_avc_kernel_init_scaling(VADriverContextP ctx,
kernel_param.inline_data_size = sizeof(gen95_avc_scaling4x_curbe_data);
}
} else if (IS_KBL(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info) ||
IS_GLK(i965->intel.device_info)) {
kernel_param.curbe_size = sizeof(gen95_avc_scaling4x_curbe_data);
kernel_param.inline_data_size = sizeof(gen95_avc_scaling4x_curbe_data);
@@ -7612,6 +7621,7 @@ gen9_avc_kernel_init_mbenc(VADriverContextP ctx,
num_mbenc_kernels = NUM_GEN9_AVC_FEI_KERNEL_MBENC;
}
} else if (IS_KBL(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info) ||
IS_GLK(i965->intel.device_info)) {
curbe_size = sizeof(gen95_avc_mbenc_curbe_data);
num_mbenc_kernels = NUM_GEN9_AVC_KERNEL_MBENC;
@@ -9080,6 +9090,7 @@ gen9_avc_kernel_init(VADriverContextP ctx,
IS_BXT(i965->intel.device_info))
generic_ctx->pfn_set_curbe_scaling4x = gen9_avc_set_curbe_scaling4x;
else if (IS_KBL(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info) ||
IS_GLK(i965->intel.device_info))
generic_ctx->pfn_set_curbe_scaling4x = gen95_avc_set_curbe_scaling4x;
@@ -9237,10 +9248,14 @@ gen9_mfc_avc_pipe_buf_addr_state(VADriverContextP ctx, struct intel_encoder_cont
struct i965_avc_encoder_context * avc_ctx = (struct i965_avc_encoder_context *)pak_context->private_enc_ctx;
struct intel_batchbuffer *batch = encoder_context->base.batch;
int i;
+ unsigned int cmd_len = 65;
- BEGIN_BCS_BATCH(batch, 65);
+ if (IS_GEN10(i965->intel.device_info))
+ cmd_len = 68;
- OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (65 - 2));
+ BEGIN_BCS_BATCH(batch, cmd_len);
+
+ OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (cmd_len - 2));
/* the DW1-3 is for pre_deblocking */
OUT_BUFFER_3DW(batch, avc_ctx->res_pre_deblocking_output.bo, 1, 0, i965->intel.mocs_state);
@@ -9283,6 +9298,13 @@ gen9_mfc_avc_pipe_buf_addr_state(VADriverContextP ctx, struct intel_encoder_cont
/* the DW 62-64 is the buffer */
OUT_BUFFER_3DW(batch, NULL, 0, 0, 0);
+ /*65-67 for CNL */
+ if (IS_GEN10(i965->intel.device_info)) {
+ OUT_BCS_BATCH(batch, 0);
+ OUT_BCS_BATCH(batch, 0);
+ OUT_BCS_BATCH(batch, 0);
+ }
+
ADVANCE_BCS_BATCH(batch);
}
@@ -10990,6 +11012,9 @@ gen9_avc_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *en
IS_GLK(i965->intel.device_info)) {
generic_ctx->enc_kernel_ptr = (void *)kbl_avc_encoder_kernels;
generic_ctx->enc_kernel_size = sizeof(kbl_avc_encoder_kernels);
+ } else if (IS_GEN10(i965->intel.device_info)) {
+ generic_ctx->enc_kernel_ptr = (void *)cnl_avc_encoder_kernels;
+ generic_ctx->enc_kernel_size = sizeof(cnl_avc_encoder_kernels);
} else
goto allocate_structure_failed;
@@ -11194,6 +11219,7 @@ gen9_avc_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *en
avc_state->brc_const_data_surface_height = 44;
avc_state->brc_split_enable = 1;
} else if (IS_KBL(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info) ||
IS_GLK(i965->intel.device_info)) {
avc_state->brc_const_data_surface_width = 64;
avc_state->brc_const_data_surface_height = 53;
@@ -11205,6 +11231,7 @@ gen9_avc_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *en
avc_state->kernel_trellis_enable = 1;
avc_state->lambda_table_enable = 1;
avc_state->brc_split_enable = 1;
+ avc_state->adaptive_transform_decision_enable = 1;// CNL
}
avc_state->num_refs[0] = 0;
diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
index 2c7f8498..7cb7d3d2 100644
--- a/src/i965_drv_video.c
+++ b/src/i965_drv_video.c
@@ -1083,7 +1083,8 @@ i965_GetConfigAttributes(VADriverContextP ctx,
profile == VAProfileH264High) {
attrib_list[i].value = ENCODER_QUALITY_RANGE;
if (entrypoint == VAEntrypointEncSlice) {
- if (IS_GEN9(i965->intel.device_info))
+ if (IS_GEN9(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info))
attrib_list[i].value = ENCODER_QUALITY_RANGE_AVC;
}
} else if (profile == VAProfileHEVCMain ||
@@ -1128,6 +1129,9 @@ i965_GetConfigAttributes(VADriverContextP ctx,
entrypoint == VAEntrypointFEI ||
entrypoint == VAEntrypointStats))
attrib_list[i].value = 0;
+ else if (IS_GEN10(i965->intel.device_info) &&
+ (entrypoint == VAEntrypointEncSlice || entrypoint == VAEntrypointFEI))
+ attrib_list[i].value = 0;
else {
if (entrypoint == VAEntrypointEncSliceLP) {
roi_config->bits.num_roi_regions = 3;
@@ -1160,6 +1164,8 @@ i965_GetConfigAttributes(VADriverContextP ctx,
entrypoint == VAEntrypointEncSlice) {
if (IS_GEN9(i965->intel.device_info))
attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
+ else if (IS_GEN10(i965->intel.device_info))
+ attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
else {
VAConfigAttribValEncRateControlExt *val_config = (VAConfigAttribValEncRateControlExt *) & (attrib_list[i].value);
diff --git a/src/i965_encoder.c b/src/i965_encoder.c
index b0ec645c..999da753 100644
--- a/src/i965_encoder.c
+++ b/src/i965_encoder.c
@@ -838,8 +838,8 @@ intel_encoder_check_misc_parameter(VADriverContextP ctx,
case VAProfileH264High:
case VAProfileH264MultiviewHigh:
case VAProfileH264StereoHigh:
- if (IS_SKL(i965->intel.device_info) ||
- IS_BXT(i965->intel.device_info))
+ if (IS_GEN9(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info))
encoder_context->quality_level = ENCODER_DEFAULT_QUALITY_AVC;
break;
@@ -1553,7 +1553,8 @@ intel_enc_hw_context_init(VADriverContextP ctx,
if (obj_config->entrypoint == VAEntrypointEncSliceLP)
encoder_context->quality_range = ENCODER_LP_QUALITY_RANGE;
- else if (IS_GEN9(i965->intel.device_info)) {
+ else if (IS_GEN9(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info)) {
encoder_context->quality_level = ENCODER_DEFAULT_QUALITY_AVC;
encoder_context->quality_range = ENCODER_QUALITY_RANGE_AVC;
} else
@@ -1576,7 +1577,8 @@ intel_enc_hw_context_init(VADriverContextP ctx,
case VAProfileH264StereoHigh:
case VAProfileH264MultiviewHigh:
- if (IS_GEN9(i965->intel.device_info)) {
+ if (IS_GEN9(i965->intel.device_info) ||
+ IS_GEN10(i965->intel.device_info)) {
encoder_context->quality_level = ENCODER_DEFAULT_QUALITY_AVC;
encoder_context->quality_range = ENCODER_QUALITY_RANGE_AVC;
}
diff --git a/test/i965_avce_context_test.cpp b/test/i965_avce_context_test.cpp
index 7be25673..aa74eaf8 100644
--- a/test/i965_avce_context_test.cpp
+++ b/test/i965_avce_context_test.cpp
@@ -61,7 +61,8 @@ protected:
struct i965_driver_data *i965(*this);
if (not i965) return NULL;
- if (IS_GEN9(i965->intel.device_info))
+ if (IS_GEN9(i965->intel.device_info)
+ ||IS_GEN10(i965->intel.device_info))
is_gen9 = true;
struct object_context const *obj_context = CONTEXT(context);