Encoding: modify function to fill command into a specified batch buffer
authorXiang, Haihao <haihao.xiang@intel.com>
Thu, 1 Nov 2012 01:39:29 +0000 (09:39 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Thu, 1 Nov 2012 01:39:29 +0000 (09:39 +0800)
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
src/gen6_mfc.c
src/gen6_vme.c
src/gen75_mfc.c
src/gen75_vme.c

index 12d0343..7567517 100644 (file)
 #include "i965_encoder.h"
 
 static void
-gen6_mfc_pipe_mode_select(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen6_mfc_pipe_mode_select(VADriverContextP ctx,
+                          struct gen6_encoder_context *gen6_encoder_context,
+                          struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     BEGIN_BCS_BATCH(batch, 4);
 
@@ -73,9 +76,11 @@ gen6_mfc_pipe_mode_select(VADriverContextP ctx, struct gen6_encoder_context *gen
 static void
 gen7_mfc_pipe_mode_select(VADriverContextP ctx,
                           int standard_select,
-                          struct gen6_encoder_context *gen6_encoder_context)
+                          struct gen6_encoder_context *gen6_encoder_context,
+                          struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     assert(standard_select == MFX_FORMAT_MPEG2 ||
            standard_select == MFX_FORMAT_AVC);
@@ -107,11 +112,15 @@ gen7_mfc_pipe_mode_select(VADriverContextP ctx,
 }
 
 static void
-gen6_mfc_surface_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen6_mfc_surface_state(VADriverContextP ctx,
+                       struct gen6_encoder_context *gen6_encoder_context,
+                       struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 6);
 
     OUT_BCS_BATCH(batch, MFX_SURFACE_STATE | (6 - 2));
@@ -135,11 +144,15 @@ gen6_mfc_surface_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_e
 }
 
 static void
-gen7_mfc_surface_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen7_mfc_surface_state(VADriverContextP ctx,
+                       struct gen6_encoder_context *gen6_encoder_context,
+                       struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 6);
 
     OUT_BCS_BATCH(batch, MFX_SURFACE_STATE | (6 - 2));
@@ -163,12 +176,16 @@ gen7_mfc_surface_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_e
 }
 
 static void
-gen6_mfc_pipe_buf_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen6_mfc_pipe_buf_addr_state(VADriverContextP ctx,
+                             struct gen6_encoder_context *gen6_encoder_context,
+                             struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
     int i;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 24);
 
     OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (24 - 2));
@@ -206,11 +223,15 @@ gen6_mfc_pipe_buf_addr_state(VADriverContextP ctx, struct gen6_encoder_context *
 }
 
 static void
-gen6_mfc_ind_obj_base_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen6_mfc_ind_obj_base_addr_state(VADriverContextP ctx,
+                                 struct gen6_encoder_context *gen6_encoder_context,
+                                 struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 11);
 
     OUT_BCS_BATCH(batch, MFX_IND_OBJ_BASE_ADDR_STATE | (11 - 2));
@@ -231,11 +252,15 @@ gen6_mfc_ind_obj_base_addr_state(VADriverContextP ctx, struct gen6_encoder_conte
 }
 
 static void
-gen7_mfc_ind_obj_base_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen7_mfc_ind_obj_base_addr_state(VADriverContextP ctx,
+                                 struct gen6_encoder_context *gen6_encoder_context,
+                                 struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 11);
 
     OUT_BCS_BATCH(batch, MFX_IND_OBJ_BASE_ADDR_STATE | (11 - 2));
@@ -256,11 +281,15 @@ gen7_mfc_ind_obj_base_addr_state(VADriverContextP ctx, struct gen6_encoder_conte
 }
 
 static void
-gen6_mfc_bsp_buf_base_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen6_mfc_bsp_buf_base_addr_state(VADriverContextP ctx,
+                                 struct gen6_encoder_context *gen6_encoder_context,
+                                 struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 4);
 
     OUT_BCS_BATCH(batch, MFX_BSP_BUF_BASE_ADDR_STATE | (4 - 2));
@@ -274,14 +303,17 @@ gen6_mfc_bsp_buf_base_addr_state(VADriverContextP ctx, struct gen6_encoder_conte
 }
 
 static void
-gen6_mfc_avc_img_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen6_mfc_avc_img_state(VADriverContextP ctx,
+                       struct gen6_encoder_context *gen6_encoder_context,
+                       struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
-
     int width_in_mbs = (mfc_context->surface_state.width + 15) / 16;
     int height_in_mbs = (mfc_context->surface_state.height + 15) / 16;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 13);
     OUT_BCS_BATCH(batch, MFX_AVC_IMG_STATE | (13 - 2));
     OUT_BCS_BATCH(batch, 
@@ -328,14 +360,17 @@ gen6_mfc_avc_img_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_e
 }
 
 static void
-gen7_mfc_avc_img_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen7_mfc_avc_img_state(VADriverContextP ctx,
+                       struct gen6_encoder_context *gen6_encoder_context,
+                       struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
-
     int width_in_mbs = (mfc_context->surface_state.width + 15) / 16;
     int height_in_mbs = (mfc_context->surface_state.height + 15) / 16;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 16);
     OUT_BCS_BATCH(batch, MFX_AVC_IMG_STATE | (16 - 2));
     OUT_BCS_BATCH(batch,
@@ -385,11 +420,15 @@ gen7_mfc_avc_img_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_e
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void gen6_mfc_avc_directmode_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_mfc_avc_directmode_state(VADriverContextP ctx,
+                                          struct gen6_encoder_context *gen6_encoder_context,
+                                          struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int i;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 69);
 
     OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (69 - 2));
@@ -423,11 +462,14 @@ static void gen6_mfc_avc_directmode_state(VADriverContextP ctx, struct gen6_enco
 
 static void gen6_mfc_avc_slice_state(VADriverContextP ctx,
                                      int intra_slice,
-                                     struct gen6_encoder_context *gen6_encoder_context)
+                                     struct gen6_encoder_context *gen6_encoder_context,
+                                     struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 11);;
 
     OUT_BCS_BATCH(batch, MFX_AVC_SLICE_STATE | (11 - 2) );
@@ -470,11 +512,15 @@ static void gen6_mfc_avc_slice_state(VADriverContextP ctx,
 
     ADVANCE_BCS_BATCH(batch);
 }
-static void gen6_mfc_avc_qm_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_mfc_avc_qm_state(VADriverContextP ctx,
+                                  struct gen6_encoder_context *gen6_encoder_context,
+                                  struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int i;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 58);
 
     OUT_BCS_BATCH(batch, MFX_AVC_QM_STATE | 56);
@@ -486,11 +532,15 @@ static void gen6_mfc_avc_qm_state(VADriverContextP ctx, struct gen6_encoder_cont
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void gen6_mfc_avc_fqm_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_mfc_avc_fqm_state(VADriverContextP ctx,
+                                   struct gen6_encoder_context *gen6_encoder_context,
+                                   struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int i;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 113);
     OUT_BCS_BATCH(batch, MFC_AVC_FQM_STATE | (113 - 2));
 
@@ -506,11 +556,14 @@ gen7_mfc_qm_state(VADriverContextP ctx,
                   int qm_type,
                   unsigned int *qm,
                   int qm_length,
-                  struct gen6_encoder_context *gen6_encoder_context)
+                  struct gen6_encoder_context *gen6_encoder_context,
+                  struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     unsigned int qm_buffer[16];
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     assert(qm_length <= 16);
     assert(sizeof(*qm) == 4);
     memcpy(qm_buffer, qm, qm_length * 4);
@@ -522,7 +575,9 @@ gen7_mfc_qm_state(VADriverContextP ctx,
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void gen7_mfc_avc_qm_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen7_mfc_avc_qm_state(VADriverContextP ctx,
+                                  struct gen6_encoder_context *gen6_encoder_context,
+                                  struct intel_batchbuffer *batch)
 {
     unsigned int qm[16] = {
         0x10101010, 0x10101010, 0x10101010, 0x10101010,
@@ -531,10 +586,10 @@ static void gen7_mfc_avc_qm_state(VADriverContextP ctx, struct gen6_encoder_cont
         0x10101010, 0x10101010, 0x10101010, 0x10101010
     };
 
-    gen7_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 12, gen6_encoder_context);
-    gen7_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 12, gen6_encoder_context);
-    gen7_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 16, gen6_encoder_context);
-    gen7_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 16, gen6_encoder_context);
+    gen7_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 12, gen6_encoder_context, batch);
+    gen7_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 12, gen6_encoder_context, batch);
+    gen7_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 16, gen6_encoder_context, batch);
+    gen7_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 16, gen6_encoder_context, batch);
 }
 
 static void
