OSDN Git Service

ENC: enable avc encoder on cnl
authorQu Pengfei <Pengfei.qu@intel.com>
Fri, 13 Oct 2017 08:21:04 +0000 (16:21 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Thu, 11 Jan 2018 00:25:16 +0000 (08:25 +0800)
Signed-off-by: Pengfei Qu <pengfei.qu@intel.com>
Signed-off-by: peng.chen <peng.c.chen@intel.com>
src/i965_avc_encoder.c
src/i965_drv_video.c
src/i965_encoder.c
test/i965_avce_context_test.cpp

index a334e0a..6cad1cc 100644 (file)
@@ -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;
index 2c7f849..7cb7d3d 100644 (file)
@@ -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);
 
index b0ec645..999da75 100644 (file)
@@ -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;
         }
index 7be2567..aa74eaf 100644 (file)
@@ -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);