diff options
author | Haihao Xiang <haihao.xiang@intel.com> | 2019-05-23 16:25:01 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2019-06-10 13:33:10 +0800 |
commit | 205e103a2c5d62e8736a3e0e19d5a43bb332bf4c (patch) | |
tree | cc7e0088acca2e11f47f983300083f1133b940bb | |
parent | eefe4be48cba838b4f2d761d797a4c9ac0027c9c (diff) | |
download | libva-intel-driver-205e103a2c5d62e8736a3e0e19d5a43bb332bf4c.tar.gz |
Postpone the update of vp9_frame_ctx
Mapping the buffer for vp9_frame_ctx at once after batch buffer
submission will cause GT frequency boost, so postpone the update of
vp9_frame_ctx to next frame
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
Tested-by: Shankar, Vaibhav <vaibhav.shankar@intel.com>
-rw-r--r-- | src/gen9_mfd.c | 39 | ||||
-rw-r--r-- | src/gen9_mfd.h | 1 |
2 files changed, 23 insertions, 17 deletions
diff --git a/src/gen9_mfd.c b/src/gen9_mfd.c index 38fde98e..1b6cbfe5 100644 --- a/src/gen9_mfd.c +++ b/src/gen9_mfd.c @@ -1198,6 +1198,23 @@ vp9_update_probabilities(VADriverContextP ctx, assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VADecPictureParameterBufferVP9 *)decode_state->pic_param->buffer; + //update vp9_frame_ctx according to frame_context_id + if (gen9_hcpd_context->last_frame.refresh_frame_context) { + void *pfc = (void *)&gen9_hcpd_context->vp9_frame_ctx[gen9_hcpd_context->last_frame.frame_context_idx]; + void *pprob = NULL; + + //update vp9_fc to frame_context + dri_bo_map(gen9_hcpd_context->last_frame.prob_buffer_bo, 1); + pprob = (void *)gen9_hcpd_context->last_frame.prob_buffer_bo->virtual; + if (gen9_hcpd_context->last_frame.frame_type == HCP_VP9_KEY_FRAME || + gen9_hcpd_context->last_frame.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->last_frame.prob_buffer_bo); + } + //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) { if ((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) || @@ -1836,6 +1853,9 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP ctx, gen9_hcpd_context->last_frame.refresh_frame_context = pic_param->pic_fields.bits.refresh_frame_context; gen9_hcpd_context->last_frame.frame_context_idx = pic_param->pic_fields.bits.frame_context_idx; gen9_hcpd_context->last_frame.intra_only = pic_param->pic_fields.bits.intra_only; + dri_bo_unreference(gen9_hcpd_context->last_frame.prob_buffer_bo); + gen9_hcpd_context->last_frame.prob_buffer_bo = gen9_hcpd_context->vp9_probability_buffer.bo; + dri_bo_reference(gen9_hcpd_context->last_frame.prob_buffer_bo); // switch mv buffer if (pic_param->pic_fields.bits.frame_type != HCP_VP9_KEY_FRAME) { @@ -1853,23 +1873,6 @@ 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); - 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: return vaStatus; } @@ -1932,6 +1935,7 @@ gen9_hcpd_context_destroy(void *hw_context) FREE_GEN_BUFFER((&gen9_hcpd_context->vp9_segment_id_buffer)); dri_bo_unreference(gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo); dri_bo_unreference(gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo); + dri_bo_unreference(gen9_hcpd_context->last_frame.prob_buffer_bo); intel_batchbuffer_free(gen9_hcpd_context->base.batch); free(gen9_hcpd_context); @@ -1957,6 +1961,7 @@ gen9_hcpd_vp9_context_init(VADriverContextP ctx, gen9_hcpd_context->last_frame.intra_only = 0; gen9_hcpd_context->last_frame.prob_buffer_saved_flag = 0; gen9_hcpd_context->last_frame.prob_buffer_restored_flag = 0; + gen9_hcpd_context->last_frame.prob_buffer_bo = NULL; //Super block in VP9 is 64x64 gen9_hcpd_context->ctb_size = 64; diff --git a/src/gen9_mfd.h b/src/gen9_mfd.h index b08eab84..1224fb33 100644 --- a/src/gen9_mfd.h +++ b/src/gen9_mfd.h @@ -48,6 +48,7 @@ typedef struct vp9_frame_status { uint8_t intra_only; uint8_t prob_buffer_saved_flag; uint8_t prob_buffer_restored_flag; + dri_bo *prob_buffer_bo; } vp9_last_frame_status; typedef struct vp9_mv_temporal_buffer { |