@@ -542,11 +597,14 @@ gen7_mfc_fqm_state(VADriverContextP ctx,
                    int fqm_type,
                    unsigned int *fqm,
                    int fqm_length,
-                   struct gen6_encoder_context *gen6_encoder_context)
+                   struct gen6_encoder_context *gen6_encoder_context,
+                   struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     unsigned int fqm_buffer[32];
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     assert(fqm_length <= 32);
     assert(sizeof(*fqm) == 4);
     memcpy(fqm_buffer, fqm, fqm_length * 4);
@@ -558,7 +616,9 @@ gen7_mfc_fqm_state(VADriverContextP ctx,
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void gen7_mfc_avc_fqm_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen7_mfc_avc_fqm_state(VADriverContextP ctx,
+                                   struct gen6_encoder_context *gen6_encoder_context,
+                                   struct intel_batchbuffer *batch)
 {
     unsigned int qm[32] = {
         0x10001000, 0x10001000, 0x10001000, 0x10001000,
@@ -571,17 +631,21 @@ static void gen7_mfc_avc_fqm_state(VADriverContextP ctx, struct gen6_encoder_con
         0x10001000, 0x10001000, 0x10001000, 0x10001000
     };
 
-    gen7_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 24, gen6_encoder_context);
-    gen7_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 24, gen6_encoder_context);
-    gen7_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 32, gen6_encoder_context);
-    gen7_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 32, gen6_encoder_context);
+    gen7_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 24, gen6_encoder_context, batch);
+    gen7_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 24, gen6_encoder_context, batch);
+    gen7_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 32, gen6_encoder_context, batch);
+    gen7_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 32, gen6_encoder_context, batch);
 }
 
-static void gen6_mfc_avc_ref_idx_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_mfc_avc_ref_idx_state(VADriverContextP ctx,
+                                       struct gen6_encoder_context *gen6_encoder_context,
+                                       struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int i;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 10);
 
     OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | 8);
@@ -596,9 +660,12 @@ static void gen6_mfc_avc_ref_idx_state(VADriverContextP ctx, struct gen6_encoder
 }
        
 static void
