[Libva] [PATCH libva-intel-driver 03/18] Encoding: Setup one cost_table surface state for VME shader

Zhao, Yakui yakui.zhao at intel.com
Mon Jan 12 05:01:26 PST 2015


From: Zhao Yakui <yakui.zhao at intel.com>

Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
---
 src/gen6_mfc_common.c |   37 +++++++++++++++++++++++++++++++++++++
 src/gen6_vme.h        |    9 +++++++++
 src/gen75_vme.c       |   20 ++++++++++++++++++++
 src/gen7_vme.c        |   16 ++++++++++++++++
 src/gen8_vme.c        |   20 ++++++++++++++++++++
 5 files changed, 102 insertions(+)

diff --git a/src/gen6_mfc_common.c b/src/gen6_mfc_common.c
index 4e8f1ad..a44d328 100644
--- a/src/gen6_mfc_common.c
+++ b/src/gen6_mfc_common.c
@@ -1715,3 +1715,40 @@ intel_h264_initialize_mbmv_cost(VADriverContextP ctx,
     vme_context->cost_table_size = QP_MAX * 32;
     return;
 }
+
+extern void
+intel_h264_setup_cost_surface(VADriverContextP ctx,
+                              struct encode_state *encode_state,
+                              struct intel_encoder_context *encoder_context,
+                              unsigned long binding_table_offset,
+                              unsigned long surface_state_offset)
+{
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
+    struct gen6_vme_context *vme_context = encoder_context->vme_context;
+    VAEncSliceParameterBufferH264 *slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer;
+    int qp;
+    dri_bo *bo;
+    struct i965_buffer_surface cost_table;
+
+    int slice_type = intel_avc_enc_slice_type_fixup(slice_param->slice_type);
+
+
+    if (slice_type == SLICE_TYPE_I) {
+        bo = vme_context->i_qp_cost_table;
+    } else if (slice_type == SLICE_TYPE_P) {
+        bo = vme_context->p_qp_cost_table;
+    } else {
+        bo = vme_context->b_qp_cost_table;
+    }
+
+    cost_table.bo = bo;
+    cost_table.num_blocks = QP_MAX;
+    cost_table.pitch = 16;
+    cost_table.size_block = 32;
+
+    vme_context->vme_buffer_suface_setup(ctx,
+                                         &vme_context->gpe_context,
+                                         &cost_table,
+                                         binding_table_offset,
+                                         surface_state_offset);
+}
diff --git a/src/gen6_vme.h b/src/gen6_vme.h
index aef9ba6..374c738 100644
--- a/src/gen6_vme.h
+++ b/src/gen6_vme.h
@@ -46,6 +46,8 @@
 
 #define GEN6_VME_KERNEL_NUMBER          3
 
+#define INTEL_COST_TABLE_OFFSET         8
+
 struct encode_state;
 struct intel_encoder_context;
 
@@ -187,4 +189,11 @@ extern void
 intel_h264_initialize_mbmv_cost(VADriverContextP ctx,
                                 struct encode_state *encode_state,
                                 struct intel_encoder_context *encoder_context);
+
+extern void
+intel_h264_setup_cost_surface(VADriverContextP ctx,
+                              struct encode_state *encode_state,
+                              struct intel_encoder_context *encoder_context,
+                              unsigned long binding_table_offset,
+                              unsigned long surface_state_offset);
 #endif /* _GEN6_VME_H_ */
diff --git a/src/gen75_vme.c b/src/gen75_vme.c
index 576e91a..fdde298 100644
--- a/src/gen75_vme.c
+++ b/src/gen75_vme.c
@@ -281,6 +281,10 @@ gen75_vme_surface_setup(VADriverContextP ctx,
     gen75_vme_output_buffer_setup(ctx, encode_state, 3, encoder_context);
     gen75_vme_output_vme_batchbuffer_setup(ctx, encode_state, 5, encoder_context);
 
+    intel_h264_setup_cost_surface(ctx, encode_state, encoder_context,
+                                  BINDING_TABLE_OFFSET(INTEL_COST_TABLE_OFFSET),
+                                  SURFACE_STATE_OFFSET(INTEL_COST_TABLE_OFFSET));
+
     return VA_STATUS_SUCCESS;
 }
 
@@ -647,6 +651,7 @@ static VAStatus gen75_vme_prepare(VADriverContextP ctx,
     }	
 
     intel_vme_update_mbmv_cost(ctx, encode_state, encoder_context);
