[Libva] [PATCH 22/31] ENC: kernel init/destroy function for AVC encoder

Sean V Kelley seanvk at posteo.de
Tue Jan 10 23:38:04 UTC 2017


From: Pengfei Qu <Pengfei.Qu at intel.com>

Signed-off-by: Pengfei Qu <Pengfei.Qu at intel.com>
Reviewed-by: Sean V Kelley <seanvk at posteo.de>
---
 src/gen9_avc_encoder.c | 306 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 306 insertions(+)

diff --git a/src/gen9_avc_encoder.c b/src/gen9_avc_encoder.c
index ea83cbd0..f8dc45c6 100755
--- a/src/gen9_avc_encoder.c
+++ b/src/gen9_avc_encoder.c
@@ -4489,3 +4489,309 @@ gen9_avc_kernel_sfd(VADriverContextP ctx,
 
     return VA_STATUS_SUCCESS;
 }
+
+/*
+kernel related function:init/destroy etc
+*/
+static void
+gen9_avc_kernel_init_scaling(VADriverContextP ctx,
+                             struct generic_encoder_context *generic_context,
+                             struct gen9_avc_scaling_context *kernel_context)
+{
+    struct i965_gpe_context *gpe_context = NULL;
+    struct encoder_kernel_parameter kernel_param ;
+    struct encoder_scoreboard_parameter scoreboard_param;
+    struct i965_kernel common_kernel;
+
+    /* 4x scaling kernel*/
+    kernel_param.curbe_size = sizeof(gen9_avc_scaling4x_curbe_data);
+    kernel_param.inline_data_size = sizeof(gen9_avc_scaling4x_curbe_data);
+    kernel_param.sampler_size = 0;
+
+    memset(&scoreboard_param, 0, sizeof(scoreboard_param));
+    scoreboard_param.mask = 0xFF;
+    scoreboard_param.enable = generic_context->use_hw_scoreboard;
+    scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
+    scoreboard_param.walkpat_flag = 0;
+
+    gpe_context = &kernel_context->gpe_contexts[GEN9_AVC_KERNEL_SCALING_4X_IDX];
+    gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
+    gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
+
+    memset(&common_kernel, 0, sizeof(common_kernel));
+
+    intel_avc_get_kernel_header_and_size((void *)media_avc_kernels,
+                                         sizeof(media_avc_kernels),
+                                         INTEL_GENERIC_ENC_SCALING4X,
+                                         0,
+                                         &common_kernel);
+
+    gen8_gpe_load_kernels(ctx,
+                          gpe_context,
+                          &common_kernel,
+                          1);
+
+    /*2x scaling kernel*/
+    kernel_param.curbe_size = sizeof(gen9_avc_scaling2x_curbe_data);
+    kernel_param.inline_data_size = 0;
+    kernel_param.sampler_size = 0;
+
+    gpe_context = &kernel_context->gpe_contexts[GEN9_AVC_KERNEL_SCALING_2X_IDX];
+    gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
+    gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
+
+    memset(&common_kernel, 0, sizeof(common_kernel));
+
+    intel_avc_get_kernel_header_and_size((void *)media_avc_kernels,
+                                         sizeof(media_avc_kernels),
+                                         INTEL_GENERIC_ENC_SCALING2X,
+                                         0,
+                                         &common_kernel);
+
+    gen8_gpe_load_kernels(ctx,
+                          gpe_context,
+                          &common_kernel,
+                          1);
+
+}
+
+static void
+gen9_avc_kernel_init_me(VADriverContextP ctx,
+                        struct generic_encoder_context *generic_context,
+                        struct gen9_avc_me_context *kernel_context)
+{
+    struct i965_gpe_context *gpe_context = NULL;
+    struct encoder_kernel_parameter kernel_param ;
+    struct encoder_scoreboard_parameter scoreboard_param;
+    struct i965_kernel common_kernel;
+    int i = 0;
+
+    kernel_param.curbe_size = sizeof(gen9_avc_me_curbe_data);
+    kernel_param.inline_data_size = 0;
+    kernel_param.sampler_size = 0;
+
+    memset(&scoreboard_param, 0, sizeof(scoreboard_param));
+    scoreboard_param.mask = 0xFF;
+    scoreboard_param.enable = generic_context->use_hw_scoreboard;
+    scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
+    scoreboard_param.walkpat_flag = 0;
+
+    for (i = 0; i < 2; i++) {
+        gpe_context = &kernel_context->gpe_contexts[i];
+        gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
+        gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
+
+        memset(&common_kernel, 0, sizeof(common_kernel));
+
+        intel_avc_get_kernel_header_and_size((void *)media_avc_kernels,
+                                             sizeof(media_avc_kernels),
+                                             INTEL_GENERIC_ENC_ME,
+                                             i,
+                                             &common_kernel);
+
+        gen8_gpe_load_kernels(ctx,
+                              gpe_context,
+                              &common_kernel,
+                              1);
+    }
+
+}
+
+static void
+gen9_avc_kernel_init_mbenc(VADriverContextP ctx,
+                           struct generic_encoder_context *generic_context,
+                           struct gen9_avc_mbenc_context *kernel_context)
+{
+    struct i965_gpe_context *gpe_context = NULL;
+    struct encoder_kernel_parameter kernel_param ;
+    struct encoder_scoreboard_parameter scoreboard_param;
+    struct i965_kernel common_kernel;
+    int i = 0;
+
+    kernel_param.curbe_size = sizeof(gen9_avc_mbenc_curbe_data);
+    kernel_param.inline_data_size = 0;
+    kernel_param.sampler_size = 0;
+
+    memset(&scoreboard_param, 0, sizeof(scoreboard_param));
+    scoreboard_param.mask = 0xFF;
+    scoreboard_param.enable = generic_context->use_hw_scoreboard;
+    scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
+    scoreboard_param.walkpat_flag = 0;
+
+    for (i = 0; i < NUM_GEN9_AVC_KERNEL_MBENC ; i++) {
+        gpe_context = &kernel_context->gpe_contexts[i];
+        gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
+        gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
+
+        memset(&common_kernel, 0, sizeof(common_kernel));
+
+        intel_avc_get_kernel_header_and_size((void *)media_avc_kernels,
+                                             sizeof(media_avc_kernels),
+                                             INTEL_GENERIC_ENC_MBENC,
+                                             i,
+                                             &common_kernel);
+
+        gen8_gpe_load_kernels(ctx,
+                              gpe_context,
+                              &common_kernel,
+                              1);
+    }
+
+}
+
+static void
+gen9_avc_kernel_init_brc(VADriverContextP ctx,
+                         struct generic_encoder_context *generic_context,
+                         struct gen9_avc_brc_context *kernel_context)
+{
+    struct i965_gpe_context *gpe_context = NULL;
+    struct encoder_kernel_parameter kernel_param ;
+    struct encoder_scoreboard_parameter scoreboard_param;
+    struct i965_kernel common_kernel;
+    int i = 0;
+
+    static const int brc_curbe_size[NUM_GEN9_AVC_KERNEL_BRC] = {
+        (sizeof(gen9_avc_brc_init_reset_curbe_data)),
+        (sizeof(gen9_avc_frame_brc_update_curbe_data)),
+        (sizeof(gen9_avc_brc_init_reset_curbe_data)),
+        (sizeof(gen9_avc_mbenc_curbe_data)),
+        0,
+        (sizeof(gen9_avc_mb_brc_curbe_data))
+    };
+
+    kernel_param.inline_data_size = 0;
+    kernel_param.sampler_size = 0;
+
+    memset(&scoreboard_param, 0, sizeof(scoreboard_param));
+    scoreboard_param.mask = 0xFF;
+    scoreboard_param.enable = generic_context->use_hw_scoreboard;
+    scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
+    scoreboard_param.walkpat_flag = 0;
+
+    for (i = 0; i < NUM_GEN9_AVC_KERNEL_BRC; i++) {
+        kernel_param.curbe_size = brc_curbe_size[i];
+        gpe_context = &kernel_context->gpe_contexts[i];
+        gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
+        gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
+
+        memset(&common_kernel, 0, sizeof(common_kernel));
+
+        intel_avc_get_kernel_header_and_size((void *)media_avc_kernels,
+                                             sizeof(media_avc_kernels),
+                                             INTEL_GENERIC_ENC_BRC,
+                                             i,
+                                             &common_kernel);
+
+        gen8_gpe_load_kernels(ctx,
+                              gpe_context,
+                              &common_kernel,
+                              1);
+    }
+
+}
+
+static void
+gen9_avc_kernel_init_wp(VADriverContextP ctx,
+                        struct generic_encoder_context *generic_context,
+                        struct gen9_avc_wp_context *kernel_context)
+{
+    struct i965_gpe_context *gpe_context = NULL;
+    struct encoder_kernel_parameter kernel_param ;
+    struct encoder_scoreboard_parameter scoreboard_param;
+    struct i965_kernel common_kernel;
+
+    kernel_param.curbe_size = sizeof(gen9_avc_wp_curbe_data);
+    kernel_param.inline_data_size = 0;
+    kernel_param.sampler_size = 0;
+
+    memset(&scoreboard_param, 0, sizeof(scoreboard_param));
+    scoreboard_param.mask = 0xFF;
+    scoreboard_param.enable = generic_context->use_hw_scoreboard;
+    scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
+    scoreboard_param.walkpat_flag = 0;
+
+    gpe_context = &kernel_context->gpe_contexts;
+    gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
+    gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
+
+    memset(&common_kernel, 0, sizeof(common_kernel));
+
+    intel_avc_get_kernel_header_and_size((void *)media_avc_kernels,
+                                         sizeof(media_avc_kernels),
+                                         INTEL_GENERIC_ENC_WP,
+                                         0,
+                                         &common_kernel);
+
+    gen8_gpe_load_kernels(ctx,
+                          gpe_context,
+                          &common_kernel,
+                          1);
+
+}
+
+static void
+gen9_avc_kernel_init_sfd(VADriverContextP ctx,
+                         struct generic_encoder_context *generic_context,
+                         struct gen9_avc_sfd_context *kernel_context)
+{
+    struct i965_gpe_context *gpe_context = NULL;
+    struct encoder_kernel_parameter kernel_param ;
+    struct encoder_scoreboard_parameter scoreboard_param;
+    struct i965_kernel common_kernel;
+
+    kernel_param.curbe_size = sizeof(gen9_avc_sfd_curbe_data);
+    kernel_param.inline_data_size = 0;
+    kernel_param.sampler_size = 0;
+
+    memset(&scoreboard_param, 0, sizeof(scoreboard_param));
+    scoreboard_param.mask = 0xFF;
+    scoreboard_param.enable = generic_context->use_hw_scoreboard;
+    scoreboard_param.type = generic_context->use_hw_non_stalling_scoreboard;
+    scoreboard_param.walkpat_flag = 0;
+
+    gpe_context = &kernel_context->gpe_contexts;
+    gen9_init_gpe_context_avc(ctx, gpe_context, &kernel_param);
+    gen9_init_vfe_scoreboard_avc(gpe_context, &scoreboard_param);
+
+    memset(&common_kernel, 0, sizeof(common_kernel));
+
+    intel_avc_get_kernel_header_and_size((void *)media_avc_kernels,
+                                         sizeof(media_avc_kernels),
+                                         INTEL_GENERIC_ENC_SFD,
+                                         0,
+                                         &common_kernel);
+
+    gen8_gpe_load_kernels(ctx,
+                          gpe_context,
+                          &common_kernel,
+                          1);
+
+}
+
+static void
+gen9_avc_kernel_destroy(struct encoder_vme_mfc_context * vme_context)
+{
+
+    struct gen9_avc_encoder_context * avc_ctx = (struct gen9_avc_encoder_context * )vme_context->private_enc_ctx;
+
+    int i = 0;
+
+    gen9_avc_free_resources(vme_context);
+
+    for(i = 0; i < NUM_GEN9_AVC_KERNEL_SCALING; i++)
+        gen8_gpe_context_destroy(&avc_ctx->context_scaling.gpe_contexts[i]);
+
+    for(i = 0; i < NUM_GEN9_AVC_KERNEL_BRC; i++)
+        gen8_gpe_context_destroy(&avc_ctx->context_brc.gpe_contexts[i]);
+
+    for(i = 0; i < NUM_GEN9_AVC_KERNEL_ME; i++)
+        gen8_gpe_context_destroy(&avc_ctx->context_me.gpe_contexts[i]);
+
+    for(i = 0; i < NUM_GEN9_AVC_KERNEL_MBENC; i++)
+        gen8_gpe_context_destroy(&avc_ctx->context_mbenc.gpe_contexts[i]);
+
+    gen8_gpe_context_destroy(&avc_ctx->context_wp.gpe_contexts);
+
+    gen8_gpe_context_destroy(&avc_ctx->context_sfd.gpe_contexts);
+
+}
-- 
2.11.0



More information about the Libva mailing list