diff options
author | Zhao Yakui <yakui.zhao@intel.com> | 2012-10-31 16:47:58 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2012-10-31 22:04:07 +0800 |
commit | 132e945297bb64baf7e34d2946900d818d112000 (patch) | |
tree | b8a2e0d8fe86bcbc8e2d7fb77bd7ea952f433ceb | |
parent | fb0bef337776499a1ab1926f27fd25ecd5971c5e (diff) | |
download | vaapi-intel-driver-132e945297bb64baf7e34d2946900d818d112000.tar.gz vaapi-intel-driver-132e945297bb64baf7e34d2946900d818d112000.tar.bz2 vaapi-intel-driver-132e945297bb64baf7e34d2946900d818d112000.zip |
Restrict the max MV number in MV prediction
This is to follow the level limits for MV number for the two
consecutive MBs in H264 Spec.
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
-rw-r--r-- | src/gen6_vme.c | 17 | ||||
-rw-r--r-- | src/gen6_vme.h | 1 | ||||
-rw-r--r-- | src/gen75_vme.c | 19 | ||||
-rw-r--r-- | src/shaders/vme/inter_frame.asm | 4 | ||||
-rw-r--r-- | src/shaders/vme/inter_frame.g6b | 3 | ||||
-rw-r--r-- | src/shaders/vme/inter_frame.g7b | 3 | ||||
-rw-r--r-- | src/shaders/vme/inter_frame_haswell.asm | 3 | ||||
-rw-r--r-- | src/shaders/vme/inter_frame_haswell.g75b | 2 |
8 files changed, 45 insertions, 7 deletions
diff --git a/src/gen6_vme.c b/src/gen6_vme.c index 4504d5a..81f094b 100644 --- a/src/gen6_vme.c +++ b/src/gen6_vme.c @@ -316,10 +316,19 @@ static VAStatus gen6_vme_constant_setup(VADriverContextP ctx, { struct gen6_vme_context *vme_context = encoder_context->vme_context; // unsigned char *constant_buffer; + unsigned int *vme_state_message; + int mv_num = 32; + if (vme_context->h264_level >= 30) { + mv_num = 16; + if (vme_context->h264_level >= 31) + mv_num = 8; + } dri_bo_map(vme_context->gpe_context.curbe.bo, 1); assert(vme_context->gpe_context.curbe.bo->virtual); // constant_buffer = vme_context->curbe.bo->virtual; + vme_state_message = (unsigned int *)vme_context->gpe_context.curbe.bo->virtual; + vme_state_message[31] = mv_num; /*TODO copy buffer into CURB*/ @@ -567,7 +576,13 @@ static VAStatus gen6_vme_prepare(VADriverContextP ctx, VAStatus vaStatus = VA_STATUS_SUCCESS; VAEncSliceParameterBufferH264 *pSliceParameter = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer; int is_intra = pSliceParameter->slice_type == SLICE_TYPE_I; - + VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer; + struct gen6_vme_context *vme_context = encoder_context->vme_context; + + if (!vme_context->h264_level || + (vme_context->h264_level != pSequenceParameter->level_idc)) { + vme_context->h264_level = pSequenceParameter->level_idc; + } /*Setup all the memory object*/ gen6_vme_surface_setup(ctx, encode_state, is_intra, encoder_context); gen6_vme_interface_setup(ctx, encode_state, encoder_context); diff --git a/src/gen6_vme.h b/src/gen6_vme.h index 3b66b25..e34c376 100644 --- a/src/gen6_vme.h +++ b/src/gen6_vme.h @@ -82,6 +82,7 @@ struct gen6_vme_context unsigned long binding_table_offset, unsigned long surface_state_offset); void *vme_state_message; + unsigned int h264_level; }; Bool gen75_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context); diff --git a/src/gen75_vme.c b/src/gen75_vme.c index 79408dd..c0b021c 100644 --- a/src/gen75_vme.c +++ b/src/gen75_vme.c @@ -297,6 +297,16 @@ static VAStatus gen75_vme_constant_setup(VADriverContextP ctx, { struct gen6_vme_context *vme_context = encoder_context->vme_context; unsigned char *constant_buffer; + unsigned int *vme_state_message; + int mv_num = 32; + + vme_state_message = (unsigned int *)vme_context->vme_state_message; + if (vme_context->h264_level >= 30) { + mv_num = 16; + if (vme_context->h264_level >= 31) + mv_num = 8; + } + vme_state_message[31] = mv_num; dri_bo_map(vme_context->gpe_context.curbe.bo, 1); assert(vme_context->gpe_context.curbe.bo->virtual); @@ -306,7 +316,7 @@ static VAStatus gen75_vme_constant_setup(VADriverContextP ctx, /* Now it uses the fixed search path. So it is constructed directly * in the GPU shader. */ - memcpy(constant_buffer, (char *)vme_context->vme_state_message, 32); + memcpy(constant_buffer, (char *)vme_context->vme_state_message, 128); dri_bo_unmap( vme_context->gpe_context.curbe.bo); @@ -550,6 +560,13 @@ static VAStatus gen75_vme_prepare(VADriverContextP ctx, VAStatus vaStatus = VA_STATUS_SUCCESS; VAEncSliceParameterBufferH264 *pSliceParameter = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer; int is_intra = pSliceParameter->slice_type == SLICE_TYPE_I; + VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer; + struct gen6_vme_context *vme_context = encoder_context->vme_context; + + if (!vme_context->h264_level || + (vme_context->h264_level != pSequenceParameter->level_idc)) { + vme_context->h264_level = pSequenceParameter->level_idc; + } /*Setup all the memory object*/ gen75_vme_surface_setup(ctx, encode_state, is_intra, encoder_context); diff --git a/src/shaders/vme/inter_frame.asm b/src/shaders/vme/inter_frame.asm index 24387cd..ce4bd11 100644 --- a/src/shaders/vme/inter_frame.asm +++ b/src/shaders/vme/inter_frame.asm @@ -50,7 +50,9 @@ mov (1) vme_m0.20<1>:UB thread_id_ub {align1}; /* dispa mov (1) vme_m0.22<1>:UW REF_REGION_SIZE {align1}; /* Reference Width&Height, 32x32 */ mov (1) vme_m1.0<1>:UD ADAPTIVE_SEARCH_ENABLE:ud {align1} ; -mov (1) vme_m1.4<1>:UD FB_PRUNING_ENABLE + MAX_NUM_MV:UD {align1}; /* Default value MAX 32 MVs */ +mov (1) vme_m1.4<1>:UD FB_PRUNING_ENABLE:UD {align1}; +/* MV num is passed by constant buffer. R4.28 */ +mov (1) vme_m1.4<1>:UB r4.28<0,1,0>:UB {align1}; mov (1) vme_m1.8<1>:UD START_CENTER + SEARCH_PATH_LEN:UD {align1}; mul (1) obw_m0.8<1>:UD w_in_mb_uw<0,1,0>:UW orig_y_ub<0,1,0>:UB {align1}; diff --git a/src/shaders/vme/inter_frame.g6b b/src/shaders/vme/inter_frame.g6b index c63f7d7..ea66788 100644 --- a/src/shaders/vme/inter_frame.g6b +++ b/src/shaders/vme/inter_frame.g6b @@ -18,7 +18,8 @@ { 0x00000001, 0x24540231, 0x00000014, 0x00000000 }, { 0x00000001, 0x24560169, 0x00000000, 0x28302830 }, { 0x00000001, 0x24600061, 0x00000000, 0x00000002 }, - { 0x00000001, 0x24640061, 0x00000000, 0x40000020 }, + { 0x00000001, 0x24640061, 0x00000000, 0x40000000 }, + { 0x00000001, 0x24640231, 0x0000009c, 0x00000000 }, { 0x00000001, 0x24680061, 0x00000000, 0x30003030 }, { 0x00000041, 0x24884521, 0x000000a2, 0x000000a1 }, { 0x00000040, 0x24884421, 0x00000488, 0x000000a0 }, diff --git a/src/shaders/vme/inter_frame.g7b b/src/shaders/vme/inter_frame.g7b index 5e738ca..4601ba8 100644 --- a/src/shaders/vme/inter_frame.g7b +++ b/src/shaders/vme/inter_frame.g7b @@ -17,7 +17,8 @@ { 0x00000001, 0x24540231, 0x00000014, 0x00000000 }, { 0x00000001, 0x24560169, 0x00000000, 0x28302830 }, { 0x00000001, 0x24600061, 0x00000000, 0x00000002 }, - { 0x00000001, 0x24640061, 0x00000000, 0x40000020 }, + { 0x00000001, 0x24640061, 0x00000000, 0x40000000 }, + { 0x00000001, 0x24640231, 0x0000009c, 0x00000000 }, { 0x00000001, 0x24680061, 0x00000000, 0x30003030 }, { 0x00000041, 0x24884521, 0x000000a2, 0x000000a1 }, { 0x00000040, 0x24884421, 0x00000488, 0x000000a0 }, diff --git a/src/shaders/vme/inter_frame_haswell.asm b/src/shaders/vme/inter_frame_haswell.asm index 8024b0b..80df800 100644 --- a/src/shaders/vme/inter_frame_haswell.asm +++ b/src/shaders/vme/inter_frame_haswell.asm @@ -193,7 +193,8 @@ mov (1) vme_m0.4<1>:UD vme_m0.0<0,1,0>:UD {align1}; mov (8) vme_msg_0.0<1>:UD vme_m0.0<8,8,1>:UD {align1}; mov (1) vme_m1.0<1>:UD ADAPTIVE_SEARCH_ENABLE:ud {align1} ; -mov (1) vme_m1.4<1>:UD MAX_NUM_MV:UD {align1}; /* Default value MAX 32 MVs */ +/* the Max MV number is passed by constant buffer */ +mov (1) vme_m1.4<1>:UB r4.28<0,1,0>:UB {align1}; mov (1) vme_m1.8<1>:UD START_CENTER + SEARCH_PATH_LEN:UD {align1}; mov (8) vme_msg_1.0<1>:UD vme_m1.0<8,8,1>:UD {align1}; diff --git a/src/shaders/vme/inter_frame_haswell.g75b b/src/shaders/vme/inter_frame_haswell.g75b index cc1da86..2e240b7 100644 --- a/src/shaders/vme/inter_frame_haswell.g75b +++ b/src/shaders/vme/inter_frame_haswell.g75b @@ -79,7 +79,7 @@ { 0x00000001, 0x24440021, 0x00000440, 0x00000000 }, { 0x00600001, 0x28000021, 0x008d0440, 0x00000000 }, { 0x00000001, 0x24600061, 0x00000000, 0x00000002 }, - { 0x00000001, 0x24640061, 0x00000000, 0x00000020 }, + { 0x00000001, 0x24640231, 0x0000009c, 0x00000000 }, { 0x00000001, 0x24680061, 0x00000000, 0x30003030 }, { 0x00600001, 0x28200021, 0x008d0460, 0x00000000 }, { 0x00600001, 0x28400021, 0x008d0560, 0x00000000 }, |