+    intel_h264_initialize_mbmv_cost(ctx, encode_state, encoder_context);
     	
     /*Setup all the memory object*/
     gen75_vme_surface_setup(ctx, encode_state, is_intra, encoder_context);
@@ -1007,6 +1012,21 @@ gen75_vme_context_destroy(void *context)
 	vme_context->vme_state_message = NULL;
     }
 
+    if (vme_context->i_qp_cost_table) {
+       dri_bo_unreference(vme_context->i_qp_cost_table);
+       vme_context->i_qp_cost_table = NULL;
+    }
+
+    if (vme_context->p_qp_cost_table) {
+       dri_bo_unreference(vme_context->p_qp_cost_table);
+       vme_context->p_qp_cost_table = NULL;
+    }
+
+    if (vme_context->b_qp_cost_table) {
+       dri_bo_unreference(vme_context->b_qp_cost_table);
+       vme_context->b_qp_cost_table = NULL;
+    }
+
     free(vme_context);
 }
 
diff --git a/src/gen7_vme.c b/src/gen7_vme.c
index dc15445..e66acb1 100644
--- a/src/gen7_vme.c
+++ b/src/gen7_vme.c
@@ -671,6 +671,7 @@ static VAStatus gen7_vme_prepare(VADriverContextP ctx,
     }
 	
     intel_vme_update_mbmv_cost(ctx, encode_state, encoder_context);
+    intel_h264_initialize_mbmv_cost(ctx, encode_state, encoder_context);
     /*Setup all the memory object*/
     gen7_vme_surface_setup(ctx, encode_state, is_intra, encoder_context);
     gen7_vme_interface_setup(ctx, encode_state, encoder_context);
@@ -1023,6 +1024,21 @@ gen7_vme_context_destroy(void *context)
 	vme_context->vme_state_message = NULL;
     }
 
+    if (vme_context->i_qp_cost_table) {
+       dri_bo_unreference(vme_context->i_qp_cost_table);
+       vme_context->i_qp_cost_table = NULL;
+    }
+
+    if (vme_context->p_qp_cost_table) {
+       dri_bo_unreference(vme_context->p_qp_cost_table);
+       vme_context->p_qp_cost_table = NULL;
+    }
+
+    if (vme_context->b_qp_cost_table) {
+       dri_bo_unreference(vme_context->b_qp_cost_table);
+       vme_context->b_qp_cost_table = NULL;
+    }
+
     free(vme_context);
 }
 
diff --git a/src/gen8_vme.c b/src/gen8_vme.c
index 29d4b5a..114137e 100644
--- a/src/gen8_vme.c
+++ b/src/gen8_vme.c
@@ -267,6 +267,10 @@ gen8_vme_surface_setup(VADriverContextP ctx,
     gen8_vme_output_buffer_setup(ctx, encode_state, 3, encoder_context);
     gen8_vme_output_vme_batchbuffer_setup(ctx, encode_state, 5, encoder_context);
 
+    intel_h264_setup_cost_surface(ctx, encode_state, encoder_context,
+                                  BINDING_TABLE_OFFSET(INTEL_COST_TABLE_OFFSET),
+                                  SURFACE_STATE_OFFSET(INTEL_COST_TABLE_OFFSET));
+
     return VA_STATUS_SUCCESS;
 }
 
@@ -673,6 +677,7 @@ static VAStatus gen8_vme_prepare(VADriverContextP ctx,
     }	
 
     intel_vme_update_mbmv_cost(ctx, encode_state, encoder_context);
+    intel_h264_initialize_mbmv_cost(ctx, encode_state, encoder_context);
     	
     /*Setup all the memory object*/
     gen8_vme_surface_setup(ctx, encode_state, is_intra, encoder_context);
@@ -1150,6 +1155,21 @@ gen8_vme_context_destroy(void *context)
 	vme_context->vme_state_message = NULL;
     }
 
+    if (vme_context->i_qp_cost_table) {
+       dri_bo_unreference(vme_context->i_qp_cost_table);
+       vme_context->i_qp_cost_table = NULL;
+    }
+
+    if (vme_context->p_qp_cost_table) {
+       dri_bo_unreference(vme_context->p_qp_cost_table);
+       vme_context->p_qp_cost_table = NULL;
+    }
+
+    if (vme_context->b_qp_cost_table) {
+       dri_bo_unreference(vme_context->b_qp_cost_table);
+       vme_context->b_qp_cost_table = NULL;
+    }
+
     free(vme_context);
 }
 
-- 
1.7.10.1



More information about the Libva mailing list