-gen6_mfc_avc_insert_object(VADriverContextP ctx, int flush_data, struct gen6_encoder_context *gen6_encoder_context)
+gen6_mfc_avc_insert_object(VADriverContextP ctx, int flush_data, 
+                           struct gen6_encoder_context *gen6_encoder_context,
+                           struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     BEGIN_BCS_BATCH(batch, 4);
 
@@ -616,11 +683,14 @@ gen6_mfc_avc_insert_object(VADriverContextP ctx, int flush_data, struct gen6_enc
 
 static int
 gen6_mfc_avc_pak_object_intra(VADriverContextP ctx, int x, int y, int end_mb, int qp,unsigned int *msg,
-                              struct gen6_encoder_context *gen6_encoder_context)
+                              struct gen6_encoder_context *gen6_encoder_context,
+                              struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int len_in_dwords = 11;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, len_in_dwords);
 
     OUT_BCS_BATCH(batch, MFC_AVC_PAK_OBJECT | (len_in_dwords - 2));
@@ -651,11 +721,13 @@ gen6_mfc_avc_pak_object_intra(VADriverContextP ctx, int x, int y, int end_mb, in
 }
 
 static int gen6_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, int qp, unsigned int offset,
-                                         struct gen6_encoder_context *gen6_encoder_context)
+                                         struct gen6_encoder_context *gen6_encoder_context, struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int len_in_dwords = 11;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, len_in_dwords);
 
     OUT_BCS_BATCH(batch, MFC_AVC_PAK_OBJECT | (len_in_dwords - 2));
@@ -790,39 +862,39 @@ void gen6_mfc_avc_pipeline_programing(VADriverContextP ctx,
                 intel_batchbuffer_emit_mi_flush(batch);
                 
                 if (IS_GEN7(i965->intel.device_id)) {
-                    gen7_mfc_pipe_mode_select(ctx, MFX_FORMAT_AVC, gen6_encoder_context);
-                    gen7_mfc_surface_state(ctx, gen6_encoder_context);
-                    gen7_mfc_ind_obj_base_addr_state(ctx, gen6_encoder_context);
+                    gen7_mfc_pipe_mode_select(ctx, MFX_FORMAT_AVC, gen6_encoder_context, batch);
+                    gen7_mfc_surface_state(ctx, gen6_encoder_context, batch);
+                    gen7_mfc_ind_obj_base_addr_state(ctx, gen6_encoder_context, batch);
                 } else {
-                    gen6_mfc_pipe_mode_select(ctx, gen6_encoder_context);
-                    gen6_mfc_surface_state(ctx, gen6_encoder_context);
-                    gen6_mfc_ind_obj_base_addr_state(ctx, gen6_encoder_context);
+                    gen6_mfc_pipe_mode_select(ctx, gen6_encoder_context, batch);
+                    gen6_mfc_surface_state(ctx, gen6_encoder_context, batch);
+                    gen6_mfc_ind_obj_base_addr_state(ctx, gen6_encoder_context, batch);
                 }
 
-                gen6_mfc_pipe_buf_addr_state(ctx, gen6_encoder_context);
-                gen6_mfc_bsp_buf_base_addr_state(ctx, gen6_encoder_context);
+                gen6_mfc_pipe_buf_addr_state(ctx, gen6_encoder_context, batch);
+                gen6_mfc_bsp_buf_base_addr_state(ctx, gen6_encoder_context, batch);
 
                 if (IS_GEN7(i965->intel.device_id)) {
-                    gen7_mfc_avc_img_state(ctx, gen6_encoder_context);
-                    gen7_mfc_avc_qm_state(ctx, gen6_encoder_context);
-                    gen7_mfc_avc_fqm_state(ctx, gen6_encoder_context);
+                    gen7_mfc_avc_img_state(ctx, gen6_encoder_context, batch);
+                    gen7_mfc_avc_qm_state(ctx, gen6_encoder_context, batch);
+                    gen7_mfc_avc_fqm_state(ctx, gen6_encoder_context, batch);
                 } else {
-                    gen6_mfc_avc_img_state(ctx, gen6_encoder_context);
-                    gen6_mfc_avc_qm_state(ctx, gen6_encoder_context);
-                    gen6_mfc_avc_fqm_state(ctx, gen6_encoder_context);
+                    gen6_mfc_avc_img_state(ctx, gen6_encoder_context, batch);
+                    gen6_mfc_avc_qm_state(ctx, gen6_encoder_context, batch);
+                    gen6_mfc_avc_fqm_state(ctx, gen6_encoder_context, batch);
                 }
 
-                gen6_mfc_avc_ref_idx_state(ctx, gen6_encoder_context);
-                gen6_mfc_avc_slice_state(ctx, is_intra, gen6_encoder_context);
+                gen6_mfc_avc_ref_idx_state(ctx, gen6_encoder_context, batch);
+                gen6_mfc_avc_slice_state(ctx, is_intra, gen6_encoder_context, batch);
                 emit_new_state = 0;
             }
 
             if (is_intra) {
                 assert(msg);
-                object_len_in_bytes = gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, gen6_encoder_context);
+                object_len_in_bytes = gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, gen6_encoder_context, batch);
                 msg += 4;
             } else {
-                object_len_in_bytes = gen6_mfc_avc_pak_object_inter(ctx, x, y, last_mb, qp, offset, gen6_encoder_context);
+                object_len_in_bytes = gen6_mfc_avc_pak_object_inter(ctx, x, y, last_mb, qp, offset, gen6_encoder_context, batch);
                 offset += 64;
             }
 
index 2ffbd43..1b495ff 100644 (file)
@@ -672,19 +672,26 @@ static VAStatus gen6_vme_vme_state_setup(VADriverContextP ctx,
     return VA_STATUS_SUCCESS;
 }
 
-static void gen6_vme_pipeline_select(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_vme_pipeline_select(VADriverContextP ctx,
+                                     struct gen6_encoder_context *gen6_encoder_context,
+                                     struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     BEGIN_BATCH(batch, 1);
     OUT_BATCH(batch, CMD_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
     ADVANCE_BATCH(batch);
 }
 
-static void gen6_vme_state_base_address(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_vme_state_base_address(VADriverContextP ctx,
+                                        struct gen6_encoder_context *gen6_encoder_context,
+                                        struct intel_batchbuffer *batch)
 {
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     BEGIN_BATCH(batch, 10);
 
@@ -709,11 +716,15 @@ static void gen6_vme_state_base_address(VADriverContextP ctx, struct gen6_encode
     ADVANCE_BATCH(batch);
 }
 
-static void gen6_vme_vfe_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_vme_vfe_state(VADriverContextP ctx,
+                               struct gen6_encoder_context *gen6_encoder_context,
+                               struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BATCH(batch, 8);
 
     OUT_BATCH(batch, CMD_MEDIA_VFE_STATE | 6);                                 /*Gen6 CMD_MEDIA_STATE_POINTERS = CMD_MEDIA_STATE */
@@ -732,11 +743,15 @@ static void gen6_vme_vfe_state(VADriverContextP ctx, struct gen6_encoder_context
 
 }
 
-static void gen6_vme_curbe_load(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_vme_curbe_load(VADriverContextP ctx,
+                                struct gen6_encoder_context *gen6_encoder_context,
+                                struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BATCH(batch, 4);
 
     OUT_BATCH(batch, CMD_MEDIA_CURBE_LOAD | 2);
@@ -748,11 +763,15 @@ static void gen6_vme_curbe_load(VADriverContextP ctx, struct gen6_encoder_contex
     ADVANCE_BATCH(batch);
 }
 
-static void gen6_vme_idrt(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen6_vme_idrt(VADriverContextP ctx,
+                          struct gen6_encoder_context *gen6_encoder_context,
+                          struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BATCH(batch, 4);
 
     OUT_BATCH(batch, CMD_MEDIA_INTERFACE_LOAD | 2);    
@@ -767,14 +786,17 @@ static int gen6_vme_media_object(VADriverContextP ctx,
                                  struct encode_state *encode_state,
                                  int mb_x, int mb_y,
                                  int kernel,
-                                 struct gen6_encoder_context *gen6_encoder_context)
+                                 struct gen6_encoder_context *gen6_encoder_context,
+                                 struct intel_batchbuffer *batch)
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct object_surface *obj_surface = SURFACE(encode_state->current_render_target);
     int mb_width = ALIGN(obj_surface->orig_width, 16) / 16;
     int len_in_dowrds = 6 + 1;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BATCH(batch, len_in_dowrds);
     
     OUT_BATCH(batch, CMD_MEDIA_OBJECT | (len_in_dowrds - 2));
@@ -863,19 +885,19 @@ static void gen6_vme_pipeline_programing(VADriverContextP ctx,
                 intel_batchbuffer_emit_mi_flush(batch);
 
                 /*Step2: State command PIPELINE_SELECT*/
-                gen6_vme_pipeline_select(ctx, gen6_encoder_context);
+                gen6_vme_pipeline_select(ctx, gen6_encoder_context, batch);
 
                 /*Step3: State commands configuring pipeline states*/
-                gen6_vme_state_base_address(ctx, gen6_encoder_context);
-                gen6_vme_vfe_state(ctx, gen6_encoder_context);
-                gen6_vme_curbe_load(ctx, gen6_encoder_context);
-                gen6_vme_idrt(ctx, gen6_encoder_context);
+                gen6_vme_state_base_address(ctx, gen6_encoder_context, batch);
+                gen6_vme_vfe_state(ctx, gen6_encoder_context, batch);
+                gen6_vme_curbe_load(ctx, gen6_encoder_context, batch);
+                gen6_vme_idrt(ctx, gen6_encoder_context, batch);
 
                 emit_new_state = 0;
             }
 
             /*Step4: Primitive commands*/
-            object_len_in_bytes = gen6_vme_media_object(ctx, encode_state, x, y, is_intra ? VME_INTRA_SHADER : VME_INTER_SHADER, gen6_encoder_context);
+            object_len_in_bytes = gen6_vme_media_object(ctx, encode_state, x, y, is_intra ? VME_INTRA_SHADER : VME_INTER_SHADER, gen6_encoder_context, batch);
 
             if (intel_batchbuffer_check_free_space(batch, object_len_in_bytes) == 0) {
                 assert(0);
index fddacfe..31fe579 100644 (file)
 
 static void
 gen75_mfc_pipe_mode_select(VADriverContextP ctx,
-                          int standard_select,
-                          struct gen6_encoder_context *gen6_encoder_context)
+                           int standard_select,
+                           struct gen6_encoder_context *gen6_encoder_context,
+                           struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     assert(standard_select == MFX_FORMAT_MPEG2 ||
            standard_select == MFX_FORMAT_AVC);
@@ -87,11 +89,15 @@ gen75_mfc_pipe_mode_select(VADriverContextP ctx,
 
 
 static void
-gen75_mfc_surface_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen75_mfc_surface_state(VADriverContextP ctx,
+                        struct gen6_encoder_context *gen6_encoder_context,
+                        struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 6);
 
     OUT_BCS_BATCH(batch, MFX_SURFACE_STATE | (6 - 2));
@@ -116,12 +122,15 @@ gen75_mfc_surface_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_
 
 static void
 gen75_mfc_pipe_buf_addr_state_bplus(VADriverContextP ctx,
-               struct gen6_encoder_context *gen6_encoder_context)
+                                    struct gen6_encoder_context *gen6_encoder_context,
+                                    struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
     int i;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 61);
 
     OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (61 - 2));
@@ -202,16 +211,19 @@ gen75_mfc_pipe_buf_addr_state_bplus(VADriverContextP ctx,
 }
 
 static void
-gen75_mfc_pipe_buf_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen75_mfc_pipe_buf_addr_state(VADriverContextP ctx,
+                              struct gen6_encoder_context *gen6_encoder_context,
+                              struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
     int i;
-
     struct i965_driver_data *i965 = i965_driver_data(ctx);
  
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     if (IS_STEPPING_BPLUS(i965)) {
-       gen75_mfc_pipe_buf_addr_state_bplus(ctx, gen6_encoder_context);
+       gen75_mfc_pipe_buf_addr_state_bplus(ctx, gen6_encoder_context, batch);
        return;
     }
 
@@ -256,12 +268,15 @@ gen75_mfc_pipe_buf_addr_state(VADriverContextP ctx, struct gen6_encoder_context
 
 static void
 gen75_mfc_ind_obj_base_addr_state_bplus(VADriverContextP ctx,
-               struct gen6_encoder_context *gen6_encoder_context)
+                                        struct gen6_encoder_context *gen6_encoder_context,
+                                        struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 26);
 
     OUT_BCS_BATCH(batch, MFX_IND_OBJ_BASE_ADDR_STATE | (26 - 2));
@@ -309,15 +324,19 @@ gen75_mfc_ind_obj_base_addr_state_bplus(VADriverContextP ctx,
 }
 
 static void
-gen75_mfc_ind_obj_base_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen75_mfc_ind_obj_base_addr_state(VADriverContextP ctx,
+                                  struct gen6_encoder_context *gen6_encoder_context,
+                                  struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
     struct i965_driver_data *i965 = i965_driver_data(ctx);
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     if (IS_STEPPING_BPLUS(i965)) {
-       gen75_mfc_ind_obj_base_addr_state_bplus(ctx, gen6_encoder_context);
+       gen75_mfc_ind_obj_base_addr_state_bplus(ctx, gen6_encoder_context, batch);
        return;
     }
 
@@ -345,11 +364,14 @@ gen75_mfc_ind_obj_base_addr_state(VADriverContextP ctx, struct gen6_encoder_cont
 
 static void
 gen75_mfc_bsp_buf_base_addr_state_bplus(VADriverContextP ctx,
-               struct gen6_encoder_context *gen6_encoder_context)
+                                        struct gen6_encoder_context *gen6_encoder_context,
+                                        struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 10);
 
     OUT_BCS_BATCH(batch, MFX_BSP_BUF_BASE_ADDR_STATE | (10 - 2));
@@ -373,14 +395,18 @@ gen75_mfc_bsp_buf_base_addr_state_bplus(VADriverContextP ctx,
 }
 
 static void
-gen75_mfc_bsp_buf_base_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen75_mfc_bsp_buf_base_addr_state(VADriverContextP ctx,
+                                  struct gen6_encoder_context *gen6_encoder_context,
+                                  struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
     struct i965_driver_data *i965 = i965_driver_data(ctx);
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     if (IS_STEPPING_BPLUS(i965)) {
-       gen75_mfc_bsp_buf_base_addr_state_bplus(ctx, gen6_encoder_context);
+       gen75_mfc_bsp_buf_base_addr_state_bplus(ctx, gen6_encoder_context, batch);
        return;
     }
  
@@ -398,14 +424,17 @@ gen75_mfc_bsp_buf_base_addr_state(VADriverContextP ctx, struct gen6_encoder_cont
 }
 
 static void
-gen75_mfc_avc_img_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+gen75_mfc_avc_img_state(VADriverContextP ctx,
+                        struct gen6_encoder_context *gen6_encoder_context,
+                        struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
-
     int width_in_mbs = (mfc_context->surface_state.width + 15) / 16;
     int height_in_mbs = (mfc_context->surface_state.height + 15) / 16;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 16);
     OUT_BCS_BATCH(batch, MFX_AVC_IMG_STATE | (16 - 2));
     OUT_BCS_BATCH(batch,
@@ -458,13 +487,15 @@ gen75_mfc_avc_img_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_
 
 static void
 gen75_mfc_avc_directmode_state_bplus(VADriverContextP ctx,
-                       struct gen6_encoder_context *gen6_encoder_context)
+                                     struct gen6_encoder_context *gen6_encoder_context,
+                                     struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
-
     int i;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 71);
 
     OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (71 - 2));
@@ -502,15 +533,19 @@ gen75_mfc_avc_directmode_state_bplus(VADriverContextP ctx,
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void gen75_mfc_avc_directmode_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_mfc_avc_directmode_state(VADriverContextP ctx,
+                                           struct gen6_encoder_context *gen6_encoder_context,
+                                           struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
     int i;
     struct i965_driver_data *i965 = i965_driver_data(ctx);
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     if (IS_STEPPING_BPLUS(i965)) {
-       gen75_mfc_avc_directmode_state_bplus(ctx, gen6_encoder_context);
+       gen75_mfc_avc_directmode_state_bplus(ctx, gen6_encoder_context, batch);
        return;
     }
 
@@ -552,12 +587,15 @@ static void gen75_mfc_avc_directmode_state(VADriverContextP ctx, struct gen6_enc
 }
 
 static void gen75_mfc_avc_slice_state(VADriverContextP ctx,
-                                     int intra_slice,
-                                     struct gen6_encoder_context *gen6_encoder_context)
+                                      int intra_slice,
+                                      struct gen6_encoder_context *gen6_encoder_context,
+                                      struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 11);;
 
     OUT_BCS_BATCH(batch, MFX_AVC_SLICE_STATE | (11 - 2) );
@@ -602,14 +640,17 @@ static void gen75_mfc_avc_slice_state(VADriverContextP ctx,
 
 static void
 gen75_mfc_qm_state(VADriverContextP ctx,
-                  int qm_type,
-                  unsigned int *qm,
-                  int qm_length,
-                  struct gen6_encoder_context *gen6_encoder_context)
+                   int qm_type,
+                   unsigned int *qm,
+                   int qm_length,
+                   struct gen6_encoder_context *gen6_encoder_context,
+                   struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     unsigned int qm_buffer[16];
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     assert(qm_length <= 16);
     assert(sizeof(*qm) == 4);
     memcpy(qm_buffer, qm, qm_length * 4);
@@ -621,7 +662,9 @@ gen75_mfc_qm_state(VADriverContextP ctx,
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void gen75_mfc_avc_qm_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_mfc_avc_qm_state(VADriverContextP ctx,
+                                   struct gen6_encoder_context *gen6_encoder_context,
+                                   struct intel_batchbuffer *batch)
 {
     unsigned int qm[16] = {
         0x10101010, 0x10101010, 0x10101010, 0x10101010,
@@ -630,22 +673,25 @@ static void gen75_mfc_avc_qm_state(VADriverContextP ctx, struct gen6_encoder_con
         0x10101010, 0x10101010, 0x10101010, 0x10101010
     };
 
-    gen75_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 12, gen6_encoder_context);
-    gen75_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 12, gen6_encoder_context);
-    gen75_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 16, gen6_encoder_context);
-    gen75_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 16, gen6_encoder_context);
+    gen75_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 12, gen6_encoder_context, batch);
+    gen75_mfc_qm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 12, gen6_encoder_context, batch);
+    gen75_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 16, gen6_encoder_context, batch);
+    gen75_mfc_qm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 16, gen6_encoder_context, batch);
 }
 
 static void
 gen75_mfc_fqm_state(VADriverContextP ctx,
-                   int fqm_type,
-                   unsigned int *fqm,
-                   int fqm_length,
-                   struct gen6_encoder_context *gen6_encoder_context)
+                    int fqm_type,
+                    unsigned int *fqm,
+                    int fqm_length,
+                    struct gen6_encoder_context *gen6_encoder_context,
+                    struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     unsigned int fqm_buffer[32];
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     assert(fqm_length <= 32);
     assert(sizeof(*fqm) == 4);
     memcpy(fqm_buffer, fqm, fqm_length * 4);
@@ -657,7 +703,9 @@ gen75_mfc_fqm_state(VADriverContextP ctx,
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void gen75_mfc_avc_fqm_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_mfc_avc_fqm_state(VADriverContextP ctx,
+                                    struct gen6_encoder_context *gen6_encoder_context,
+                                    struct intel_batchbuffer *batch)
 {
     unsigned int qm[32] = {
         0x10001000, 0x10001000, 0x10001000, 0x10001000,
@@ -670,17 +718,21 @@ static void gen75_mfc_avc_fqm_state(VADriverContextP ctx, struct gen6_encoder_co
         0x10001000, 0x10001000, 0x10001000, 0x10001000
     };
 
-    gen75_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 24, gen6_encoder_context);
-    gen75_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 24, gen6_encoder_context);
-    gen75_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 32, gen6_encoder_context);
-    gen75_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 32, gen6_encoder_context);
+    gen75_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, qm, 24, gen6_encoder_context, batch);
+    gen75_mfc_fqm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, qm, 24, gen6_encoder_context, batch);
+    gen75_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, qm, 32, gen6_encoder_context, batch);
+    gen75_mfc_fqm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, qm, 32, gen6_encoder_context, batch);
 }
 
-static void gen75_mfc_avc_ref_idx_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_mfc_avc_ref_idx_state(VADriverContextP ctx,
+                                        struct gen6_encoder_context *gen6_encoder_context,
+                                        struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int i;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, 10);
 
     OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | 8);
@@ -695,9 +747,12 @@ static void gen75_mfc_avc_ref_idx_state(VADriverContextP ctx, struct gen6_encode
 }
        
 static void
-gen75_mfc_avc_insert_object(VADriverContextP ctx, int flush_data, struct gen6_encoder_context *gen6_encoder_context)
+gen75_mfc_avc_insert_object(VADriverContextP ctx, int flush_data,
+                            struct gen6_encoder_context *gen6_encoder_context,
+                            struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     BEGIN_BCS_BATCH(batch, 4);
 
@@ -715,15 +770,18 @@ gen75_mfc_avc_insert_object(VADriverContextP ctx, int flush_data, struct gen6_en
 
 static int
 gen75_mfc_avc_pak_object_intra(VADriverContextP ctx, int x, int y, int end_mb, int qp,unsigned int *msg,
-                              struct gen6_encoder_context *gen6_encoder_context)
+                               struct gen6_encoder_context *gen6_encoder_context,
+                               struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int len_in_dwords = 12;
 
     unsigned int intra_msg;
 #define                INTRA_MSG_FLAG          (1 << 13)
 #define                INTRA_MBTYPE_MASK       (0x1F0000)
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, len_in_dwords);
 
     intra_msg = msg[0] & 0xC0FF;
@@ -758,12 +816,15 @@ gen75_mfc_avc_pak_object_intra(VADriverContextP ctx, int x, int y, int end_mb, i
 }
 
 static int gen75_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, int qp,
-       unsigned int offset, unsigned int *msg, struct gen6_encoder_context *gen6_encoder_context)
+                                          unsigned int offset, unsigned int *msg, struct gen6_encoder_context *gen6_encoder_context,
+                                          struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     int len_in_dwords = 12;
     unsigned int inter_msg;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BCS_BATCH(batch, len_in_dwords);
 
     OUT_BCS_BATCH(batch, MFC_AVC_PAK_OBJECT | (len_in_dwords - 2));
@@ -905,35 +966,35 @@ static void gen75_mfc_avc_pipeline_programing(VADriverContextP ctx,
             if (emit_new_state) {
                 intel_batchbuffer_emit_mi_flush(batch);
                 
-                    gen75_mfc_pipe_mode_select(ctx, MFX_FORMAT_AVC, gen6_encoder_context);
-                    gen75_mfc_surface_state(ctx, gen6_encoder_context);
-                    gen75_mfc_ind_obj_base_addr_state(ctx, gen6_encoder_context);
+                gen75_mfc_pipe_mode_select(ctx, MFX_FORMAT_AVC, gen6_encoder_context, batch);
+                gen75_mfc_surface_state(ctx, gen6_encoder_context, batch);
+                gen75_mfc_ind_obj_base_addr_state(ctx, gen6_encoder_context, batch);
 
-                gen75_mfc_pipe_buf_addr_state(ctx, gen6_encoder_context);
-                gen75_mfc_bsp_buf_base_addr_state(ctx, gen6_encoder_context);
+                gen75_mfc_pipe_buf_addr_state(ctx, gen6_encoder_context, batch);
+                gen75_mfc_bsp_buf_base_addr_state(ctx, gen6_encoder_context, batch);
 
-                    gen75_mfc_avc_img_state(ctx, gen6_encoder_context);
-                    gen75_mfc_avc_qm_state(ctx, gen6_encoder_context);
-                    gen75_mfc_avc_fqm_state(ctx, gen6_encoder_context);
-                    gen75_mfc_avc_directmode_state(ctx, gen6_encoder_context);
+                gen75_mfc_avc_img_state(ctx, gen6_encoder_context, batch);
+                gen75_mfc_avc_qm_state(ctx, gen6_encoder_context, batch);
+                gen75_mfc_avc_fqm_state(ctx, gen6_encoder_context, batch);
+                gen75_mfc_avc_directmode_state(ctx, gen6_encoder_context, batch);
 
-                gen75_mfc_avc_ref_idx_state(ctx, gen6_encoder_context);
-                gen75_mfc_avc_slice_state(ctx, is_intra, gen6_encoder_context);
+                gen75_mfc_avc_ref_idx_state(ctx, gen6_encoder_context, batch);
+                gen75_mfc_avc_slice_state(ctx, is_intra, gen6_encoder_context, batch);
                 emit_new_state = 0;
             }
 
            msg = (unsigned int *) (msg_ptr + mb_index * vme_context->vme_output.size_block);
             if (is_intra) {
-                object_len_in_bytes = gen75_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, gen6_encoder_context);
+                object_len_in_bytes = gen75_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, gen6_encoder_context, batch);
             } else {
                inter_rdo = msg[INTER_RDO_OFFSET] & RDO_MASK;
                intra_rdo = msg[INTRA_RDO_OFFSET] & RDO_MASK;
                if (intra_rdo < inter_rdo) {
-                       object_len_in_bytes = gen75_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, gen6_encoder_context);
+                    object_len_in_bytes = gen75_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, gen6_encoder_context, batch);
                } else {
-                       msg += INTER_MSG_OFFSET;
-                       offset = mb_index * vme_context->vme_output.size_block + INTER_MV_OFFSET;
-                       object_len_in_bytes = gen75_mfc_avc_pak_object_inter(ctx, x, y, last_mb, qp, offset, msg, gen6_encoder_context);
+                    msg += INTER_MSG_OFFSET;
+                    offset = mb_index * vme_context->vme_output.size_block + INTER_MV_OFFSET;
+                    object_len_in_bytes = gen75_mfc_avc_pak_object_inter(ctx, x, y, last_mb, qp, offset, msg, gen6_encoder_context, batch);
                }
            }
             if (intel_batchbuffer_check_free_space(batch, object_len_in_bytes) == 0) {
index 6299d17..38b15c5 100644 (file)
@@ -420,19 +420,26 @@ static VAStatus gen75_vme_vme_state_setup(VADriverContextP ctx,
     return VA_STATUS_SUCCESS;
 }
 
-static void gen75_vme_pipeline_select(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_vme_pipeline_select(VADriverContextP ctx,
+                                      struct gen6_encoder_context *gen6_encoder_context,
+                                      struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     BEGIN_BATCH(batch, 1);
     OUT_BATCH(batch, CMD_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
     ADVANCE_BATCH(batch);
 }
 
-static void gen75_vme_state_base_address(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_vme_state_base_address(VADriverContextP ctx,
+                                         struct gen6_encoder_context *gen6_encoder_context,
+                                         struct intel_batchbuffer *batch)
 {
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
+
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
 
     BEGIN_BATCH(batch, 10);
 
@@ -457,11 +464,15 @@ static void gen75_vme_state_base_address(VADriverContextP ctx, struct gen6_encod
     ADVANCE_BATCH(batch);
 }
 
-static void gen75_vme_vfe_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_vme_vfe_state(VADriverContextP ctx,
+                                struct gen6_encoder_context *gen6_encoder_context,
+                                struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BATCH(batch, 8);
 
     OUT_BATCH(batch, CMD_MEDIA_VFE_STATE | 6);                                 /*Gen6 CMD_MEDIA_STATE_POINTERS = CMD_MEDIA_STATE */
@@ -480,11 +491,15 @@ static void gen75_vme_vfe_state(VADriverContextP ctx, struct gen6_encoder_contex
 
 }
 
-static void gen75_vme_curbe_load(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_vme_curbe_load(VADriverContextP ctx,
+                                 struct gen6_encoder_context *gen6_encoder_context,
+                                 struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BATCH(batch, 4);
 
     OUT_BATCH(batch, CMD_MEDIA_CURBE_LOAD | 2);
@@ -496,11 +511,15 @@ static void gen75_vme_curbe_load(VADriverContextP ctx, struct gen6_encoder_conte
     ADVANCE_BATCH(batch);
 }
 
-static void gen75_vme_idrt(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context)
+static void gen75_vme_idrt(VADriverContextP ctx,
+                           struct gen6_encoder_context *gen6_encoder_context,
+                           struct intel_batchbuffer *batch)
 {
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BATCH(batch, 4);
 
     OUT_BATCH(batch, CMD_MEDIA_INTERFACE_LOAD | 2);    
@@ -512,17 +531,20 @@ static void gen75_vme_idrt(VADriverContextP ctx, struct gen6_encoder_context *ge
 }
 
 static int gen75_vme_media_object(VADriverContextP ctx, 
-                                 struct encode_state *encode_state,
-                                 int mb_x, int mb_y,
-                                 int kernel, unsigned int mb_intra_ub,
-                                 struct gen6_encoder_context *gen6_encoder_context)
+                                  struct encode_state *encode_state,
+                                  int mb_x, int mb_y,
+                                  int kernel, unsigned int mb_intra_ub,
+                                  struct gen6_encoder_context *gen6_encoder_context,
+                                  struct intel_batchbuffer *batch)
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
-    struct intel_batchbuffer *batch = gen6_encoder_context->base.batch;
     struct object_surface *obj_surface = SURFACE(encode_state->current_render_target);
     int mb_width = ALIGN(obj_surface->orig_width, 16) / 16;
     int len_in_dowrds = 8;
 
+    if (batch == NULL)
+        batch = gen6_encoder_context->base.batch;
+
     BEGIN_BATCH(batch, len_in_dowrds);
     
     OUT_BATCH(batch, CMD_MEDIA_OBJECT | (len_in_dowrds - 2));
@@ -627,19 +649,19 @@ static void gen75_vme_pipeline_programing(VADriverContextP ctx,
                 intel_batchbuffer_emit_mi_flush(batch);
 
                 /*Step2: State command PIPELINE_SELECT*/
-                gen75_vme_pipeline_select(ctx, gen6_encoder_context);
+                gen75_vme_pipeline_select(ctx, gen6_encoder_context, batch);
 
                 /*Step3: State commands configuring pipeline states*/
-                gen75_vme_state_base_address(ctx, gen6_encoder_context);
-                gen75_vme_vfe_state(ctx, gen6_encoder_context);
-                gen75_vme_curbe_load(ctx, gen6_encoder_context);
-                gen75_vme_idrt(ctx, gen6_encoder_context);
+                gen75_vme_state_base_address(ctx, gen6_encoder_context, batch);
+                gen75_vme_vfe_state(ctx, gen6_encoder_context, batch);
+                gen75_vme_curbe_load(ctx, gen6_encoder_context, batch);
+                gen75_vme_idrt(ctx, gen6_encoder_context, batch);
 
                 emit_new_state = 0;
             }
 
             /*Step4: Primitive commands*/
-            object_len_in_bytes = gen75_vme_media_object(ctx, encode_state, x, y, is_intra ? VME_INTRA_SHADER : VME_INTER_SHADER, mb_intra_ub, gen6_encoder_context);
+            object_len_in_bytes = gen75_vme_media_object(ctx, encode_state, x, y, is_intra ? VME_INTRA_SHADER : VME_INTER_SHADER, mb_intra_ub, gen6_encoder_context, batch);
 
             if (intel_batchbuffer_check_free_space(batch, object_len_in_bytes) == 0) {
                 assert(0);