OSDN Git Service

ENC:disable SVC feature of AVC encoder on SKL/APL/KBL
[android-x86/hardware-intel-common-vaapi.git] / src / gen9_mfd.c
index 92faa4f..fed1bc1 100644 (file)
 
 #define OUT_BUFFER(buf_bo, is_target, ma)  do {                         \
         if (buf_bo) {                                                   \
-            OUT_BCS_RELOC(batch,                                        \
+            OUT_BCS_RELOC64(batch,                                        \
                           buf_bo,                                       \
                           I915_GEM_DOMAIN_RENDER,                       \
                           is_target ? I915_GEM_DOMAIN_RENDER : 0,       \
                           0);                                           \
         } else {                                                        \
             OUT_BCS_BATCH(batch, 0);                                    \
+            OUT_BCS_BATCH(batch, 0);                                    \
         }                                                               \
-        OUT_BCS_BATCH(batch, 0);                                        \
         if (ma)                                                         \
-            OUT_BCS_BATCH(batch, 0);                                    \
+            OUT_BCS_BATCH(batch, i965->intel.mocs_state);                                    \
     } while (0)
 
 #define OUT_BUFFER_MA_TARGET(buf_bo)       OUT_BUFFER(buf_bo, 1, 1)
@@ -269,6 +269,7 @@ gen9_hcpd_pipe_buf_addr_state(VADriverContextP ctx,
                               struct decode_state *decode_state,
                               struct gen9_hcpd_context *gen9_hcpd_context)
 {
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct intel_batchbuffer *batch = gen9_hcpd_context->base.batch;
     struct object_surface *obj_surface;
     GenHevcSurface *gen9_hevc_surface;
@@ -338,6 +339,7 @@ gen9_hcpd_ind_obj_base_addr_state(VADriverContextP ctx,
                                   dri_bo *slice_data_bo,
                                   struct gen9_hcpd_context *gen9_hcpd_context)
 {
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct intel_batchbuffer *batch = gen9_hcpd_context->base.batch;
 
     BEGIN_BCS_BATCH(batch, 14);
@@ -1126,8 +1128,6 @@ vp9_gen_default_probabilities(VADriverContextP ctx, struct gen9_hcpd_context *ge
     {
         gen9_hcpd_context->vp9_frame_ctx[i] = gen9_hcpd_context->vp9_fc_inter_default;
     }
-    gen9_hcpd_context->vp9_fc = gen9_hcpd_context->vp9_fc_inter_default;
-
 }
 
 static void
@@ -1137,64 +1137,10 @@ vp9_update_probabilities(VADriverContextP ctx,
 {
     VADecPictureParameterBufferVP9 *pic_param;
     int i = 0;
-    uint8_t is_saved = VP9_PROB_BUFFER_SAVED_NO;
-    uint8_t is_restored = VP9_PROB_BUFFER_RESTORED_NO;
-
-    uint8_t last_frame_type = gen9_hcpd_context->last_frame.frame_type;
-    uint8_t temp_frame_ctx_id;
 
     assert(decode_state->pic_param && decode_state->pic_param->buffer);
     pic_param = (VADecPictureParameterBufferVP9 *)decode_state->pic_param->buffer;
-    temp_frame_ctx_id = pic_param->pic_fields.bits.frame_context_idx;
-
-    if(pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME)
-    {
-        gen9_hcpd_context->vp9_fc = gen9_hcpd_context->vp9_fc_key_default;
-        gen9_hcpd_context->last_frame.prob_buffer_saved_flag = VP9_PROB_BUFFER_SAVED_NO;
-        gen9_hcpd_context->last_frame.prob_buffer_restored_flag = VP9_PROB_BUFFER_RESTORED_NO;
 
-    }else
-    {
-        gen9_hcpd_context->vp9_fc = gen9_hcpd_context->vp9_fc_inter_default;
-    }
-
-    // restore?
-    if(gen9_hcpd_context->last_frame.prob_buffer_saved_flag == VP9_PROB_BUFFER_SAVED_SECNE_1)
-    {
-        if((pic_param->pic_fields.bits.frame_type == HCP_VP9_INTER_FRAME))
-        {
-            //save the inter frame values for the 343 bytes
-            //Update the 343 bytes of the buffer with Intra values
-            is_restored = VP9_PROB_BUFFER_RESTORED_SECNE_1;
-        }
-    }else if(gen9_hcpd_context->last_frame.prob_buffer_saved_flag == VP9_PROB_BUFFER_SAVED_SECNE_2)
-    {
-        if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) ||pic_param->pic_fields.bits.intra_only||pic_param->pic_fields.bits.error_resilient_mode)
-        {
-            temp_frame_ctx_id = 0;
-        }
-
-        if((pic_param->pic_fields.bits.frame_type == HCP_VP9_INTER_FRAME) &&
-            (temp_frame_ctx_id == 0))
-        {
-
-            is_restored = VP9_PROB_BUFFER_RESTORED_SECNE_2;
-        }
-    }
-
-    if(is_restored > VP9_PROB_BUFFER_RESTORED_NO && is_restored < VP9_PROB_BUFFER_RESTORED_SECNE_MAX)
-    {
-        memcpy(gen9_hcpd_context->vp9_frame_ctx[gen9_hcpd_context->last_frame.frame_context_idx].inter_mode_probs,gen9_hcpd_context->vp9_saved_fc.inter_mode_probs,VP9_PROB_BUFFER_KEY_INTER_SIZE);
-    }
-
-    if((gen9_hcpd_context->last_frame.prob_buffer_restored_flag == VP9_PROB_BUFFER_RESTORED_SECNE_MAX) ||
-        (gen9_hcpd_context->last_frame.refresh_frame_context && last_frame_type == HCP_VP9_KEY_FRAME && (pic_param->pic_fields.bits.frame_type == HCP_VP9_INTER_FRAME)))
-    {
-        if(pic_param->pic_fields.bits.frame_type == HCP_VP9_INTER_FRAME)
-        {
-            memcpy(gen9_hcpd_context->vp9_frame_ctx[gen9_hcpd_context->last_frame.frame_context_idx].inter_mode_probs,gen9_hcpd_context->vp9_fc_inter_default.inter_mode_probs,VP9_PROB_BUFFER_KEY_INTER_SIZE);
-        }
-    }
     //first part buffer update: Case 1)Reset all 4 probablity buffers
    if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) ||pic_param->pic_fields.bits.intra_only||pic_param->pic_fields.bits.error_resilient_mode)
     {
@@ -1206,6 +1152,9 @@ vp9_update_probabilities(VADriverContextP ctx,
             for(i = 0; i < FRAME_CONTEXTS; i++)
             {
                 memcpy(&gen9_hcpd_context->vp9_frame_ctx[i],&gen9_hcpd_context->vp9_fc_inter_default,VP9_PROB_BUFFER_FIRST_PART_SIZE);
+
+                vp9_copy(gen9_hcpd_context->vp9_frame_ctx[i].seg_tree_probs, default_seg_tree_probs);
+                vp9_copy(gen9_hcpd_context->vp9_frame_ctx[i].seg_pred_probs, default_seg_pred_probs);
             }
         }else if(pic_param->pic_fields.bits.reset_frame_context == 2&&pic_param->pic_fields.bits.intra_only)
         {
@@ -1214,46 +1163,6 @@ vp9_update_probabilities(VADriverContextP ctx,
         pic_param->pic_fields.bits.frame_context_idx = 0;
     }
 
-    //Full buffer update: Case 2.2)Reset only segmentation prob buffer
-    if(pic_param->pic_fields.bits.segmentation_enabled &&
-        pic_param->pic_fields.bits.segmentation_update_map)
-    {
-        for(i = 0; i < FRAME_CONTEXTS; i++)
-        {
-            //Reset only the segementation probability buffers
-            vp9_copy(gen9_hcpd_context->vp9_frame_ctx[i].seg_tree_probs, default_seg_tree_probs);
-            vp9_copy(gen9_hcpd_context->vp9_frame_ctx[i].seg_pred_probs, default_seg_pred_probs);
-        }
-    }
-
-    //update vp9_fc according to frame_context_id
-    {
-        gen9_hcpd_context->vp9_fc = gen9_hcpd_context->vp9_frame_ctx[pic_param->pic_fields.bits.frame_context_idx];
-    }
-    //Partial Buffer Update
-    //Case 1) Update top 3 probabilities only
-    if(pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME)
-    {
-        memcpy(gen9_hcpd_context->vp9_fc.inter_mode_probs,gen9_hcpd_context->vp9_fc_key_default.inter_mode_probs,VP9_PROB_BUFFER_KEY_INTER_SIZE);
-        if((!pic_param->pic_fields.bits.segmentation_enabled ||
-            !pic_param->pic_fields.bits.segmentation_update_map)) {
-            //Update with key frame default probability values for only
-            //tx_probs, coef_probs, and the next 343 bytes
-            memcpy(&gen9_hcpd_context->vp9_fc,&gen9_hcpd_context->vp9_fc_key_default,VP9_PROB_BUFFER_FIRST_PART_SIZE);
-        }
-    }
-    //Case 2) Update 343 bytes for first inter following key frame
-    if( last_frame_type == HCP_VP9_KEY_FRAME &&
-        (pic_param->pic_fields.bits.frame_type == HCP_VP9_INTER_FRAME)) {
-        //Update with inter frame default values for the 343 bytes
-        memcpy(gen9_hcpd_context->vp9_fc.inter_mode_probs,gen9_hcpd_context->vp9_fc_inter_default.inter_mode_probs,VP9_PROB_BUFFER_KEY_INTER_SIZE);
-    }
-    //Case 2.1) Update 343 bytes for first intra-inly frame following key frame
-    if( last_frame_type == HCP_VP9_KEY_FRAME &&
-        pic_param->pic_fields.bits.intra_only) {
-        //Update with inter frame default values for the 343 bytes
-        memcpy(gen9_hcpd_context->vp9_fc.inter_mode_probs,gen9_hcpd_context->vp9_fc_key_default.inter_mode_probs,VP9_PROB_BUFFER_KEY_INTER_SIZE);
-    }
     //Case 3) Update only segment probabilities
     if((pic_param->pic_fields.bits.segmentation_enabled &&
         pic_param->pic_fields.bits.segmentation_update_map))
@@ -1261,68 +1170,34 @@ vp9_update_probabilities(VADriverContextP ctx,
         //Update seg_tree_probs and seg_pred_probs accordingly
         for (i=0; i<SEG_TREE_PROBS; i++)
         {
-            gen9_hcpd_context->vp9_fc.seg_tree_probs[i] = pic_param->mb_segment_tree_probs[i];
+            gen9_hcpd_context->vp9_frame_ctx[pic_param->pic_fields.bits.frame_context_idx].seg_tree_probs[i] = pic_param->mb_segment_tree_probs[i];
         }
         for (i=0; i<PREDICTION_PROBS; i++)
         {
-            gen9_hcpd_context->vp9_fc.seg_pred_probs[i] = pic_param->segment_pred_probs[i];
+            gen9_hcpd_context->vp9_frame_ctx[pic_param->pic_fields.bits.frame_context_idx].seg_pred_probs[i] = pic_param->segment_pred_probs[i];
         }
     }
 
-    //Case 4) Considering Intra only frame in the middle of Inter frames
-    if((pic_param->pic_fields.bits.intra_only &&
-        (pic_param->pic_fields.bits.frame_type == HCP_VP9_INTER_FRAME)&&
-        (pic_param->pic_fields.bits.reset_frame_context==0  ||
-        pic_param->pic_fields.bits.reset_frame_context==1||
-        pic_param->pic_fields.bits.reset_frame_context==2||
-        pic_param->pic_fields.bits.reset_frame_context==3)) &&
-        (last_frame_type == HCP_VP9_INTER_FRAME))
-    {
-        //save the inter frame values for the 343 bytes
-        //Update the 343 bytes of the buffer with Intra values
-        is_saved = VP9_PROB_BUFFER_SAVED_SECNE_1;
-    }
-    //Case 5) Considering Intra only frame among 3 Inter frames
-    if((pic_param->pic_fields.bits.intra_only &&
-        (pic_param->pic_fields.bits.frame_type == HCP_VP9_INTER_FRAME)&&
-        (pic_param->pic_fields.bits.reset_frame_context==2 ||
-        pic_param->pic_fields.bits.frame_context_idx==1)) &&
-        ((last_frame_type == HCP_VP9_INTER_FRAME) &&
-        (gen9_hcpd_context->last_frame.frame_context_idx==0)))
-    {
-        //save the inter frame values for the 343 bytes
-        //Update the 343 bytes of the buffer with Intra values
-        is_saved = VP9_PROB_BUFFER_SAVED_SECNE_2;
-    }
-
-    if(is_saved > VP9_PROB_BUFFER_SAVED_NO)
-    {
-        gen9_hcpd_context->vp9_saved_fc = gen9_hcpd_context->vp9_fc;
-        memcpy(gen9_hcpd_context->vp9_fc.inter_mode_probs,gen9_hcpd_context->vp9_fc_key_default.inter_mode_probs,VP9_PROB_BUFFER_KEY_INTER_SIZE);
-    }else if(pic_param->pic_fields.bits.intra_only)
+    //update vp9_fc according to frame_context_id
     {
-        is_restored = VP9_PROB_BUFFER_RESTORED_SECNE_MAX;
+        void *pfc = (void *)&gen9_hcpd_context->vp9_frame_ctx[pic_param->pic_fields.bits.frame_context_idx];
+        void *pprob = NULL;
 
-    }
+        dri_bo_map(gen9_hcpd_context->vp9_probability_buffer.bo,1);
 
-    // update after the restored
-    if(gen9_hcpd_context->last_frame.prob_buffer_restored_flag == VP9_PROB_BUFFER_RESTORED_SECNE_2)
-    {
-        if((pic_param->pic_fields.bits.frame_type == HCP_VP9_INTER_FRAME) &&
-            pic_param->pic_fields.bits.frame_context_idx==1)
+        pprob = (void *)gen9_hcpd_context->vp9_probability_buffer.bo->virtual;
+        memcpy(pprob,pfc,2048);
+        //only update 343bytes for key or intra_only frame
+        if(pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME ||
+            pic_param->pic_fields.bits.intra_only)
         {
-            memcpy(&gen9_hcpd_context->vp9_fc,&gen9_hcpd_context->vp9_fc_inter_default,VP9_PROB_BUFFER_FIRST_PART_SIZE);
+            memcpy(pprob + VP9_PROB_BUFFER_FIRST_PART_SIZE - VP9_PROB_BUFFER_KEY_INTER_SIZE
+                    , gen9_hcpd_context->vp9_fc_key_default.inter_mode_probs
+                    , VP9_PROB_BUFFER_KEY_INTER_SIZE);
         }
-    }
 
-    {
-        dri_bo_map(gen9_hcpd_context->vp9_probability_buffer.bo,1);
-        memcpy((unsigned char *)gen9_hcpd_context->vp9_probability_buffer.bo->virtual,&gen9_hcpd_context->vp9_fc,2048);
         dri_bo_unmap(gen9_hcpd_context->vp9_probability_buffer.bo);
     }
-    // save the flag in order to restore or update prob buffer
-    gen9_hcpd_context->last_frame.prob_buffer_saved_flag = is_saved;
-    gen9_hcpd_context->last_frame.prob_buffer_restored_flag = is_restored;
 }
 
 static void
@@ -1523,6 +1398,7 @@ gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
                               struct decode_state *decode_state,
                               struct gen9_hcpd_context *gen9_hcpd_context)
 {
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct intel_batchbuffer *batch = gen9_hcpd_context->base.batch;
     struct object_surface *obj_surface;
     int i=0;
@@ -1957,12 +1833,19 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP ctx,
     //update vp9_frame_ctx according to frame_context_id
     if (pic_param->pic_fields.bits.refresh_frame_context)
     {
+        void *pfc = (void *)&gen9_hcpd_context->vp9_frame_ctx[pic_param->pic_fields.bits.frame_context_idx];
+        void *pprob = NULL;
+
         //update vp9_fc to frame_context
         dri_bo_map(gen9_hcpd_context->vp9_probability_buffer.bo,1);
-        memcpy(&gen9_hcpd_context->vp9_fc,(unsigned char *)gen9_hcpd_context->vp9_probability_buffer.bo->virtual,2048);
-        dri_bo_unmap(gen9_hcpd_context->vp9_probability_buffer.bo);
-        gen9_hcpd_context->vp9_frame_ctx[pic_param->pic_fields.bits.frame_context_idx] = gen9_hcpd_context->vp9_fc;
+        pprob = (void *)gen9_hcpd_context->vp9_probability_buffer.bo->virtual;
+        if(pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME||
+                pic_param->pic_fields.bits.intra_only)
+            memcpy(pfc, pprob, VP9_PROB_BUFFER_FIRST_PART_SIZE - VP9_PROB_BUFFER_KEY_INTER_SIZE);
+        else
+            memcpy(pfc, pprob, VP9_PROB_BUFFER_FIRST_PART_SIZE);
 
+        dri_bo_unmap(gen9_hcpd_context->vp9_probability_buffer.bo);
     }
 
 out:
@@ -2109,3 +1992,17 @@ gen9_dec_hw_context_init(VADriverContextP ctx, struct object_config *obj_config)
         return gen8_dec_hw_context_init(ctx, obj_config);
     }
 }
+
+void gen9_max_resolution(struct i965_driver_data *i965,
+                         struct object_config *obj_config,
+                         int *w,                                /* out */
+                         int *h)                                /* out */
+{
+    if (obj_config->profile == VAProfileJPEGBaseline) {
+        *w = 8192;
+        *h = 8192;
+    } else {
+        *w = i965->codec_info->max_width;
+        *h = i965->codec_info->max_height;
+    }
+}