Introduce new frame store context (GenFrameStoreContext) that holds the existing reference frames. This is in view to simplifying the tracking of used or retired frames.
Signed-off-by: Gwenole Beauchesne <gwenole.beauche...@intel.com> --- src/gen6_mfd.c | 45 +++++++++++----------------- src/gen6_mfd.h | 2 +- src/gen75_mfd.c | 74 +++++++++++++++++++--------------------------- src/gen7_mfd.c | 44 +++++++++++---------------- src/gen7_mfd.h | 2 +- src/gen8_mfd.c | 46 ++++++++++++---------------- src/i965_avc_bsd.c | 24 ++++++++------- src/i965_decoder.h | 8 +++++ src/i965_decoder_utils.c | 13 ++++++++ src/i965_media_h264.c | 16 +++++----- src/i965_media_h264.h | 3 +- 11 files changed, 128 insertions(+), 149 deletions(-) diff --git a/src/gen6_mfd.c b/src/gen6_mfd.c index 327056e..dbdebbc 100755 --- a/src/gen6_mfd.c +++ b/src/gen6_mfd.c @@ -199,14 +199,11 @@ gen6_mfd_pipe_buf_addr_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, 0); /* DW 7..22 */ - for (i = 0; i < ARRAY_ELEMS(gen6_mfd_context->reference_surface); i++) { - struct object_surface *obj_surface; - - if (gen6_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen6_mfd_context->reference_surface[i].obj_surface && - gen6_mfd_context->reference_surface[i].obj_surface->bo) { - obj_surface = gen6_mfd_context->reference_surface[i].obj_surface; + for (i = 0; i < ARRAY_ELEMS(gen6_mfd_context->fsc.used_frames); i++) { + struct object_surface * const obj_surface = + gen6_mfd_context->fsc.used_frames[i].obj_surface; + if (obj_surface && obj_surface->bo) { OUT_BCS_RELOC(batch, obj_surface->bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); @@ -426,12 +423,10 @@ gen6_mfd_avc_directmode_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (69 - 2)); /* reference surfaces 0..15 */ - for (i = 0; i < ARRAY_ELEMS(gen6_mfd_context->reference_surface); i++) { - if (gen6_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen6_mfd_context->reference_surface[i].obj_surface && - gen6_mfd_context->reference_surface[i].obj_surface->private_data) { + for (i = 0; i < ARRAY_ELEMS(gen6_mfd_context->fsc.used_frames); i++) { + obj_surface = gen6_mfd_context->fsc.used_frames[i].obj_surface; - obj_surface = gen6_mfd_context->reference_surface[i].obj_surface; + if (obj_surface && obj_surface->private_data) { gen6_avc_surface = obj_surface->private_data; OUT_BCS_RELOC(batch, gen6_avc_surface->dmv_top, I915_GEM_DOMAIN_INSTRUCTION, 0, @@ -471,11 +466,11 @@ gen6_mfd_avc_directmode_state(VADriverContextP ctx, 0); /* POC List */ - for (i = 0; i < ARRAY_ELEMS(gen6_mfd_context->reference_surface); i++) { - if (gen6_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + for (i = 0; i < ARRAY_ELEMS(gen6_mfd_context->fsc.used_frames); i++) { + obj_surface = gen6_mfd_context->fsc.used_frames[i].obj_surface; - assert(gen6_mfd_context->reference_surface[i].obj_surface != NULL); + if (obj_surface) { + int found = 0; for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { va_pic = &pic_param->ReferenceFrames[j]; @@ -483,7 +478,7 @@ gen6_mfd_avc_directmode_state(VADriverContextP ctx, if (va_pic->flags & VA_PICTURE_H264_INVALID) continue; - if (va_pic->picture_id == gen6_mfd_context->reference_surface[i].surface_id) { + if (va_pic->picture_id == obj_surface->base.id) { found = 1; break; } @@ -666,7 +661,7 @@ gen6_mfd_avc_ref_idx_state(VADriverContextP ctx, gen6_send_avc_ref_idx_state( gen6_mfd_context->base.batch, slice_param, - gen6_mfd_context->reference_surface + gen6_mfd_context->fsc.used_frames ); } @@ -837,7 +832,8 @@ gen6_mfd_avc_decode_init(VADriverContextP ctx, assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; - intel_update_avc_frame_store_index(ctx, decode_state, pic_param, gen6_mfd_context->reference_surface); + intel_update_avc_frame_store_index(ctx, decode_state, pic_param, + gen6_mfd_context->fsc.used_frames); width_in_mbs = ((pic_param->picture_width_in_mbs_minus1 + 1) & 0xff); /* Current decoded picture */ @@ -982,7 +978,7 @@ gen6_mfd_mpeg2_decode_init(VADriverContextP ctx, mpeg2_set_reference_surfaces( ctx, - gen6_mfd_context->reference_surface, + gen6_mfd_context->fsc.used_frames, decode_state, pic_param ); @@ -1298,7 +1294,7 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx, intel_update_vc1_frame_store_index(ctx, decode_state, pic_param, - gen6_mfd_context->reference_surface); + gen6_mfd_context->fsc.used_frames); /* Current decoded picture */ obj_surface = decode_state->render_object; @@ -1927,17 +1923,12 @@ gen6_dec_hw_context_init(VADriverContextP ctx, struct object_config *obj_config) { struct intel_driver_data *intel = intel_driver_data(ctx); struct gen6_mfd_context *gen6_mfd_context = calloc(1, sizeof(struct gen6_mfd_context)); - int i; gen6_mfd_context->base.destroy = gen6_mfd_context_destroy; gen6_mfd_context->base.run = gen6_mfd_decode_picture; gen6_mfd_context->base.batch = intel_batchbuffer_new(intel, I915_EXEC_RENDER, 0); - for (i = 0; i < ARRAY_ELEMS(gen6_mfd_context->reference_surface); i++) { - gen6_mfd_context->reference_surface[i].surface_id = VA_INVALID_ID; - gen6_mfd_context->reference_surface[i].frame_store_id = -1; - gen6_mfd_context->reference_surface[i].obj_surface = NULL; - } + gen_frame_store_context_init(&gen6_mfd_context->fsc); gen6_mfd_context->wa_mpeg2_slice_vertical_position = -1; diff --git a/src/gen6_mfd.h b/src/gen6_mfd.h index de131d6..ae7689f 100644 --- a/src/gen6_mfd.h +++ b/src/gen6_mfd.h @@ -62,7 +62,7 @@ struct gen6_mfd_context VAIQMatrixBufferMPEG2 mpeg2; } iq_matrix; - GenFrameStore reference_surface[MAX_GEN_REFERENCE_FRAMES]; + GenFrameStoreContext fsc; GenBuffer post_deblocking_output; GenBuffer pre_deblocking_output; GenBuffer intra_row_store_scratch_buffer; diff --git a/src/gen75_mfd.c b/src/gen75_mfd.c index a0311d9..be481c6 100644 --- a/src/gen75_mfd.c +++ b/src/gen75_mfd.c @@ -231,14 +231,11 @@ gen75_mfd_pipe_buf_addr_state_bplus(VADriverContextP ctx, OUT_BCS_BATCH(batch, 0); /* DW 19..50 */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - struct object_surface *obj_surface; - - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen7_mfd_context->reference_surface[i].obj_surface && - gen7_mfd_context->reference_surface[i].obj_surface->bo) { - obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + struct object_surface * const obj_surface = + gen7_mfd_context->fsc.used_frames[i].obj_surface; + if (obj_surface && obj_surface->bo) { OUT_BCS_RELOC(batch, obj_surface->bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); @@ -315,14 +312,11 @@ gen75_mfd_pipe_buf_addr_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, 0); /* DW 7..22 */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - struct object_surface *obj_surface; - - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen7_mfd_context->reference_surface[i].obj_surface && - gen7_mfd_context->reference_surface[i].obj_surface->bo) { - obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + struct object_surface * const obj_surface = + gen7_mfd_context->fsc.used_frames[i].obj_surface; + if (obj_surface && obj_surface->bo) { OUT_BCS_RELOC(batch, obj_surface->bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); @@ -670,13 +664,12 @@ gen75_mfd_avc_directmode_state_bplus(VADriverContextP ctx, OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (71 - 2)); /* reference surfaces 0..15 */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen7_mfd_context->reference_surface[i].obj_surface && - gen7_mfd_context->reference_surface[i].obj_surface->private_data) { + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + obj_surface = gen7_mfd_context->fsc.used_frames[i].obj_surface; - obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; + if (obj_surface && obj_surface->private_data) { gen7_avc_surface = obj_surface->private_data; + OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); @@ -703,11 +696,11 @@ gen75_mfd_avc_directmode_state_bplus(VADriverContextP ctx, OUT_BCS_BATCH(batch, 0); /* POC List */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + obj_surface = gen7_mfd_context->fsc.used_frames[i].obj_surface; - assert(gen7_mfd_context->reference_surface[i].obj_surface != NULL); + if (obj_surface) { + int found = 0; for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { va_pic = &pic_param->ReferenceFrames[j]; @@ -715,7 +708,7 @@ gen75_mfd_avc_directmode_state_bplus(VADriverContextP ctx, if (va_pic->flags & VA_PICTURE_H264_INVALID) continue; - if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) { + if (va_pic->picture_id == obj_surface->base.id) { found = 1; break; } @@ -764,12 +757,10 @@ gen75_mfd_avc_directmode_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (69 - 2)); /* reference surfaces 0..15 */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen7_mfd_context->reference_surface[i].obj_surface && - gen7_mfd_context->reference_surface[i].obj_surface->private_data) { + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + obj_surface = gen7_mfd_context->fsc.used_frames[i].obj_surface; - obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; + if (obj_surface && obj_surface->private_data) { gen7_avc_surface = obj_surface->private_data; OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top, @@ -810,11 +801,11 @@ gen75_mfd_avc_directmode_state(VADriverContextP ctx, 0); /* POC List */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + obj_surface = gen7_mfd_context->fsc.used_frames[i].obj_surface; - assert(gen7_mfd_context->reference_surface[i].obj_surface != NULL); + if (obj_surface) { + int found = 0; for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { va_pic = &pic_param->ReferenceFrames[j]; @@ -822,7 +813,7 @@ gen75_mfd_avc_directmode_state(VADriverContextP ctx, if (va_pic->flags & VA_PICTURE_H264_INVALID) continue; - if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) { + if (va_pic->picture_id == obj_surface->base.id) { found = 1; break; } @@ -941,7 +932,7 @@ gen75_mfd_avc_ref_idx_state(VADriverContextP ctx, gen6_send_avc_ref_idx_state( gen7_mfd_context->base.batch, slice_param, - gen7_mfd_context->reference_surface + gen7_mfd_context->fsc.used_frames ); } @@ -1078,7 +1069,7 @@ gen75_mfd_avc_decode_init(VADriverContextP ctx, assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; - intel_update_avc_frame_store_index(ctx, decode_state, pic_param, gen7_mfd_context->reference_surface); + intel_update_avc_frame_store_index(ctx, decode_state, pic_param, gen7_mfd_context->fsc.used_frames); width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1; height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; assert(width_in_mbs > 0 && width_in_mbs <= 256); /* 4K */ @@ -1222,7 +1213,7 @@ gen75_mfd_mpeg2_decode_init(VADriverContextP ctx, mpeg2_set_reference_surfaces( ctx, - gen7_mfd_context->reference_surface, + gen7_mfd_context->fsc.used_frames, decode_state, pic_param ); @@ -1561,7 +1552,7 @@ gen75_mfd_vc1_decode_init(VADriverContextP ctx, intel_update_vc1_frame_store_index(ctx, decode_state, pic_param, - gen7_mfd_context->reference_surface); + gen7_mfd_context->fsc.used_frames); /* Current decoded picture */ obj_surface = decode_state->render_object; @@ -3256,17 +3247,12 @@ gen75_dec_hw_context_init(VADriverContextP ctx, struct object_config *obj_config { struct intel_driver_data *intel = intel_driver_data(ctx); struct gen7_mfd_context *gen7_mfd_context = calloc(1, sizeof(struct gen7_mfd_context)); - int i; gen7_mfd_context->base.destroy = gen75_mfd_context_destroy; gen7_mfd_context->base.run = gen75_mfd_decode_picture; gen7_mfd_context->base.batch = intel_batchbuffer_new(intel, I915_EXEC_RENDER, 0); - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - gen7_mfd_context->reference_surface[i].surface_id = VA_INVALID_ID; - gen7_mfd_context->reference_surface[i].frame_store_id = -1; - gen7_mfd_context->reference_surface[i].obj_surface = NULL; - } + gen_frame_store_context_init(&gen7_mfd_context->fsc); gen7_mfd_context->jpeg_wa_surface_id = VA_INVALID_SURFACE; gen7_mfd_context->jpeg_wa_surface_object = NULL; diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c index 3379b40..19cf1d9 100755 --- a/src/gen7_mfd.c +++ b/src/gen7_mfd.c @@ -211,14 +211,11 @@ gen7_mfd_pipe_buf_addr_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, 0); /* DW 7..22 */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - struct object_surface *obj_surface; - - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen7_mfd_context->reference_surface[i].obj_surface && - gen7_mfd_context->reference_surface[i].obj_surface->bo) { - obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + struct object_surface * const obj_surface = + gen7_mfd_context->fsc.used_frames[i].obj_surface; + if (obj_surface && obj_surface->bo) { OUT_BCS_RELOC(batch, obj_surface->bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); @@ -435,12 +432,10 @@ gen7_mfd_avc_directmode_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (69 - 2)); /* reference surfaces 0..15 */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen7_mfd_context->reference_surface[i].obj_surface && - gen7_mfd_context->reference_surface[i].obj_surface->private_data) { + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + obj_surface = gen7_mfd_context->fsc.used_frames[i].obj_surface; - obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; + if (obj_surface && obj_surface->private_data) { gen7_avc_surface = obj_surface->private_data; OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top, I915_GEM_DOMAIN_INSTRUCTION, 0, @@ -480,11 +475,11 @@ gen7_mfd_avc_directmode_state(VADriverContextP ctx, 0); /* POC List */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + obj_surface = gen7_mfd_context->fsc.used_frames[i].obj_surface; - assert(gen7_mfd_context->reference_surface[i].obj_surface != NULL); + if (obj_surface) { + int found = 0; for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { va_pic = &pic_param->ReferenceFrames[j]; @@ -492,7 +487,7 @@ gen7_mfd_avc_directmode_state(VADriverContextP ctx, if (va_pic->flags & VA_PICTURE_H264_INVALID) continue; - if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) { + if (va_pic->picture_id == gen7_mfd_context->fsc.used_frames[i].surface_id) { found = 1; break; } @@ -611,7 +606,7 @@ gen7_mfd_avc_ref_idx_state(VADriverContextP ctx, gen6_send_avc_ref_idx_state( gen7_mfd_context->base.batch, slice_param, - gen7_mfd_context->reference_surface + gen7_mfd_context->fsc.used_frames ); } @@ -752,7 +747,7 @@ gen7_mfd_avc_decode_init(VADriverContextP ctx, assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; - intel_update_avc_frame_store_index(ctx, decode_state, pic_param, gen7_mfd_context->reference_surface); + intel_update_avc_frame_store_index(ctx, decode_state, pic_param, gen7_mfd_context->fsc.used_frames); width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1; height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; assert(width_in_mbs > 0 && width_in_mbs <= 256); /* 4K */ @@ -895,7 +890,7 @@ gen7_mfd_mpeg2_decode_init(VADriverContextP ctx, mpeg2_set_reference_surfaces( ctx, - gen7_mfd_context->reference_surface, + gen7_mfd_context->fsc.used_frames, decode_state, pic_param ); @@ -1239,7 +1234,7 @@ gen7_mfd_vc1_decode_init(VADriverContextP ctx, intel_update_vc1_frame_store_index(ctx, decode_state, pic_param, - gen7_mfd_context->reference_surface); + gen7_mfd_context->fsc.used_frames); /* Current decoded picture */ obj_surface = decode_state->render_object; @@ -2679,17 +2674,12 @@ gen7_dec_hw_context_init(VADriverContextP ctx, struct object_config *obj_config) { struct intel_driver_data *intel = intel_driver_data(ctx); struct gen7_mfd_context *gen7_mfd_context = calloc(1, sizeof(struct gen7_mfd_context)); - int i; gen7_mfd_context->base.destroy = gen7_mfd_context_destroy; gen7_mfd_context->base.run = gen7_mfd_decode_picture; gen7_mfd_context->base.batch = intel_batchbuffer_new(intel, I915_EXEC_RENDER, 0); - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - gen7_mfd_context->reference_surface[i].surface_id = VA_INVALID_ID; - gen7_mfd_context->reference_surface[i].frame_store_id = -1; - gen7_mfd_context->reference_surface[i].obj_surface = NULL; - } + gen_frame_store_context_init(&gen7_mfd_context->fsc); gen7_mfd_context->jpeg_wa_surface_id = VA_INVALID_SURFACE; gen7_mfd_context->jpeg_wa_surface_object = NULL; diff --git a/src/gen7_mfd.h b/src/gen7_mfd.h index 0200216..ef1b84a 100644 --- a/src/gen7_mfd.h +++ b/src/gen7_mfd.h @@ -77,7 +77,7 @@ struct gen7_mfd_context VAIQMatrixBufferH264 h264; /* flat scaling lists (default) */ } iq_matrix; - GenFrameStore reference_surface[MAX_GEN_REFERENCE_FRAMES]; + GenFrameStoreContext fsc; GenBuffer post_deblocking_output; GenBuffer pre_deblocking_output; GenBuffer intra_row_store_scratch_buffer; diff --git a/src/gen8_mfd.c b/src/gen8_mfd.c index ac2e842..459c430 100644 --- a/src/gen8_mfd.c +++ b/src/gen8_mfd.c @@ -239,14 +239,11 @@ gen8_mfd_pipe_buf_addr_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, 0); /* DW 19..50 */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - struct object_surface *obj_surface; - - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen7_mfd_context->reference_surface[i].obj_surface && - gen7_mfd_context->reference_surface[i].obj_surface->bo) { - obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + struct object_surface * const obj_surface = + gen7_mfd_context->fsc.used_frames[i].obj_surface; + if (obj_surface && obj_surface->bo) { OUT_BCS_RELOC(batch, obj_surface->bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); @@ -537,12 +534,10 @@ gen8_mfd_avc_directmode_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (71 - 2)); /* reference surfaces 0..15 */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID && - gen7_mfd_context->reference_surface[i].obj_surface && - gen7_mfd_context->reference_surface[i].obj_surface->private_data) { + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + obj_surface = gen7_mfd_context->fsc.used_frames[i].obj_surface; - obj_surface = gen7_mfd_context->reference_surface[i].obj_surface; + if (obj_surface && obj_surface->private_data) { gen7_avc_surface = obj_surface->private_data; OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top, @@ -571,11 +566,11 @@ gen8_mfd_avc_directmode_state(VADriverContextP ctx, OUT_BCS_BATCH(batch, 0); /* POC List */ - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) { - int found = 0; + for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->fsc.used_frames); i++) { + obj_surface = gen7_mfd_context->fsc.used_frames[i].obj_surface; - assert(gen7_mfd_context->reference_surface[i].obj_surface != NULL); + if (obj_surface) { + int found = 0; for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { va_pic = &pic_param->ReferenceFrames[j]; @@ -583,7 +578,7 @@ gen8_mfd_avc_directmode_state(VADriverContextP ctx, if (va_pic->flags & VA_PICTURE_H264_INVALID) continue; - if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) { + if (va_pic->picture_id == obj_surface->base.id) { found = 1; break; } @@ -702,7 +697,7 @@ gen8_mfd_avc_ref_idx_state(VADriverContextP ctx, gen6_send_avc_ref_idx_state( gen7_mfd_context->base.batch, slice_param, - gen7_mfd_context->reference_surface + gen7_mfd_context->fsc.used_frames ); } @@ -839,7 +834,8 @@ gen8_mfd_avc_decode_init(VADriverContextP ctx, assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; - intel_update_avc_frame_store_index(ctx, decode_state, pic_param, gen7_mfd_context->reference_surface); + intel_update_avc_frame_store_index(ctx, decode_state, pic_param, + gen7_mfd_context->fsc.used_frames); width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1; height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; assert(width_in_mbs > 0 && width_in_mbs <= 256); /* 4K */ @@ -983,7 +979,7 @@ gen8_mfd_mpeg2_decode_init(VADriverContextP ctx, mpeg2_set_reference_surfaces( ctx, - gen7_mfd_context->reference_surface, + gen7_mfd_context->fsc.used_frames, decode_state, pic_param ); @@ -1322,7 +1318,7 @@ gen8_mfd_vc1_decode_init(VADriverContextP ctx, intel_update_vc1_frame_store_index(ctx, decode_state, pic_param, - gen7_mfd_context->reference_surface); + gen7_mfd_context->fsc.used_frames); /* Current decoded picture */ obj_surface = decode_state->render_object; @@ -2765,7 +2761,7 @@ gen8_mfd_vp8_decode_init(VADriverContextP ctx, intel_update_vp8_frame_store_index(ctx, decode_state, pic_param, - gen7_mfd_context->reference_surface); + gen7_mfd_context->fsc.used_frames); /* Current decoded picture */ obj_surface = decode_state->render_object; @@ -3182,16 +3178,12 @@ gen8_dec_hw_context_init(VADriverContextP ctx, struct object_config *obj_config) { struct intel_driver_data *intel = intel_driver_data(ctx); struct gen7_mfd_context *gen7_mfd_context = calloc(1, sizeof(struct gen7_mfd_context)); - int i; gen7_mfd_context->base.destroy = gen8_mfd_context_destroy; gen7_mfd_context->base.run = gen8_mfd_decode_picture; gen7_mfd_context->base.batch = intel_batchbuffer_new(intel, I915_EXEC_RENDER, 0); - for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) { - gen7_mfd_context->reference_surface[i].surface_id = VA_INVALID_ID; - gen7_mfd_context->reference_surface[i].frame_store_id = -1; - } + gen_frame_store_context_init(&gen7_mfd_context->fsc); gen7_mfd_context->jpeg_wa_surface_id = VA_INVALID_SURFACE; gen7_mfd_context->segmentation_buffer.valid = 0; diff --git a/src/i965_avc_bsd.c b/src/i965_avc_bsd.c index ef0bc13..d2c70f6 100644 --- a/src/i965_avc_bsd.c +++ b/src/i965_avc_bsd.c @@ -293,7 +293,7 @@ i965_avc_bsd_slice_state(VADriverContextP ctx, gen5_fill_avc_ref_idx_state( ref_idx_state, va_pic, num_va_pics, - i965_h264_context->fsid_list + i965_h264_context->fs_context.used_frames ); intel_batchbuffer_data(batch, ref_idx_state, sizeof(ref_idx_state)); } @@ -407,10 +407,10 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, else OUT_BCS_BATCH(batch, 0); - for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fsid_list); i++) { - if (i965_h264_context->fsid_list[i].surface_id != VA_INVALID_ID && - i965_h264_context->fsid_list[i].obj_surface && - i965_h264_context->fsid_list[i].obj_surface->private_data) { + for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fs_context.used_frames); i++) { + obj_surface = i965_h264_context->fs_context.used_frames[i].obj_surface; + + if (obj_surface && obj_surface->private_data) { int found = 0; for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { va_pic = &pic_param->ReferenceFrames[j]; @@ -418,14 +418,13 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, if (va_pic->flags & VA_PICTURE_H264_INVALID) continue; - if (va_pic->picture_id == i965_h264_context->fsid_list[i].surface_id) { + if (va_pic->picture_id == obj_surface->base.id) { found = 1; break; } } assert(found == 1); - obj_surface = i965_h264_context->fsid_list[i].obj_surface; avc_bsd_surface = obj_surface->private_data; OUT_BCS_RELOC(batch, avc_bsd_surface->dmv_top, @@ -481,8 +480,10 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, 0); /* POC List */ - for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fsid_list); i++) { - if (i965_h264_context->fsid_list[i].surface_id != VA_INVALID_ID) { + for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fs_context.used_frames); i++) { + obj_surface = i965_h264_context->fs_context.used_frames[i].obj_surface; + + if (obj_surface) { int found = 0; for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { va_pic = &pic_param->ReferenceFrames[j]; @@ -490,7 +491,7 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, if (va_pic->flags & VA_PICTURE_H264_INVALID) continue; - if (va_pic->picture_id == i965_h264_context->fsid_list[i].surface_id) { + if (va_pic->picture_id == obj_surface->base.id) { found = 1; break; } @@ -821,7 +822,8 @@ i965_avc_bsd_pipeline(VADriverContextP ctx, struct decode_state *decode_state, v assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; - intel_update_avc_frame_store_index(ctx, decode_state, pic_param, i965_h264_context->fsid_list); + intel_update_avc_frame_store_index(ctx, decode_state, pic_param, + i965_h264_context->fs_context.used_frames); i965_h264_context->enable_avc_ildb = 0; i965_h264_context->picture.i_flag = 1; diff --git a/src/i965_decoder.h b/src/i965_decoder.h index 01c093f..fbf1d20 100644 --- a/src/i965_decoder.h +++ b/src/i965_decoder.h @@ -41,12 +41,20 @@ struct gen_frame_store { struct object_surface *obj_surface; }; +typedef struct gen_frame_store_context GenFrameStoreContext; +struct gen_frame_store_context { + GenFrameStore used_frames[MAX_GEN_REFERENCE_FRAMES]; +}; + typedef struct gen_buffer GenBuffer; struct gen_buffer { dri_bo *bo; int valid; }; +void +gen_frame_store_context_init(GenFrameStoreContext *fsc); + struct hw_context * gen75_dec_hw_context_init(VADriverContextP ctx, struct object_config *obj_config); diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c index 98d31c3..b834a0e 100644 --- a/src/i965_decoder_utils.c +++ b/src/i965_decoder_utils.c @@ -421,6 +421,19 @@ gen6_send_avc_ref_idx_state( } void +gen_frame_store_context_init(GenFrameStoreContext *fsc) +{ + int i; + + for (i = 0; i < ARRAY_ELEMS(fsc->used_frames); i++) { + GenFrameStore * const fs = &fsc->used_frames[i]; + fs->surface_id = VA_INVALID_ID; + fs->obj_surface = NULL; + fs->frame_store_id = -1; + } +} + +void intel_update_avc_frame_store_index( VADriverContextP ctx, struct decode_state *decode_state, diff --git a/src/i965_media_h264.c b/src/i965_media_h264.c index 9de4e09..b291886 100644 --- a/src/i965_media_h264.c +++ b/src/i965_media_h264.c @@ -374,9 +374,11 @@ i965_media_h264_surfaces_setup(VADriverContextP ctx, media_context); /* Reference Pictures */ - for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fsid_list); i++) { - if (i965_h264_context->fsid_list[i].surface_id != VA_INVALID_ID && - i965_h264_context->fsid_list[i].obj_surface != NULL) { + for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fs_context.used_frames); i++) { + struct object_surface * const obj_surface = + i965_h264_context->fs_context.used_frames[i].obj_surface; + + if (obj_surface) { int found = 0; for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) { va_pic = &pic_param->ReferenceFrames[j]; @@ -384,7 +386,7 @@ i965_media_h264_surfaces_setup(VADriverContextP ctx, if (va_pic->flags & VA_PICTURE_H264_INVALID) continue; - if (va_pic->picture_id == i965_h264_context->fsid_list[i].surface_id) { + if (va_pic->picture_id == obj_surface->base.id) { found = 1; break; } @@ -392,7 +394,6 @@ i965_media_h264_surfaces_setup(VADriverContextP ctx, assert(found == 1); - obj_surface = i965_h264_context->fsid_list[i].obj_surface; w = obj_surface->width; h = obj_surface->height; field_picture = !!(va_pic->flags & (VA_PICTURE_H264_TOP_FIELD | VA_PICTURE_H264_BOTTOM_FIELD)); @@ -875,10 +876,7 @@ i965_media_h264_dec_context_init(VADriverContextP ctx, struct i965_media_context dri_bo_subdata(kernel->bo, 0, kernel->size, kernel->bin); } - for (i = 0; i < 16; i++) { - i965_h264_context->fsid_list[i].surface_id = VA_INVALID_ID; - i965_h264_context->fsid_list[i].frame_store_id = -1; - } + gen_frame_store_context_init(&i965_h264_context->fs_context); i965_h264_context->batch = media_context->base.batch; diff --git a/src/i965_media_h264.h b/src/i965_media_h264.h index 490213c..7d879a4 100644 --- a/src/i965_media_h264.h +++ b/src/i965_media_h264.h @@ -57,12 +57,11 @@ struct i965_h264_context char weight128_offset0_flag; short weight128_offset0; + GenFrameStoreContext fs_context; struct i965_avc_bsd_context i965_avc_bsd_context; struct i965_avc_hw_scoreboard_context avc_hw_scoreboard_context; struct i965_avc_ildb_context avc_ildb_context; - GenFrameStore fsid_list[MAX_GEN_REFERENCE_FRAMES]; - struct i965_kernel avc_kernels[NUM_H264_AVC_KERNELS]; struct intel_batchbuffer *batch; }; -- 1.7.9.5 _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva