Pass the reference frame index in List0/1 into the PAK command
authorXiang, Haihao <haihao.xiang@intel.com>
Sun, 29 Sep 2013 08:25:02 +0000 (16:25 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Wed, 13 Nov 2013 07:29:32 +0000 (15:29 +0800)
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
(cherry picked from commit 68380a7f141bedcc0f6fbbbcee2f5e42b6ade0e0)

src/gen6_mfc.c
src/gen6_mfc_common.c
src/gen6_vme.h
src/gen75_mfc.c
src/shaders/utils/mfc_batchbuffer.inc
src/shaders/utils/mfc_batchbuffer_avc_inter.asm
src/shaders/utils/mfc_batchbuffer_avc_inter.g6b
src/shaders/utils/mfc_batchbuffer_avc_inter.g7b

index 62fa2e9..d152ed9 100644 (file)
@@ -708,6 +708,7 @@ gen6_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, in
                               unsigned char target_mb_size,unsigned char max_mb_size, int slice_type,
                               struct intel_batchbuffer *batch)
 {
+    struct gen6_vme_context *vme_context = encoder_context->vme_context;
     int len_in_dwords = 11;
 
     if (batch == NULL)
@@ -737,8 +738,8 @@ gen6_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, in
 
     /*Stuff for Inter MB*/
     OUT_BCS_BATCH(batch, msg[1]);        
-    OUT_BCS_BATCH(batch, 0x0);    
-    OUT_BCS_BATCH(batch, 0x0);        
+    OUT_BCS_BATCH(batch, vme_context->ref_index_in_mb[0]);
+    OUT_BCS_BATCH(batch, vme_context->ref_index_in_mb[1]);
 
     /*MaxSizeInWord and TargetSzieInWord*/
     OUT_BCS_BATCH(batch, (max_mb_size << 24) |
@@ -1004,11 +1005,12 @@ gen6_mfc_batchbuffer_emit_object_command(struct intel_batchbuffer *batch,
                                          int mb_x,
                                          int mb_y,
                                          int width_in_mbs,
-                                         int qp)
+                                         int qp,
+                                         unsigned int ref_index[2])
 {
-    BEGIN_BATCH(batch, 12);
+    BEGIN_BATCH(batch, 14);
     
-    OUT_BATCH(batch, CMD_MEDIA_OBJECT | (12 - 2));
+    OUT_BATCH(batch, CMD_MEDIA_OBJECT | (14 - 2));
     OUT_BATCH(batch, index);
     OUT_BATCH(batch, 0);
     OUT_BATCH(batch, 0);
@@ -1032,6 +1034,8 @@ gen6_mfc_batchbuffer_emit_object_command(struct intel_batchbuffer *batch,
     OUT_BATCH(batch,
               qp << 16 |
               width_in_mbs);
+    OUT_BATCH(batch, ref_index[0]);
+    OUT_BATCH(batch, ref_index[1]);
 
     ADVANCE_BATCH(batch);
 }
@@ -1049,6 +1053,7 @@ gen6_mfc_avc_batchbuffer_slice_command(VADriverContextP ctx,
 {
     struct intel_batchbuffer *batch = encoder_context->base.batch;
     struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
+    struct gen6_vme_context *vme_context = encoder_context->vme_context;
     int width_in_mbs = (mfc_context->surface_state.width + 15) / 16;
     int total_mbs = slice_param->num_macroblocks;
     int number_mb_cmds = 128;
@@ -1080,7 +1085,8 @@ gen6_mfc_avc_batchbuffer_slice_command(VADriverContextP ctx,
                                                  mb_x,
                                                  mb_y,
                                                  width_in_mbs,
-                                                 qp);
+                                                 qp,
+                                                 vme_context->ref_index_in_mb);
 
         if (first_object) {
             head_offset += head_size;
@@ -1118,7 +1124,8 @@ gen6_mfc_avc_batchbuffer_slice_command(VADriverContextP ctx,
                                                  mb_x,
                                                  mb_y,
                                                  width_in_mbs,
-                                                 qp);
+                                                 qp,
+                                                 vme_context->ref_index_in_mb);
     }
 }
                           
index 5c3f82f..5605ef3 100644 (file)
@@ -1336,6 +1336,7 @@ intel_avc_vme_reference_state(VADriverContextP ctx,
     int max_num_references;
     VAPictureH264 *curr_pic;
     VAPictureH264 *ref_list;
+    int ref_idx;
 
     if (list_index == 0) {
         max_num_references = pic_param->num_ref_idx_l0_active_minus1 + 1;
@@ -1362,9 +1363,9 @@ intel_avc_vme_reference_state(VADriverContextP ctx,
             obj_surface = encode_state->reference_objects[list_index];
             vme_context->used_references[list_index] = &pic_param->ReferenceFrames[list_index];
         }
-    } else {
-        int ref_idx;
 
+        ref_idx = 0;
+    } else {
         curr_pic = &pic_param->CurrPic;
 
         /* select the reference frame in temporal space */
@@ -1380,10 +1381,16 @@ intel_avc_vme_reference_state(VADriverContextP ctx,
 
     if (obj_surface &&
         obj_surface->bo) {
+        assert(ref_idx >= 0);
         vme_context->used_reference_objects[list_index] = obj_surface;
         vme_source_surface_state(ctx, surface_index, obj_surface, encoder_context);
+        vme_context->ref_index_in_mb[list_index] = (ref_idx << 24 |
+                                                    ref_idx << 16 |
+                                                    ref_idx <<  8 |
+                                                    ref_idx);
     } else {
         vme_context->used_reference_objects[list_index] = NULL;
         vme_context->used_references[list_index] = NULL;
+        vme_context->ref_index_in_mb[list_index] = 0;
     }
 }
index 45f1472..939a4a3 100644 (file)
@@ -89,6 +89,7 @@ struct gen6_vme_context
 
     struct object_surface *used_reference_objects[2];
     void *used_references[2];
+    unsigned int ref_index_in_mb[2];
 };
 
 #define MPEG2_PIC_WIDTH_HEIGHT 30
index 4eecc9c..c92f74d 100644 (file)
@@ -1040,6 +1040,7 @@ gen75_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, i
                                unsigned char target_mb_size,unsigned char max_mb_size, int slice_type,
                                struct intel_batchbuffer *batch)
 {
+    struct gen6_vme_context *vme_context = encoder_context->vme_context;
     int len_in_dwords = 12;
     unsigned int inter_msg = 0;
     if (batch == NULL)
@@ -1117,8 +1118,8 @@ gen75_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, i
     inter_msg = msg[1] >> 8;
     /*Stuff for Inter MB*/
     OUT_BCS_BATCH(batch, inter_msg);        
-    OUT_BCS_BATCH(batch, 0x0);    
-    OUT_BCS_BATCH(batch, 0x0);        
+    OUT_BCS_BATCH(batch, vme_context->ref_index_in_mb[0]);
+    OUT_BCS_BATCH(batch, vme_context->ref_index_in_mb[1]);
 
     /*MaxSizeInWord and TargetSzieInWord*/
     OUT_BCS_BATCH(batch, (max_mb_size << 24) |
index c83d5d4..c3a0fec 100644 (file)
@@ -139,6 +139,8 @@ define(`mb_y',                  `inline_reg0.17') /* :ub, */
 define(`mb_xy',                 `inline_reg0.16') /* :uw, */      
 define(`width_in_mb',           `inline_reg0.20') /* :uw, the picture width in macroblocks */
 define(`qp',                    `inline_reg0.22') /* :ub, */
+define(`ref_idx0',              `inline_reg0.24') /* :ud */
+define(`ref_idx1',              `inline_reg0.28') /* :ud */
 
 /*
  * GRF 8~15 -- temporary registers
index 59152b8..549f021 100644 (file)
@@ -103,6 +103,12 @@ __FILL_INTER_PAK_COMMAND:
         /* DW7 */
         mov             (1)     pak_object7_ud<1>:ud            ob_read_wb0.4<0,1,0>:ud {align1} ;
 
+        /* DW8 */
+        mov             (1)     pak_object8_ud<1>:ud            ref_idx0<0,1,0>:ud {align1} ;
+
+        /* DW9 */
+        mov             (1)     pak_object9_ud<1>:ud            ref_idx1<0,1,0>:ud {align1} ;
+
         jmpi            (1)     __OUTPUT_PAK_COMMAND ;
 
 __FILL_INTRA_PAK_COMMAND:
index 2e1703e..24b268f 100644 (file)
@@ -24,7 +24,7 @@
    { 0x00800001, 0x23400061, 0x00000000, 0x00000000 },
    { 0x01000005, 0x20002d28, 0x020000ac, 0x00020002 },
    { 0x01000005, 0x20000c20, 0x00000200, 0x00002000 },
-   { 0x00110020, 0x34001c00, 0x00001400, 0x00000022 },
+   { 0x00110020, 0x34001c00, 0x00001400, 0x00000026 },
    { 0x00000001, 0x23400061, 0x00000000, 0x71490009 },
    { 0x00000041, 0x23480c21, 0x000001e0, 0x000000a0 },
    { 0x00000001, 0x23540061, 0x00000000, 0x000f000f },
@@ -41,6 +41,8 @@
    { 0x00110001, 0x23580061, 0x00000000, 0x00000000 },
    { 0x00000040, 0x23584421, 0x00000358, 0x000000b6 },
    { 0x00000001, 0x235c0021, 0x00000204, 0x00000000 },
+   { 0x00000001, 0x23600021, 0x000000b8, 0x00000000 },
+   { 0x00000001, 0x23640021, 0x000000bc, 0x00000000 },
    { 0x00000020, 0x34001c00, 0x00001400, 0x00000022 },
    { 0x00000001, 0x23400061, 0x00000000, 0x71490009 },
    { 0x00000001, 0x23540061, 0x00000000, 0x000f000f },
@@ -67,7 +69,7 @@
    { 0x00000040, 0x21480c21, 0x00000148, 0x00000004 },
    { 0x00000040, 0x21e00c21, 0x000001e0, 0x00000001 },
    { 0x01000040, 0x20ae3dad, 0x000000ae, 0xffffffff },
-   { 0x00110020, 0x34001c00, 0x00001400, 0xffffff9e },
+   { 0x00110020, 0x34001c00, 0x00001400, 0xffffff9a },
    { 0x00010020, 0x34001c00, 0x02001400, 0x0000001e },
    { 0x00600001, 0x20000022, 0x008d0120, 0x00000000 },
    { 0x05800031, 0x22001cc9, 0x00000000, 0x021a0001 },
index 1664010..f0e2012 100644 (file)
@@ -24,7 +24,7 @@
    { 0x00800001, 0x23400061, 0x00000000, 0x00000000 },
    { 0x01000005, 0x20002d28, 0x020000ac, 0x00020002 },
    { 0x01000005, 0x20000c20, 0x00000200, 0x00002000 },
-   { 0x00110020, 0x34001c00, 0x00001400, 0x00000022 },
+   { 0x00110020, 0x34001c00, 0x00001400, 0x00000026 },
    { 0x00000001, 0x23400061, 0x00000000, 0x71490009 },
    { 0x00000041, 0x23480c21, 0x000001e0, 0x000000a0 },
    { 0x00000001, 0x23540061, 0x00000000, 0x000f000f },
@@ -41,6 +41,8 @@
    { 0x00110001, 0x23580061, 0x00000000, 0x00000000 },
    { 0x00000040, 0x23584421, 0x00000358, 0x000000b6 },
    { 0x00000001, 0x235c0021, 0x00000204, 0x00000000 },
+   { 0x00000001, 0x23600021, 0x000000b8, 0x00000000 },
+   { 0x00000001, 0x23640021, 0x000000bc, 0x00000000 },
    { 0x00000020, 0x34001c00, 0x00001400, 0x00000022 },
    { 0x00000001, 0x23400061, 0x00000000, 0x71490009 },
    { 0x00000001, 0x23540061, 0x00000000, 0x000f000f },
@@ -67,7 +69,7 @@
    { 0x00000040, 0x21480c21, 0x00000148, 0x00000004 },
    { 0x00000040, 0x21e00c21, 0x000001e0, 0x00000001 },
    { 0x01000040, 0x20ae3dad, 0x000000ae, 0xffffffff },
-   { 0x00110020, 0x34001c00, 0x00001400, 0xffffff9e },
+   { 0x00110020, 0x34001c00, 0x00001400, 0xffffff9a },
    { 0x00010020, 0x34001c00, 0x02001400, 0x0000001e },
    { 0x00600001, 0x28000021, 0x008d0120, 0x00000000 },
    { 0x0a800031, 0x22001ca9, 0x00000800, 0x02180001 },