From 87a90c604eafc960aa702b059d11949cf10e69ba Mon Sep 17 00:00:00 2001 From: "Xiang, Haihao" Date: Tue, 10 May 2011 12:49:54 +0800 Subject: [PATCH] i965_drv_video: create media_state per context Also clean up some codes --- i965_drv_video/gen6_mfc.c | 412 ++++++++++++++++-------------- i965_drv_video/gen6_mfc.h | 19 +- i965_drv_video/gen6_mfd.c | 215 +++++++--------- i965_drv_video/gen6_mfd.h | 11 +- i965_drv_video/gen6_vme.c | 283 +++++++++++---------- i965_drv_video/gen6_vme.h | 22 +- i965_drv_video/i965_avc_bsd.c | 80 +++--- i965_drv_video/i965_avc_bsd.h | 6 +- i965_drv_video/i965_avc_hw_scoreboard.c | 11 +- i965_drv_video/i965_avc_hw_scoreboard.h | 4 +- i965_drv_video/i965_avc_ildb.c | 92 +++---- i965_drv_video/i965_avc_ildb.h | 4 +- i965_drv_video/i965_drv_video.c | 430 +++++++++++++++++++++++--------- i965_drv_video/i965_drv_video.h | 49 +++- i965_drv_video/i965_encoder.c | 350 ++------------------------ i965_drv_video/i965_encoder.h | 46 +--- i965_drv_video/i965_media.c | 251 ++++++++++--------- i965_drv_video/i965_media.h | 20 +- i965_drv_video/i965_media_h264.c | 311 +++++++++++------------ i965_drv_video/i965_media_h264.h | 6 +- i965_drv_video/i965_media_mpeg2.c | 267 +++++++++++--------- i965_drv_video/i965_media_mpeg2.h | 6 +- i965_drv_video/i965_post_processing.c | 3 +- i965_drv_video/i965_render.c | 5 +- i965_drv_video/intel_batchbuffer.h | 2 +- 25 files changed, 1414 insertions(+), 1491 deletions(-) diff --git a/i965_drv_video/gen6_mfc.c b/i965_drv_video/gen6_mfc.c index c4c9f48..4540697 100644 --- a/i965_drv_video/gen6_mfc.c +++ b/i965_drv_video/gen6_mfc.c @@ -36,6 +36,7 @@ #include "i965_defines.h" #include "i965_structs.h" #include "i965_drv_video.h" +#include "i965_encoder.h" static void gen6_mfc_pipe_mode_select(VADriverContextP ctx) @@ -68,38 +69,36 @@ gen6_mfc_pipe_mode_select(VADriverContextP ctx) } static void -gen6_mfc_surface_state(VADriverContextP ctx) +gen6_mfc_surface_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; BEGIN_BCS_BATCH(ctx, 6); OUT_BCS_BATCH(ctx, MFX_SURFACE_STATE | (6 - 2)); OUT_BCS_BATCH(ctx, 0); OUT_BCS_BATCH(ctx, - ((bcs_state->surface_state.height - 1) << 19) | - ((bcs_state->surface_state.width - 1) << 6)); + ((mfc_context->surface_state.height - 1) << 19) | + ((mfc_context->surface_state.width - 1) << 6)); OUT_BCS_BATCH(ctx, (MFX_SURFACE_PLANAR_420_8 << 28) | /* 420 planar YUV surface */ (1 << 27) | /* must be 1 for interleave U/V, hardware requirement */ (0 << 22) | /* surface object control state, FIXME??? */ - ((bcs_state->surface_state.w_pitch - 1) << 3) | /* pitch */ + ((mfc_context->surface_state.w_pitch - 1) << 3) | /* pitch */ (0 << 2) | /* must be 0 for interleave U/V */ (1 << 1) | /* must be y-tiled */ (I965_TILEWALK_YMAJOR << 0)); /* tile walk, TILEWALK_YMAJOR */ OUT_BCS_BATCH(ctx, (0 << 16) | /* must be 0 for interleave U/V */ - (bcs_state->surface_state.h_pitch)); /* y offset for U(cb) */ + (mfc_context->surface_state.h_pitch)); /* y offset for U(cb) */ OUT_BCS_BATCH(ctx, 0); ADVANCE_BCS_BATCH(ctx); } static void -gen6_mfc_pipe_buf_addr_state(VADriverContextP ctx) +gen6_mfc_pipe_buf_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; int i; BEGIN_BCS_BATCH(ctx, 24); @@ -108,30 +107,30 @@ gen6_mfc_pipe_buf_addr_state(VADriverContextP ctx) OUT_BCS_BATCH(ctx, 0); /* pre output addr */ - OUT_BCS_RELOC(ctx, bcs_state->post_deblocking_output.bo, + OUT_BCS_RELOC(ctx, mfc_context->post_deblocking_output.bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); /* post output addr */ - OUT_BCS_RELOC(ctx, bcs_state->uncompressed_picture_source.bo, + OUT_BCS_RELOC(ctx, mfc_context->uncompressed_picture_source.bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); /* uncompressed data */ OUT_BCS_BATCH(ctx, 0); /* StreamOut data*/ - OUT_BCS_RELOC(ctx, bcs_state->intra_row_store_scratch_buffer.bo, + OUT_BCS_RELOC(ctx, mfc_context->intra_row_store_scratch_buffer.bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); - OUT_BCS_RELOC(ctx, bcs_state->deblocking_filter_row_store_scratch_buffer.bo, + OUT_BCS_RELOC(ctx, mfc_context->deblocking_filter_row_store_scratch_buffer.bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); /* 7..22 Reference pictures*/ - for (i = 0; i < ARRAY_ELEMS(bcs_state->reference_surfaces); i++) { - if ( bcs_state->reference_surfaces[i].bo != NULL) { - OUT_BCS_RELOC(ctx, bcs_state->reference_surfaces[i].bo, - I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, - 0); - } else { - OUT_BCS_BATCH(ctx, 0); - } + for (i = 0; i < ARRAY_ELEMS(mfc_context->reference_surfaces); i++) { + if ( mfc_context->reference_surfaces[i].bo != NULL) { + OUT_BCS_RELOC(ctx, mfc_context->reference_surfaces[i].bo, + I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, + 0); + } else { + OUT_BCS_BATCH(ctx, 0); + } } OUT_BCS_BATCH(ctx, 0); /* no block status */ @@ -139,10 +138,9 @@ gen6_mfc_pipe_buf_addr_state(VADriverContextP ctx) } static void -gen6_mfc_ind_obj_base_addr_state(VADriverContextP ctx) +gen6_mfc_ind_obj_base_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; BEGIN_BCS_BATCH(ctx, 11); @@ -150,7 +148,7 @@ gen6_mfc_ind_obj_base_addr_state(VADriverContextP ctx) OUT_BCS_BATCH(ctx, 0); OUT_BCS_BATCH(ctx, 0); /* MFX Indirect MV Object Base Address */ - OUT_BCS_RELOC(ctx, media_state->vme_output.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + OUT_BCS_RELOC(ctx, vme_context->vme_output.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); OUT_BCS_BATCH(ctx, 0); OUT_BCS_BATCH(ctx, 0); OUT_BCS_BATCH(ctx, 0); @@ -164,15 +162,14 @@ gen6_mfc_ind_obj_base_addr_state(VADriverContextP ctx) } static void -gen6_mfc_bsp_buf_base_addr_state(VADriverContextP ctx) +gen6_mfc_bsp_buf_base_addr_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; BEGIN_BCS_BATCH(ctx, 4); OUT_BCS_BATCH(ctx, MFX_BSP_BUF_BASE_ADDR_STATE | (4 - 2)); - OUT_BCS_RELOC(ctx, bcs_state->bsd_mpc_row_store_scratch_buffer.bo, + OUT_BCS_RELOC(ctx, mfc_context->bsd_mpc_row_store_scratch_buffer.bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); OUT_BCS_BATCH(ctx, 0); @@ -182,13 +179,12 @@ gen6_mfc_bsp_buf_base_addr_state(VADriverContextP ctx) } static void -gen6_mfc_avc_img_state(VADriverContextP ctx) +gen6_mfc_avc_img_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; - int width_in_mbs = (bcs_state->surface_state.width + 15) / 16; - int height_in_mbs = (bcs_state->surface_state.height + 15) / 16; + int width_in_mbs = (mfc_context->surface_state.width + 15) / 16; + int height_in_mbs = (mfc_context->surface_state.height + 15) / 16; BEGIN_BCS_BATCH(ctx, 13); OUT_BCS_BATCH(ctx, MFX_AVC_IMG_STATE | (13 - 2)); @@ -229,7 +225,7 @@ gen6_mfc_avc_img_state(VADriverContextP ctx) OUT_BCS_BATCH(ctx, 0); /*Slice QP Delta for bitrate control*/ OUT_BCS_BATCH(ctx, 0); /*Slice QP Delta for bitrate control*/ OUT_BCS_BATCH(ctx, 0x8C000000); - OUT_BCS_BATCH(ctx, 0x00010000); + OUT_BCS_BATCH(ctx, 0x00010000); OUT_BCS_BATCH(ctx, 0); ADVANCE_BCS_BATCH(ctx); @@ -251,12 +247,12 @@ static void gen6_mfc_avc_directmode_state(VADriverContextP ctx) //TODO: current DMV just for test #if 0 - OUT_BCS_RELOC(ctx, bcs_state->direct_mv_buffers[0].bo, + OUT_BCS_RELOC(ctx, mfc_context->direct_mv_buffers[0].bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); #else - //drm_intel_bo_pin(bcs_state->direct_mv_buffers[0].bo, 0x1000); - //OUT_BCS_BATCH(ctx, bcs_state->direct_mv_buffers[0].bo->offset); + //drm_intel_bo_pin(mfc_context->direct_mv_buffers[0].bo, 0x1000); + //OUT_BCS_BATCH(ctx, mfc_context->direct_mv_buffers[0].bo->offset); OUT_BCS_BATCH(ctx, 0); #endif @@ -271,10 +267,11 @@ static void gen6_mfc_avc_directmode_state(VADriverContextP ctx) ADVANCE_BCS_BATCH(ctx); } -static void gen6_mfc_avc_slice_state(VADriverContextP ctx, int intra_slice) +static void gen6_mfc_avc_slice_state(VADriverContextP ctx, + int intra_slice, + struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; BEGIN_BCS_BATCH(ctx, 11);; @@ -294,7 +291,7 @@ static void gen6_mfc_avc_slice_state(VADriverContextP ctx, int intra_slice) (26<<16) | /*Slice Quantization Parameter*/ 0x0202 ); OUT_BCS_BATCH(ctx, 0); /*First MB X&Y , the postion of current slice*/ - OUT_BCS_BATCH(ctx, ( ((bcs_state->surface_state.height+15)/16) << 16) ); + OUT_BCS_BATCH(ctx, ( ((mfc_context->surface_state.height+15)/16) << 16) ); OUT_BCS_BATCH(ctx, (0<<31) | /*RateControlCounterEnable = disable*/ @@ -308,9 +305,9 @@ static void gen6_mfc_avc_slice_state(VADriverContextP ctx, int intra_slice) (1<<13) | /*RBSP NAL TYPE*/ (0<<12) ); /*CabacZeroWordInsertionEnable*/ - OUT_BCS_RELOC(ctx, bcs_state->mfc_indirect_pak_bse_object.bo, + OUT_BCS_RELOC(ctx, mfc_context->mfc_indirect_pak_bse_object.bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, - bcs_state->mfc_indirect_pak_bse_object.offset); + mfc_context->mfc_indirect_pak_bse_object.offset); OUT_BCS_BATCH(ctx, 0); OUT_BCS_BATCH(ctx, 0); @@ -320,48 +317,48 @@ static void gen6_mfc_avc_slice_state(VADriverContextP ctx, int intra_slice) } static void gen6_mfc_avc_qm_state(VADriverContextP ctx) { - int i; + int i; BEGIN_BCS_BATCH(ctx, 58); - OUT_BCS_BATCH(ctx, MFX_AVC_QM_STATE | 56); - OUT_BCS_BATCH(ctx, 0xFF ) ; - for( i = 0; i < 56; i++) { - OUT_BCS_BATCH(ctx, 0x10101010); - } + OUT_BCS_BATCH(ctx, MFX_AVC_QM_STATE | 56); + OUT_BCS_BATCH(ctx, 0xFF ) ; + for( i = 0; i < 56; i++) { + OUT_BCS_BATCH(ctx, 0x10101010); + } - ADVANCE_BCS_BATCH(ctx); + ADVANCE_BCS_BATCH(ctx); } static void gen6_mfc_avc_fqm_state(VADriverContextP ctx) { - int i; + int i; - BEGIN_BCS_BATCH(ctx, 113); - OUT_BCS_BATCH(ctx, MFC_AVC_FQM_STATE | (113 - 2)); + BEGIN_BCS_BATCH(ctx, 113); + OUT_BCS_BATCH(ctx, MFC_AVC_FQM_STATE | (113 - 2)); - for(i = 0; i < 112;i++) { - OUT_BCS_BATCH(ctx, 0x10001000); - } + for(i = 0; i < 112;i++) { + OUT_BCS_BATCH(ctx, 0x10001000); + } - ADVANCE_BCS_BATCH(ctx); + ADVANCE_BCS_BATCH(ctx); } static void gen6_mfc_avc_ref_idx_state(VADriverContextP ctx) { - int i; + int i; - BEGIN_BCS_BATCH(ctx, 10); + BEGIN_BCS_BATCH(ctx, 10); - OUT_BCS_BATCH(ctx, MFX_AVC_REF_IDX_STATE | 8); - OUT_BCS_BATCH(ctx, 0); //Select L0 + OUT_BCS_BATCH(ctx, MFX_AVC_REF_IDX_STATE | 8); + OUT_BCS_BATCH(ctx, 0); //Select L0 - OUT_BCS_BATCH(ctx, 0x80808000); //Only 1 reference - for(i = 0; i < 7; i++) { - OUT_BCS_BATCH(ctx, 0x80808080); - } + OUT_BCS_BATCH(ctx, 0x80808000); //Only 1 reference + for(i = 0; i < 7; i++) { + OUT_BCS_BATCH(ctx, 0x80808080); + } - ADVANCE_BCS_BATCH(ctx); + ADVANCE_BCS_BATCH(ctx); } @@ -413,129 +410,129 @@ gen6_mfc_avc_pak_object_intra(VADriverContextP ctx, int x, int y, int end_mb, in ADVANCE_BCS_BATCH(ctx); - return len_in_dwords; + return len_in_dwords; } static int gen6_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, int qp, unsigned int offset) { - int len_in_dwords = 11; + int len_in_dwords = 11; BEGIN_BCS_BATCH(ctx, len_in_dwords); OUT_BCS_BATCH(ctx, MFC_AVC_PAK_OBJECT | (len_in_dwords - 2)); - OUT_BCS_BATCH(ctx, 32); /* 32 MV*/ - OUT_BCS_BATCH(ctx, offset); - - OUT_BCS_BATCH(ctx, - (1 << 24) | /* PackedMvNum, Debug*/ - (4 << 20) | /* 8 MV, SNB don't use it*/ - (1 << 19) | /* CbpDcY */ - (1 << 18) | /* CbpDcU */ - (1 << 17) | /* CbpDcV */ - (0 << 15) | /* Transform8x8Flag = 0*/ - (0 << 14) | /* Frame based*/ - (0 << 13) | /* Inter MB */ - (1 << 8) | /* MbType = P_L0_16x16 */ - (0 << 7) | /* MBZ for frame */ - (0 << 6) | /* MBZ */ - (2 << 4) | /* MBZ for inter*/ - (0 << 3) | /* MBZ */ - (0 << 2) | /* SkipMbFlag */ - (0 << 0)); /* InterMbMode */ - - OUT_BCS_BATCH(ctx, (0xFFFF<<16) | (y << 8) | x); /* Code Block Pattern for Y*/ - OUT_BCS_BATCH(ctx, 0x000F000F); /* Code Block Pattern */ - OUT_BCS_BATCH(ctx, (0 << 27) | (end_mb << 26) | qp); /* Last MB */ - - /*Stuff for Inter MB*/ - OUT_BCS_BATCH(ctx, 0x0); - OUT_BCS_BATCH(ctx, 0x0); - OUT_BCS_BATCH(ctx, 0x0); - - OUT_BCS_BATCH(ctx, 0xF0020000); /*MaxSizeInWord and TargetSzieInWord*/ - - ADVANCE_BCS_BATCH(ctx); - - return len_in_dwords; + OUT_BCS_BATCH(ctx, 32); /* 32 MV*/ + OUT_BCS_BATCH(ctx, offset); + + OUT_BCS_BATCH(ctx, + (1 << 24) | /* PackedMvNum, Debug*/ + (4 << 20) | /* 8 MV, SNB don't use it*/ + (1 << 19) | /* CbpDcY */ + (1 << 18) | /* CbpDcU */ + (1 << 17) | /* CbpDcV */ + (0 << 15) | /* Transform8x8Flag = 0*/ + (0 << 14) | /* Frame based*/ + (0 << 13) | /* Inter MB */ + (1 << 8) | /* MbType = P_L0_16x16 */ + (0 << 7) | /* MBZ for frame */ + (0 << 6) | /* MBZ */ + (2 << 4) | /* MBZ for inter*/ + (0 << 3) | /* MBZ */ + (0 << 2) | /* SkipMbFlag */ + (0 << 0)); /* InterMbMode */ + + OUT_BCS_BATCH(ctx, (0xFFFF<<16) | (y << 8) | x); /* Code Block Pattern for Y*/ + OUT_BCS_BATCH(ctx, 0x000F000F); /* Code Block Pattern */ + OUT_BCS_BATCH(ctx, (0 << 27) | (end_mb << 26) | qp); /* Last MB */ + + /*Stuff for Inter MB*/ + OUT_BCS_BATCH(ctx, 0x0); + OUT_BCS_BATCH(ctx, 0x0); + OUT_BCS_BATCH(ctx, 0x0); + + OUT_BCS_BATCH(ctx, 0xF0020000); /*MaxSizeInWord and TargetSzieInWord*/ + + ADVANCE_BCS_BATCH(ctx); + + return len_in_dwords; } -static void gen6_mfc_init(VADriverContextP ctx) +static void gen6_mfc_init(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; dri_bo *bo; int i; /*Encode common setup for MFC*/ - dri_bo_unreference(bcs_state->post_deblocking_output.bo); - bcs_state->post_deblocking_output.bo = NULL; + dri_bo_unreference(mfc_context->post_deblocking_output.bo); + mfc_context->post_deblocking_output.bo = NULL; - dri_bo_unreference(bcs_state->pre_deblocking_output.bo); - bcs_state->pre_deblocking_output.bo = NULL; + dri_bo_unreference(mfc_context->pre_deblocking_output.bo); + mfc_context->pre_deblocking_output.bo = NULL; - dri_bo_unreference(bcs_state->uncompressed_picture_source.bo); - bcs_state->uncompressed_picture_source.bo = NULL; + dri_bo_unreference(mfc_context->uncompressed_picture_source.bo); + mfc_context->uncompressed_picture_source.bo = NULL; - dri_bo_unreference(bcs_state->mfc_indirect_pak_bse_object.bo); - bcs_state->mfc_indirect_pak_bse_object.bo = NULL; + dri_bo_unreference(mfc_context->mfc_indirect_pak_bse_object.bo); + mfc_context->mfc_indirect_pak_bse_object.bo = NULL; for (i = 0; i < NUM_MFC_DMV_BUFFERS; i++){ - dri_bo_unreference(bcs_state->direct_mv_buffers[i].bo); - bcs_state->direct_mv_buffers[i].bo = NULL; + dri_bo_unreference(mfc_context->direct_mv_buffers[i].bo); + mfc_context->direct_mv_buffers[i].bo = NULL; } for (i = 0; i < MAX_MFC_REFERENCE_SURFACES; i++){ - if ( bcs_state->reference_surfaces[i].bo != NULL) - dri_bo_unreference( bcs_state->reference_surfaces[i].bo ); - bcs_state->reference_surfaces[i].bo = NULL; + if (mfc_context->reference_surfaces[i].bo != NULL) + dri_bo_unreference(mfc_context->reference_surfaces[i].bo); + mfc_context->reference_surfaces[i].bo = NULL; } - dri_bo_unreference(bcs_state->intra_row_store_scratch_buffer.bo); + dri_bo_unreference(mfc_context->intra_row_store_scratch_buffer.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "Buffer", 128 * 64, 64); assert(bo); - bcs_state->intra_row_store_scratch_buffer.bo = bo; + mfc_context->intra_row_store_scratch_buffer.bo = bo; - dri_bo_unreference(bcs_state->deblocking_filter_row_store_scratch_buffer.bo); + dri_bo_unreference(mfc_context->deblocking_filter_row_store_scratch_buffer.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "Buffer", 49152, /* 6 * 128 * 64 */ 64); assert(bo); - bcs_state->deblocking_filter_row_store_scratch_buffer.bo = bo; + mfc_context->deblocking_filter_row_store_scratch_buffer.bo = bo; - dri_bo_unreference(bcs_state->bsd_mpc_row_store_scratch_buffer.bo); + dri_bo_unreference(mfc_context->bsd_mpc_row_store_scratch_buffer.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "Buffer", 12288, /* 1.5 * 128 * 64 */ 0x1000); assert(bo); - bcs_state->bsd_mpc_row_store_scratch_buffer.bo = bo; + mfc_context->bsd_mpc_row_store_scratch_buffer.bo = bo; } -void gen6_mfc_avc_pipeline_programing(VADriverContextP ctx, void *obj) +void gen6_mfc_avc_pipeline_programing(VADriverContextP ctx, + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { - struct mfc_encode_state *encode_state = obj; - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; - int width_in_mbs = (bcs_state->surface_state.width + 15) / 16; - int height_in_mbs = (bcs_state->surface_state.height + 15) / 16; - int x,y; - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param->buffer; - VAEncSliceParameterBuffer *pSliceParameter = (VAEncSliceParameterBuffer *)encode_state->slice_params[0]->buffer; + VAEncSliceParameterBuffer *pSliceParameter = (VAEncSliceParameterBuffer *)encode_state->slice_params[0]->buffer; /* FIXME: multi slices */ unsigned int *msg = NULL, offset = 0; int emit_new_state = 1, object_len_in_bytes; int is_intra = pSliceParameter->slice_flags.bits.is_intra; + int width_in_mbs = (mfc_context->surface_state.width + 15) / 16; + int height_in_mbs = (mfc_context->surface_state.height + 15) / 16; + int x,y; intel_batchbuffer_start_atomic_bcs(ctx, 0x1000); if (is_intra) { - dri_bo_map(media_state->vme_output.bo , 1); - msg = (unsigned int *)media_state->vme_output.bo->virtual; + dri_bo_map(vme_context->vme_output.bo , 1); + msg = (unsigned int *)vme_context->vme_output.bo->virtual; } for (y = 0; y < height_in_mbs; y++) { @@ -546,20 +543,20 @@ void gen6_mfc_avc_pipeline_programing(VADriverContextP ctx, void *obj) if (emit_new_state) { intel_batchbuffer_emit_mi_flush_bcs(ctx); gen6_mfc_pipe_mode_select(ctx); - gen6_mfc_surface_state(ctx); - gen6_mfc_pipe_buf_addr_state(ctx); - gen6_mfc_ind_obj_base_addr_state(ctx); - gen6_mfc_bsp_buf_base_addr_state(ctx); - gen6_mfc_avc_img_state(ctx); + gen6_mfc_surface_state(ctx, gen6_encoder_context); + gen6_mfc_pipe_buf_addr_state(ctx, gen6_encoder_context); + gen6_mfc_ind_obj_base_addr_state(ctx, gen6_encoder_context); + gen6_mfc_bsp_buf_base_addr_state(ctx, gen6_encoder_context); + gen6_mfc_avc_img_state(ctx, gen6_encoder_context); gen6_mfc_avc_qm_state(ctx); gen6_mfc_avc_fqm_state(ctx); gen6_mfc_avc_ref_idx_state(ctx); /*gen6_mfc_avc_directmode_state(ctx);*/ - gen6_mfc_avc_slice_state(ctx, is_intra); + gen6_mfc_avc_slice_state(ctx, is_intra, gen6_encoder_context); /*gen6_mfc_avc_insert_object(ctx, 0);*/ emit_new_state = 0; } - + if (is_intra) { assert(msg); object_len_in_bytes = gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg); @@ -579,22 +576,22 @@ void gen6_mfc_avc_pipeline_programing(VADriverContextP ctx, void *obj) } if (is_intra) - dri_bo_unmap(media_state->vme_output.bo); + dri_bo_unmap(vme_context->vme_output.bo); intel_batchbuffer_end_atomic_bcs(ctx); } static VAStatus gen6_mfc_avc_prepare(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { - VAStatus vaStatus = VA_STATUS_SUCCESS; struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; struct object_surface *obj_surface; struct object_buffer *obj_buffer; dri_bo *bo; VAEncPictureParameterBufferH264 *pPicParameter = (VAEncPictureParameterBufferH264 *)encode_state->pic_param->buffer; + VAStatus vaStatus = VA_STATUS_SUCCESS; /*Setup all the input&output object*/ obj_surface = SURFACE(pPicParameter->reconstructed_picture); @@ -617,42 +614,42 @@ static VAStatus gen6_mfc_avc_prepare(VADriverContextP ctx, assert(pitch == obj_surface->width); } - bcs_state->post_deblocking_output.bo = obj_surface->bo; - dri_bo_reference(bcs_state->post_deblocking_output.bo); + mfc_context->post_deblocking_output.bo = obj_surface->bo; + dri_bo_reference(mfc_context->post_deblocking_output.bo); - bcs_state->surface_state.width = obj_surface->orig_width; - bcs_state->surface_state.height = obj_surface->orig_height; - bcs_state->surface_state.w_pitch = obj_surface->width; - bcs_state->surface_state.h_pitch = obj_surface->height; + mfc_context->surface_state.width = obj_surface->orig_width; + mfc_context->surface_state.height = obj_surface->orig_height; + mfc_context->surface_state.w_pitch = obj_surface->width; + mfc_context->surface_state.h_pitch = obj_surface->height; obj_surface = SURFACE(pPicParameter->reference_picture); - assert(obj_surface); - if ( obj_surface->bo != NULL) { - bcs_state->reference_surfaces[0].bo = obj_surface->bo; - dri_bo_reference(obj_surface->bo); - } + assert(obj_surface); + if (obj_surface->bo != NULL) { + mfc_context->reference_surfaces[0].bo = obj_surface->bo; + dri_bo_reference(obj_surface->bo); + } obj_surface = SURFACE(encode_state->current_render_target); assert(obj_surface && obj_surface->bo); - bcs_state->uncompressed_picture_source.bo = obj_surface->bo; - dri_bo_reference(bcs_state->uncompressed_picture_source.bo); + mfc_context->uncompressed_picture_source.bo = obj_surface->bo; + dri_bo_reference(mfc_context->uncompressed_picture_source.bo); obj_buffer = BUFFER (pPicParameter->coded_buf); /* FIXME: fix this later */ bo = obj_buffer->buffer_store->bo; assert(bo); - bcs_state->mfc_indirect_pak_bse_object.bo = bo; - bcs_state->mfc_indirect_pak_bse_object.offset = ALIGN(sizeof(VACodedBufferSegment), 64); - dri_bo_reference(bcs_state->mfc_indirect_pak_bse_object.bo); + mfc_context->mfc_indirect_pak_bse_object.bo = bo; + mfc_context->mfc_indirect_pak_bse_object.offset = ALIGN(sizeof(VACodedBufferSegment), 64); + dri_bo_reference(mfc_context->mfc_indirect_pak_bse_object.bo); /*Programing bcs pipeline*/ - gen6_mfc_avc_pipeline_programing(ctx, encode_state); //filling the pipeline + gen6_mfc_avc_pipeline_programing(ctx, encode_state, gen6_encoder_context); //filling the pipeline return vaStatus; } static VAStatus gen6_mfc_run(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { intel_batchbuffer_flush_bcs(ctx); //run the pipeline @@ -660,12 +657,12 @@ static VAStatus gen6_mfc_run(VADriverContextP ctx, } static VAStatus gen6_mfc_stop(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { #if 0 struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_mfc_context *mfc_context = &gen6_encoder_context->mfc_context; VAEncPictureParameterBufferH264 *pPicParameter = (VAEncPictureParameterBufferH264 *)encode_state->pic_param->buffer; @@ -679,38 +676,30 @@ static VAStatus gen6_mfc_stop(VADriverContextP ctx, return VA_STATUS_SUCCESS; } -static VAStatus +static VAStatus gen6_mfc_avc_encode_picture(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { - gen6_mfc_init(ctx); - gen6_mfc_avc_prepare(ctx, context, encode_state); - gen6_mfc_run(ctx, context, encode_state); - gen6_mfc_stop(ctx, context, encode_state); + gen6_mfc_init(ctx, gen6_encoder_context); + gen6_mfc_avc_prepare(ctx, encode_state, gen6_encoder_context); + gen6_mfc_run(ctx, encode_state, gen6_encoder_context); + gen6_mfc_stop(ctx, encode_state, gen6_encoder_context); return VA_STATUS_SUCCESS; } -VAStatus -gen6_mfc_pipeline(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) +VAStatus +gen6_mfc_pipeline(VADriverContextP ctx, + VAProfile profile, + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct object_context *obj_context = CONTEXT(context); - struct object_config *obj_config; - VAContextID config; VAStatus vaStatus; - assert(obj_context); - config = obj_context->config_id; - obj_config = CONFIG(config); - assert(obj_config); - - switch( obj_config->profile) { + switch (profile) { case VAProfileH264Baseline: - vaStatus = gen6_mfc_avc_encode_picture(ctx, context, &(obj_context->encode_state)); + vaStatus = gen6_mfc_avc_encode_picture(ctx, encode_state, gen6_encoder_context); break; /* FIXME: add for other profile */ @@ -719,6 +708,43 @@ gen6_mfc_pipeline(VADriverContextP ctx, break; } - return VA_STATUS_SUCCESS; + return vaStatus; } +Bool gen6_mfc_context_init(VADriverContextP ctx, struct gen6_mfc_context *mfc_context) +{ + return True; +} + +Bool gen6_mfc_context_destroy(struct gen6_mfc_context *mfc_context) +{ + int i; + + dri_bo_unreference(mfc_context->post_deblocking_output.bo); + mfc_context->post_deblocking_output.bo = NULL; + + dri_bo_unreference(mfc_context->pre_deblocking_output.bo); + mfc_context->pre_deblocking_output.bo = NULL; + + dri_bo_unreference(mfc_context->uncompressed_picture_source.bo); + mfc_context->uncompressed_picture_source.bo = NULL; + + dri_bo_unreference(mfc_context->mfc_indirect_pak_bse_object.bo); + mfc_context->mfc_indirect_pak_bse_object.bo = NULL; + + for (i = 0; i < NUM_MFC_DMV_BUFFERS; i++){ + dri_bo_unreference(mfc_context->direct_mv_buffers[i].bo); + mfc_context->direct_mv_buffers[i].bo = NULL; + } + + dri_bo_unreference(mfc_context->intra_row_store_scratch_buffer.bo); + mfc_context->intra_row_store_scratch_buffer.bo = NULL; + + dri_bo_unreference(mfc_context->deblocking_filter_row_store_scratch_buffer.bo); + mfc_context->deblocking_filter_row_store_scratch_buffer.bo = NULL; + + dri_bo_unreference(mfc_context->bsd_mpc_row_store_scratch_buffer.bo); + mfc_context->bsd_mpc_row_store_scratch_buffer.bo = NULL; + + return True; +} diff --git a/i965_drv_video/gen6_mfc.h b/i965_drv_video/gen6_mfc.h index d41b383..75bcf63 100644 --- a/i965_drv_video/gen6_mfc.h +++ b/i965_drv_video/gen6_mfc.h @@ -26,19 +26,20 @@ * */ -#ifndef _GEN6_MFC_BCS_H_ -#define _GEN6_MFC_BCS_H_ +#ifndef _GEN6_MFC_H_ +#define _GEN6_MFC_H_ #include #include #include #include -struct mfc_encode_state; +struct encode_state; #define MAX_MFC_REFERENCE_SURFACES 16 #define NUM_MFC_DMV_BUFFERS 34 -struct gen6_mfc_bcs_state + +struct gen6_mfc_context { struct { unsigned int width; @@ -94,8 +95,12 @@ struct gen6_mfc_bcs_state }direct_mv_buffers[NUM_MFC_DMV_BUFFERS]; //INTERNAL: 0-31 as input,32 and 33 as output }; -VAStatus gen6_mfc_pipeline(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state); +VAStatus +gen6_mfc_pipeline(VADriverContextP ctx, + VAProfile profile, + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context); +Bool gen6_mfc_context_init(VADriverContextP ctx, struct gen6_mfc_context *mfc_context); +Bool gen6_mfc_context_destroy(struct gen6_mfc_context *mfc_context); #endif /* _GEN6_MFC_BCS_H_ */ diff --git a/i965_drv_video/gen6_mfd.c b/i965_drv_video/gen6_mfd.c index b2f312e..78baaa4 100644 --- a/i965_drv_video/gen6_mfd.c +++ b/i965_drv_video/gen6_mfd.c @@ -55,11 +55,11 @@ static const uint32_t zigzag_direct[64] = { }; static void -gen6_mfd_avc_frame_store_index(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param) +gen6_mfd_avc_frame_store_index(VADriverContextP ctx, + VAPictureParameterBufferH264 *pic_param, + struct gen6_mfd_context *gen6_mfd_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context = (struct gen6_mfd_context *)media_state->private_context; int i, j; assert(ARRAY_ELEMS(gen6_mfd_context->reference_surface) == ARRAY_ELEMS(pic_param->ReferenceFrames)); @@ -239,12 +239,9 @@ gen6_mfd_init_avc_surface(VADriverContextP ctx, static void gen6_mfd_pipe_mode_select(VADriverContextP ctx, struct decode_state *decode_state, - int standard_select) + int standard_select, + struct gen6_mfd_context *gen6_mfd_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context = media_state->private_context; - assert(standard_select == MFX_FORMAT_MPEG2 || standard_select == MFX_FORMAT_AVC || standard_select == MFX_FORMAT_VC1); @@ -308,11 +305,10 @@ gen6_mfd_surface_state(VADriverContextP ctx, static void gen6_mfd_pipe_buf_addr_state(VADriverContextP ctx, struct decode_state *decode_state, - int standard_select) + int standard_select, + struct gen6_mfd_context *gen6_mfd_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context = media_state->private_context; int i; BEGIN_BCS_BATCH(ctx, 24); @@ -391,12 +387,9 @@ gen6_mfd_ind_obj_base_addr_state(VADriverContextP ctx, static void gen6_mfd_bsp_buf_base_addr_state(VADriverContextP ctx, struct decode_state *decode_state, - int standard_select) + int standard_select, + struct gen6_mfd_context *gen6_mfd_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context = media_state->private_context; - BEGIN_BCS_BATCH(ctx, 4); OUT_BCS_BATCH(ctx, MFX_BSP_BUF_BASE_ADDR_STATE | (4 - 2)); @@ -572,11 +565,10 @@ gen6_mfd_avc_qm_state(VADriverContextP ctx, struct decode_state *decode_state) static void gen6_mfd_avc_directmode_state(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, - VASliceParameterBufferH264 *slice_param) + VASliceParameterBufferH264 *slice_param, + struct gen6_mfd_context *gen6_mfd_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context = media_state->private_context; struct object_surface *obj_surface; struct gen6_avc_surface *gen6_avc_surface; VAPictureH264 *va_pic; @@ -783,11 +775,9 @@ gen6_mfd_avc_phantom_slice_state(VADriverContextP ctx, VAPictureParameterBufferH static void gen6_mfd_avc_ref_idx_state(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, - VASliceParameterBufferH264 *slice_param) + VASliceParameterBufferH264 *slice_param, + struct gen6_mfd_context *gen6_mfd_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context = media_state->private_context; int i, j, num_ref_list; struct { unsigned char bottom_idc:1; @@ -984,18 +974,18 @@ gen6_mfd_avc_phantom_slice(VADriverContextP ctx, VAPictureParameterBufferH264 *p } static void -gen6_mfd_avc_decode_init(VADriverContextP ctx, struct decode_state *decode_state) +gen6_mfd_avc_decode_init(VADriverContextP ctx, + struct decode_state *decode_state, + struct gen6_mfd_context *gen6_mfd_context) { VAPictureParameterBufferH264 *pic_param; VASliceParameterBufferH264 *slice_param; VAPictureH264 *va_pic; struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context; struct object_surface *obj_surface; dri_bo *bo; int i, j, enable_avc_ildb = 0; - + for (j = 0; j < decode_state->num_slice_params && enable_avc_ildb == 0; j++) { assert(decode_state->slice_params && decode_state->slice_params[j]->buffer); slice_param = (VASliceParameterBufferH264 *)decode_state->slice_params[j]->buffer; @@ -1020,19 +1010,7 @@ gen6_mfd_avc_decode_init(VADriverContextP ctx, struct decode_state *decode_state assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; - gen6_mfd_context = media_state->private_context; - - if (gen6_mfd_context == NULL) { - gen6_mfd_context = calloc(1, sizeof(struct gen6_mfd_context)); - media_state->private_context = gen6_mfd_context; - - 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_avc_frame_store_index(ctx, pic_param); + gen6_mfd_avc_frame_store_index(ctx, pic_param, gen6_mfd_context); /* Current decoded picture */ va_pic = &pic_param->CurrPic; @@ -1110,7 +1088,9 @@ gen6_mfd_avc_decode_init(VADriverContextP ctx, struct decode_state *decode_state } static void -gen6_mfd_avc_decode_picture(VADriverContextP ctx, struct decode_state *decode_state) +gen6_mfd_avc_decode_picture(VADriverContextP ctx, + struct decode_state *decode_state, + struct gen6_mfd_context *gen6_mfd_context) { VAPictureParameterBufferH264 *pic_param; VASliceParameterBufferH264 *slice_param, *next_slice_param; @@ -1119,14 +1099,14 @@ gen6_mfd_avc_decode_picture(VADriverContextP ctx, struct decode_state *decode_st assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; + gen6_mfd_avc_decode_init(ctx, decode_state, gen6_mfd_context); - gen6_mfd_avc_decode_init(ctx, decode_state); intel_batchbuffer_start_atomic_bcs(ctx, 0x1000); intel_batchbuffer_emit_mi_flush_bcs(ctx); - gen6_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_AVC); + gen6_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_AVC, gen6_mfd_context); gen6_mfd_surface_state(ctx, decode_state, MFX_FORMAT_AVC); - gen6_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_AVC); - gen6_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_AVC); + gen6_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_AVC, gen6_mfd_context); + gen6_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_AVC, gen6_mfd_context); gen6_mfd_avc_img_state(ctx, decode_state); gen6_mfd_avc_qm_state(ctx, decode_state); @@ -1154,9 +1134,9 @@ gen6_mfd_avc_decode_picture(VADriverContextP ctx, struct decode_state *decode_st if (i < decode_state->slice_params[j]->num_elements - 1) next_slice_param = slice_param + 1; - gen6_mfd_avc_directmode_state(ctx, pic_param, slice_param); + gen6_mfd_avc_directmode_state(ctx, pic_param, slice_param, gen6_mfd_context); gen6_mfd_avc_slice_state(ctx, pic_param, slice_param, next_slice_param); - gen6_mfd_avc_ref_idx_state(ctx, pic_param, slice_param); + gen6_mfd_avc_ref_idx_state(ctx, pic_param, slice_param, gen6_mfd_context); gen6_mfd_avc_weightoffset_state(ctx, pic_param, slice_param); gen6_mfd_avc_bsd_object(ctx, pic_param, slice_param, slice_data_bo); slice_param++; @@ -1169,29 +1149,18 @@ gen6_mfd_avc_decode_picture(VADriverContextP ctx, struct decode_state *decode_st } static void -gen6_mfd_mpeg2_decode_init(VADriverContextP ctx, struct decode_state *decode_state) +gen6_mfd_mpeg2_decode_init(VADriverContextP ctx, + struct decode_state *decode_state, + struct gen6_mfd_context *gen6_mfd_context) { VAPictureParameterBufferMPEG2 *pic_param; struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context; struct object_surface *obj_surface; int i; dri_bo *bo; assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferMPEG2 *)decode_state->pic_param->buffer; - gen6_mfd_context = media_state->private_context; - - if (gen6_mfd_context == NULL) { - gen6_mfd_context = calloc(1, sizeof(struct gen6_mfd_context)); - media_state->private_context = gen6_mfd_context; - - 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; - } - } /* reference picture */ obj_surface = SURFACE(pic_param->forward_reference_picture); @@ -1363,7 +1332,9 @@ gen6_mfd_mpeg2_bsd_object(VADriverContextP ctx, } static void -gen6_mfd_mpeg2_decode_picture(VADriverContextP ctx, struct decode_state *decode_state) +gen6_mfd_mpeg2_decode_picture(VADriverContextP ctx, + struct decode_state *decode_state, + struct gen6_mfd_context *gen6_mfd_context) { VAPictureParameterBufferMPEG2 *pic_param; VASliceParameterBufferMPEG2 *slice_param, *next_slice_param; @@ -1373,13 +1344,13 @@ gen6_mfd_mpeg2_decode_picture(VADriverContextP ctx, struct decode_state *decode_ assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferMPEG2 *)decode_state->pic_param->buffer; - gen6_mfd_mpeg2_decode_init(ctx, decode_state); + gen6_mfd_mpeg2_decode_init(ctx, decode_state, gen6_mfd_context); intel_batchbuffer_start_atomic_bcs(ctx, 0x1000); intel_batchbuffer_emit_mi_flush_bcs(ctx); - gen6_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_MPEG2); + gen6_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_MPEG2, gen6_mfd_context); gen6_mfd_surface_state(ctx, decode_state, MFX_FORMAT_MPEG2); - gen6_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_MPEG2); - gen6_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_MPEG2); + gen6_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_MPEG2, gen6_mfd_context); + gen6_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_MPEG2, gen6_mfd_context); gen6_mfd_mpeg2_pic_state(ctx, decode_state); gen6_mfd_mpeg2_qm_state(ctx, decode_state); @@ -1494,29 +1465,18 @@ gen6_mfd_init_vc1_surface(VADriverContextP ctx, } static void -gen6_mfd_vc1_decode_init(VADriverContextP ctx, struct decode_state *decode_state) +gen6_mfd_vc1_decode_init(VADriverContextP ctx, + struct decode_state *decode_state, + struct gen6_mfd_context *gen6_mfd_context) { VAPictureParameterBufferVC1 *pic_param; struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context; struct object_surface *obj_surface; int i; dri_bo *bo; assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer; - gen6_mfd_context = media_state->private_context; - - if (gen6_mfd_context == NULL) { - gen6_mfd_context = calloc(1, sizeof(struct gen6_mfd_context)); - media_state->private_context = gen6_mfd_context; - - 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; - } - } /* reference picture */ obj_surface = SURFACE(pic_param->forward_reference_picture); @@ -1605,8 +1565,7 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx, struct decode_state *decode_state int width_in_mbs = ALIGN(pic_param->coded_width, 16) / 16; int height_in_mbs = ALIGN(pic_param->coded_height, 16) / 16; int bitplane_width = ALIGN(width_in_mbs, 2) / 2; - int bitplane_height = height_in_mbs; - int src_w, src_h, dst_w, dst_h; + int src_w, src_h; uint8_t *src = NULL, *dst = NULL; assert(decode_state->bit_plane->buffer); @@ -2010,7 +1969,9 @@ gen6_mfd_vc1_bsd_object(VADriverContextP ctx, } static void -gen6_mfd_vc1_decode_picture(VADriverContextP ctx, struct decode_state *decode_state) +gen6_mfd_vc1_decode_picture(VADriverContextP ctx, + struct decode_state *decode_state, + struct gen6_mfd_context *gen6_mfd_context) { VAPictureParameterBufferVC1 *pic_param; VASliceParameterBufferVC1 *slice_param, *next_slice_param; @@ -2020,13 +1981,13 @@ gen6_mfd_vc1_decode_picture(VADriverContextP ctx, struct decode_state *decode_st assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer; - gen6_mfd_vc1_decode_init(ctx, decode_state); + gen6_mfd_vc1_decode_init(ctx, decode_state, gen6_mfd_context); intel_batchbuffer_start_atomic_bcs(ctx, 0x1000); intel_batchbuffer_emit_mi_flush_bcs(ctx); - gen6_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_VC1); + gen6_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_VC1, gen6_mfd_context); gen6_mfd_surface_state(ctx, decode_state, MFX_FORMAT_VC1); - gen6_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_VC1); - gen6_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_VC1); + gen6_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_VC1, gen6_mfd_context); + gen6_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_VC1, gen6_mfd_context); gen6_mfd_vc1_pic_state(ctx, decode_state); gen6_mfd_vc1_pred_pipe_state(ctx, decode_state); gen6_mfd_vc1_directmode_state(ctx, decode_state); @@ -2055,27 +2016,34 @@ gen6_mfd_vc1_decode_picture(VADriverContextP ctx, struct decode_state *decode_st intel_batchbuffer_flush_bcs(ctx); } -void +static void gen6_mfd_decode_picture(VADriverContextP ctx, VAProfile profile, - struct decode_state *decode_state) + union codec_state *codec_state, + struct hw_context *hw_context) + { + struct gen6_mfd_context *gen6_mfd_context = (struct gen6_mfd_context *)hw_context; + struct decode_state *decode_state = &codec_state->dec; + + assert(gen6_mfd_context); + switch (profile) { case VAProfileMPEG2Simple: case VAProfileMPEG2Main: - gen6_mfd_mpeg2_decode_picture(ctx, decode_state); + gen6_mfd_mpeg2_decode_picture(ctx, decode_state, gen6_mfd_context); break; case VAProfileH264Baseline: case VAProfileH264Main: case VAProfileH264High: - gen6_mfd_avc_decode_picture(ctx, decode_state); + gen6_mfd_avc_decode_picture(ctx, decode_state, gen6_mfd_context); break; case VAProfileVC1Simple: case VAProfileVC1Main: case VAProfileVC1Advanced: - gen6_mfd_vc1_decode_picture(ctx, decode_state); + gen6_mfd_vc1_decode_picture(ctx, decode_state, gen6_mfd_context); break; default: @@ -2084,45 +2052,48 @@ gen6_mfd_decode_picture(VADriverContextP ctx, } } -Bool -gen6_mfd_init(VADriverContextP ctx) +static void +gen6_mfd_context_destroy(void *hw_context) { - return True; -} + struct gen6_mfd_context *gen6_mfd_context = (struct gen6_mfd_context *)hw_context; -Bool -gen6_mfd_terminate(VADriverContextP ctx) -{ - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct gen6_mfd_context *gen6_mfd_context = media_state->private_context; + dri_bo_unreference(gen6_mfd_context->post_deblocking_output.bo); + gen6_mfd_context->post_deblocking_output.bo = NULL; + + dri_bo_unreference(gen6_mfd_context->pre_deblocking_output.bo); + gen6_mfd_context->pre_deblocking_output.bo = NULL; + + dri_bo_unreference(gen6_mfd_context->intra_row_store_scratch_buffer.bo); + gen6_mfd_context->intra_row_store_scratch_buffer.bo = NULL; - if (gen6_mfd_context) { - dri_bo_unreference(gen6_mfd_context->post_deblocking_output.bo); - gen6_mfd_context->post_deblocking_output.bo = NULL; + dri_bo_unreference(gen6_mfd_context->deblocking_filter_row_store_scratch_buffer.bo); + gen6_mfd_context->deblocking_filter_row_store_scratch_buffer.bo = NULL; - dri_bo_unreference(gen6_mfd_context->pre_deblocking_output.bo); - gen6_mfd_context->pre_deblocking_output.bo = NULL; + dri_bo_unreference(gen6_mfd_context->bsd_mpc_row_store_scratch_buffer.bo); + gen6_mfd_context->bsd_mpc_row_store_scratch_buffer.bo = NULL; - dri_bo_unreference(gen6_mfd_context->intra_row_store_scratch_buffer.bo); - gen6_mfd_context->intra_row_store_scratch_buffer.bo = NULL; + dri_bo_unreference(gen6_mfd_context->mpr_row_store_scratch_buffer.bo); + gen6_mfd_context->mpr_row_store_scratch_buffer.bo = NULL; - dri_bo_unreference(gen6_mfd_context->deblocking_filter_row_store_scratch_buffer.bo); - gen6_mfd_context->deblocking_filter_row_store_scratch_buffer.bo = NULL; + dri_bo_unreference(gen6_mfd_context->bitplane_read_buffer.bo); + gen6_mfd_context->bitplane_read_buffer.bo = NULL; - dri_bo_unreference(gen6_mfd_context->bsd_mpc_row_store_scratch_buffer.bo); - gen6_mfd_context->bsd_mpc_row_store_scratch_buffer.bo = NULL; + free(gen6_mfd_context); +} - dri_bo_unreference(gen6_mfd_context->mpr_row_store_scratch_buffer.bo); - gen6_mfd_context->mpr_row_store_scratch_buffer.bo = NULL; +struct hw_context * +gen6_dec_hw_context_init(VADriverContextP ctx, VAProfile profile) +{ + struct gen6_mfd_context *gen6_mfd_context = calloc(1, sizeof(struct gen6_mfd_context)); + int i; - dri_bo_unreference(gen6_mfd_context->bitplane_read_buffer.bo); - gen6_mfd_context->bitplane_read_buffer.bo = NULL; + gen6_mfd_context->base.destroy = gen6_mfd_context_destroy; + gen6_mfd_context->base.run = gen6_mfd_decode_picture; - free(gen6_mfd_context); + 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; } - - media_state->private_context = NULL; - return True; + + return (struct hw_context *)gen6_mfd_context; } - diff --git a/i965_drv_video/gen6_mfd.h b/i965_drv_video/gen6_mfd.h index a39137e..31f7957 100644 --- a/i965_drv_video/gen6_mfd.h +++ b/i965_drv_video/gen6_mfd.h @@ -59,8 +59,12 @@ struct gen6_vc1_surface }; #define MAX_MFX_REFERENCE_SURFACES 16 +struct hw_context; + struct gen6_mfd_context { + struct hw_context base; + struct { VASurfaceID surface_id; int frame_store_id; @@ -102,11 +106,4 @@ struct gen6_mfd_context } bitplane_read_buffer; }; -struct decode_state; - -Bool gen6_mfd_init(VADriverContextP ctx); -Bool gen6_mfd_terminate(VADriverContextP ctx); -void gen6_mfd_decode_picture(VADriverContextP ctx, - VAProfile profile, - struct decode_state *decode_state); #endif /* _GEN6_MFD_H_ */ diff --git a/i965_drv_video/gen6_vme.c b/i965_drv_video/gen6_vme.c index ccf26bc..ff00a43 100644 --- a/i965_drv_video/gen6_vme.c +++ b/i965_drv_video/gen6_vme.c @@ -38,6 +38,7 @@ #include "i965_defines.h" #include "i965_drv_video.h" #include "gen6_vme.h" +#include "i965_encoder.h" #define VME_INTRA_SHADER 0 #define VME_INTER_SHADER 1 @@ -116,10 +117,11 @@ gen6_vme_set_source_surface_tiling(struct i965_surface_state2 *ss, unsigned int /* only used for VME source surface state */ static void gen6_vme_source_surface_state(VADriverContextP ctx, int index, - struct object_surface *obj_surface) + struct object_surface *obj_surface, + struct gen6_encoder_context *gen6_encoder_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; struct i965_surface_state2 *ss; dri_bo *bo; int w, h, w_pitch, h_pitch; @@ -169,16 +171,17 @@ static void gen6_vme_source_surface_state(VADriverContextP ctx, obj_surface->bo); assert(index < MAX_MEDIA_SURFACES_GEN6); - media_state->surface_state[index].bo = bo; + vme_context->surface_state[index].bo = bo; } static void gen6_vme_media_source_surface_state(VADriverContextP ctx, int index, - struct object_surface *obj_surface) + struct object_surface *obj_surface, + struct gen6_encoder_context *gen6_encoder_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; struct i965_surface_state *ss; dri_bo *bo; int w, h, w_pitch; @@ -216,40 +219,40 @@ gen6_vme_media_source_surface_state(VADriverContextP ctx, dri_bo_unmap(bo); assert(index < MAX_MEDIA_SURFACES_GEN6); - media_state->surface_state[index].bo = bo; + vme_context->surface_state[index].bo = bo; } static VAStatus gen6_vme_output_buffer_setup(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state, - int index) + struct encode_state *encode_state, + int index, + struct gen6_encoder_context *gen6_encoder_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; - struct object_context *obj_context = CONTEXT(context); + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; struct i965_surface_state *ss; dri_bo *bo; - int width_in_mbs = ALIGN(obj_context->picture_width, 16) / 16; - int height_in_mbs = ALIGN(obj_context->picture_height, 16) / 16; - int num_entries; + VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param->buffer; VAEncSliceParameterBuffer *pSliceParameter = (VAEncSliceParameterBuffer *)encode_state->slice_params[0]->buffer; int is_intra = pSliceParameter->slice_flags.bits.is_intra; + int width_in_mbs = pSequenceParameter->picture_width_in_mbs; + int height_in_mbs = pSequenceParameter->picture_height_in_mbs; + int num_entries; if ( is_intra ) { - media_state->vme_output.num_blocks = width_in_mbs * height_in_mbs; + vme_context->vme_output.num_blocks = width_in_mbs * height_in_mbs; } else { - media_state->vme_output.num_blocks = width_in_mbs * height_in_mbs * 4; + vme_context->vme_output.num_blocks = width_in_mbs * height_in_mbs * 4; } - media_state->vme_output.size_block = 16; /* an OWORD */ - media_state->vme_output.pitch = ALIGN(media_state->vme_output.size_block, 16); + vme_context->vme_output.size_block = 16; /* an OWORD */ + vme_context->vme_output.pitch = ALIGN(vme_context->vme_output.size_block, 16); bo = dri_bo_alloc(i965->intel.bufmgr, "VME output buffer", - media_state->vme_output.num_blocks * media_state->vme_output.pitch, + vme_context->vme_output.num_blocks * vme_context->vme_output.pitch, 0x1000); assert(bo); - media_state->vme_output.bo = bo; + vme_context->vme_output.bo = bo; bo = dri_bo_alloc(i965->intel.bufmgr, "VME output buffer state", @@ -262,37 +265,37 @@ gen6_vme_output_buffer_setup(VADriverContextP ctx, memset(ss, 0, sizeof(*ss)); /* always use 16 bytes as pitch on Sandy Bridge */ - num_entries = media_state->vme_output.num_blocks * media_state->vme_output.pitch / 16; + num_entries = vme_context->vme_output.num_blocks * vme_context->vme_output.pitch / 16; ss->ss0.render_cache_read_mode = 1; ss->ss0.surface_type = I965_SURFACE_BUFFER; - ss->ss1.base_addr = media_state->vme_output.bo->offset; + ss->ss1.base_addr = vme_context->vme_output.bo->offset; ss->ss2.width = ((num_entries - 1) & 0x7f); ss->ss2.height = (((num_entries - 1) >> 7) & 0x1fff); ss->ss3.depth = (((num_entries - 1) >> 20) & 0x7f); - ss->ss3.pitch = media_state->vme_output.pitch - 1; + ss->ss3.pitch = vme_context->vme_output.pitch - 1; dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0, offsetof(struct i965_surface_state, ss1), - media_state->vme_output.bo); + vme_context->vme_output.bo); dri_bo_unmap(bo); assert(index < MAX_MEDIA_SURFACES_GEN6); - media_state->surface_state[index].bo = bo; + vme_context->surface_state[index].bo = bo; return VA_STATUS_SUCCESS; } static VAStatus gen6_vme_surface_setup(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state, - int is_intra) + struct encode_state *encode_state, + int is_intra, + struct gen6_encoder_context *gen6_encoder_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; struct object_surface *obj_surface; unsigned int *binding_table; - dri_bo *bo = media_state->binding_table.bo; + dri_bo *bo = vme_context->binding_table.bo; int i; VAEncPictureParameterBufferH264 *pPicParameter = (VAEncPictureParameterBufferH264 *)encode_state->pic_param->buffer; @@ -300,14 +303,14 @@ static VAStatus gen6_vme_surface_setup(VADriverContextP ctx, /* current picture for encoding */ obj_surface = SURFACE(encode_state->current_render_target); assert(obj_surface); - gen6_vme_source_surface_state(ctx, 0, obj_surface); - gen6_vme_media_source_surface_state(ctx, 4, obj_surface); + gen6_vme_source_surface_state(ctx, 0, obj_surface, gen6_encoder_context); + gen6_vme_media_source_surface_state(ctx, 4, obj_surface, gen6_encoder_context); if ( ! is_intra ) { /* reference 0 */ obj_surface = SURFACE(pPicParameter->reference_picture); assert(obj_surface); - gen6_vme_source_surface_state(ctx, 1, obj_surface); + gen6_vme_source_surface_state(ctx, 1, obj_surface, gen6_encoder_context); /* reference 1, FIXME: */ // obj_surface = SURFACE(pPicParameter->reference_picture); // assert(obj_surface); @@ -315,7 +318,7 @@ static VAStatus gen6_vme_surface_setup(VADriverContextP ctx, } /* VME output */ - gen6_vme_output_buffer_setup(ctx, context, encode_state, 3); + gen6_vme_output_buffer_setup(ctx, encode_state, 3, gen6_encoder_context); /*Building binding table*/ dri_bo_map(bo, 1); @@ -324,32 +327,31 @@ static VAStatus gen6_vme_surface_setup(VADriverContextP ctx, memset(binding_table, 0, bo->size); for (i = 0; i < MAX_MEDIA_SURFACES_GEN6; i++) { - if (media_state->surface_state[i].bo) { - binding_table[i] = media_state->surface_state[i].bo->offset; + if (vme_context->surface_state[i].bo) { + binding_table[i] = vme_context->surface_state[i].bo->offset; dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0, i * sizeof(*binding_table), - media_state->surface_state[i].bo); + vme_context->surface_state[i].bo); } } - dri_bo_unmap(media_state->binding_table.bo); + dri_bo_unmap(vme_context->binding_table.bo); return VA_STATUS_SUCCESS; } static VAStatus gen6_vme_interface_setup(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; struct gen6_interface_descriptor_data *desc; int i; dri_bo *bo; - bo = media_state->idrt.bo; + bo = vme_context->idrt.bo; dri_bo_map(bo, 1); assert(bo->virtual); desc = bo->virtual; @@ -362,9 +364,9 @@ static VAStatus gen6_vme_interface_setup(VADriverContextP ctx, memset(desc, 0, sizeof(*desc)); desc->desc0.kernel_start_pointer = (kernel->bo->offset >> 6); desc->desc2.sampler_count = 1; /* FIXME: */ - desc->desc2.sampler_state_pointer = (media_state->vme_state.bo->offset >> 5); + desc->desc2.sampler_state_pointer = (vme_context->vme_state.bo->offset >> 5); desc->desc3.binding_table_entry_count = 1; /* FIXME: */ - desc->desc3.binding_table_pointer = (media_state->binding_table.bo->offset >> 5); + desc->desc3.binding_table_pointer = (vme_context->binding_table.bo->offset >> 5); desc->desc4.constant_urb_entry_read_offset = 0; desc->desc4.constant_urb_entry_read_length = CURBE_URB_ENTRY_LENGTH; @@ -379,13 +381,13 @@ static VAStatus gen6_vme_interface_setup(VADriverContextP ctx, I915_GEM_DOMAIN_INSTRUCTION, 0, (1 << 2), // i * sizeof(*desc) + offsetof(struct gen6_interface_descriptor_data, desc2), - media_state->vme_state.bo); + vme_context->vme_state.bo); /*binding table*/ dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 4, //One Entry i * sizeof(*desc) + offsetof(struct gen6_interface_descriptor_data, desc3), - media_state->binding_table.bo); + vme_context->binding_table.bo); desc++; } dri_bo_unmap(bo); @@ -394,42 +396,43 @@ static VAStatus gen6_vme_interface_setup(VADriverContextP ctx, } static VAStatus gen6_vme_constant_setup(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; unsigned char *constant_buffer; - dri_bo_map(media_state->curbe.bo, 1); - assert(media_state->curbe.bo->virtual); - constant_buffer = media_state->curbe.bo->virtual; + dri_bo_map(vme_context->curbe.bo, 1); + assert(vme_context->curbe.bo->virtual); + constant_buffer = vme_context->curbe.bo->virtual; /*TODO copy buffer into CURB*/ - dri_bo_unmap( media_state->curbe.bo); + dri_bo_unmap( vme_context->curbe.bo); return VA_STATUS_SUCCESS; } -static VAStatus gen6_vme_vme_state_setup(VADriverContextP ctx, VAContextID context, struct mfc_encode_state *encode_state, int is_intra) +static VAStatus gen6_vme_vme_state_setup(VADriverContextP ctx, + struct encode_state *encode_state, + int is_intra, + struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; unsigned int *vme_state_message; int i; //building VME state message - dri_bo_map(media_state->vme_state.bo, 1); - assert(media_state->vme_state.bo->virtual); - vme_state_message = (unsigned int *)media_state->vme_state.bo->virtual; + dri_bo_map(vme_context->vme_state.bo, 1); + assert(vme_context->vme_state.bo->virtual); + vme_state_message = (unsigned int *)vme_context->vme_state.bo->virtual; for(i = 0;i < 32; i++) { vme_state_message[i] = 0x11; } vme_state_message[16] = 0x42424242; //cost function LUT set 0 for Intra - dri_bo_unmap( media_state->vme_state.bo); + dri_bo_unmap( vme_context->vme_state.bo); return VA_STATUS_SUCCESS; } @@ -465,21 +468,20 @@ static void gen6_vme_state_base_address(VADriverContextP ctx) ADVANCE_BATCH(ctx); } -static void gen6_vme_vfe_state(VADriverContextP ctx) +static void gen6_vme_vfe_state(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; BEGIN_BATCH(ctx, 8); OUT_BATCH(ctx, CMD_MEDIA_VFE_STATE | 6); /*Gen6 CMD_MEDIA_STATE_POINTERS = CMD_MEDIA_STATE */ OUT_BATCH(ctx, 0); /*Scratch Space Base Pointer and Space*/ - OUT_BATCH(ctx, (media_state->vfe_state.max_num_threads << 16) - | (media_state->vfe_state.num_urb_entries << 8) - | (media_state->vfe_state.gpgpu_mode << 2) ); /*Maximum Number of Threads , Number of URB Entries, MEDIA Mode*/ + OUT_BATCH(ctx, (vme_context->vfe_state.max_num_threads << 16) + | (vme_context->vfe_state.num_urb_entries << 8) + | (vme_context->vfe_state.gpgpu_mode << 2) ); /*Maximum Number of Threads , Number of URB Entries, MEDIA Mode*/ OUT_BATCH(ctx, 0); /*Debug: Object ID*/ - OUT_BATCH(ctx, (media_state->vfe_state.urb_entry_size << 16) - | media_state->vfe_state.curbe_allocation_size); /*URB Entry Allocation Size , CURBE Allocation Size*/ + OUT_BATCH(ctx, (vme_context->vfe_state.urb_entry_size << 16) + | vme_context->vfe_state.curbe_allocation_size); /*URB Entry Allocation Size , CURBE Allocation Size*/ OUT_BATCH(ctx, 0); /*Disable Scoreboard*/ OUT_BATCH(ctx, 0); /*Disable Scoreboard*/ OUT_BATCH(ctx, 0); /*Disable Scoreboard*/ @@ -488,10 +490,9 @@ static void gen6_vme_vfe_state(VADriverContextP ctx) } -static void gen6_vme_curbe_load(VADriverContextP ctx) +static void gen6_vme_curbe_load(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; BEGIN_BATCH(ctx, 4); @@ -499,34 +500,32 @@ static void gen6_vme_curbe_load(VADriverContextP ctx) OUT_BATCH(ctx, 0); OUT_BATCH(ctx, CURBE_TOTAL_DATA_LENGTH); - OUT_RELOC(ctx, media_state->curbe.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + OUT_RELOC(ctx, vme_context->curbe.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); ADVANCE_BATCH(ctx); } -static void gen6_vme_idrt(VADriverContextP ctx) +static void gen6_vme_idrt(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; BEGIN_BATCH(ctx, 4); OUT_BATCH(ctx, CMD_MEDIA_INTERFACE_LOAD | 2); OUT_BATCH(ctx, 0); OUT_BATCH(ctx, GEN6_VME_KERNEL_NUMBER * sizeof(struct gen6_interface_descriptor_data)); - OUT_RELOC(ctx, media_state->idrt.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + OUT_RELOC(ctx, vme_context->idrt.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); ADVANCE_BATCH(ctx); } static int gen6_vme_media_object(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state, + struct encode_state *encode_state, int mb_x, int mb_y, int kernel) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct object_surface *obj_surface = SURFACE( encode_state->current_render_target); + struct object_surface *obj_surface = SURFACE(encode_state->current_render_target); int mb_width = ALIGN(obj_surface->orig_width, 16) / 16; int len_in_dowrds = 6 + 1; @@ -546,74 +545,73 @@ static int gen6_vme_media_object(VADriverContextP ctx, return len_in_dowrds * 4; } -static void gen6_vme_media_init(VADriverContextP ctx) +static void gen6_vme_media_init(VADriverContextP ctx, struct gen6_encoder_context *gen6_encoder_context) { int i; struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; + struct gen6_vme_context *vme_context = &gen6_encoder_context->vme_context; dri_bo *bo; /* constant buffer */ - dri_bo_unreference(media_state->curbe.bo); + dri_bo_unreference(vme_context->curbe.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "Buffer", CURBE_TOTAL_DATA_LENGTH, 64); assert(bo); - media_state->curbe.bo = bo; + vme_context->curbe.bo = bo; /* surface state */ for (i = 0; i < MAX_MEDIA_SURFACES_GEN6; i++) { - dri_bo_unreference(media_state->surface_state[i].bo); - media_state->surface_state[i].bo = NULL; + dri_bo_unreference(vme_context->surface_state[i].bo); + vme_context->surface_state[i].bo = NULL; } /* binding table */ - dri_bo_unreference(media_state->binding_table.bo); + dri_bo_unreference(vme_context->binding_table.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "Buffer", MAX_MEDIA_SURFACES_GEN6 * sizeof(unsigned int), 32); assert(bo); - media_state->binding_table.bo = bo; + vme_context->binding_table.bo = bo; /* interface descriptor remapping table */ - dri_bo_unreference(media_state->idrt.bo); + dri_bo_unreference(vme_context->idrt.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "Buffer", MAX_INTERFACE_DESC_GEN6 * sizeof(struct gen6_interface_descriptor_data), 16); assert(bo); - media_state->idrt.bo = bo; + vme_context->idrt.bo = bo; /* VME output buffer */ - dri_bo_unreference(media_state->vme_output.bo); - media_state->vme_output.bo = NULL; + dri_bo_unreference(vme_context->vme_output.bo); + vme_context->vme_output.bo = NULL; /* VME state */ - dri_bo_unreference(media_state->vme_state.bo); + dri_bo_unreference(vme_context->vme_state.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "Buffer", 1024*16, 64); assert(bo); - media_state->vme_state.bo = bo; + vme_context->vme_state.bo = bo; - media_state->vfe_state.max_num_threads = 60 - 1; - media_state->vfe_state.num_urb_entries = 16; - media_state->vfe_state.gpgpu_mode = 0; - media_state->vfe_state.urb_entry_size = 59 - 1; - media_state->vfe_state.curbe_allocation_size = CURBE_ALLOCATION_SIZE - 1; + vme_context->vfe_state.max_num_threads = 60 - 1; + vme_context->vfe_state.num_urb_entries = 16; + vme_context->vfe_state.gpgpu_mode = 0; + vme_context->vfe_state.urb_entry_size = 59 - 1; + vme_context->vfe_state.curbe_allocation_size = CURBE_ALLOCATION_SIZE - 1; } static void gen6_vme_pipeline_programing(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct object_context *obj_context = CONTEXT(context); - int width_in_mbs = (obj_context->picture_width + 15) / 16; - int height_in_mbs = (obj_context->picture_height + 15) / 16; - int x, y; - int emit_new_state = 1, object_len_in_bytes; VAEncSliceParameterBuffer *pSliceParameter = (VAEncSliceParameterBuffer *)encode_state->slice_params[0]->buffer; + VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param->buffer; int is_intra = pSliceParameter->slice_flags.bits.is_intra; + int width_in_mbs = pSequenceParameter->picture_width_in_mbs; + int height_in_mbs = pSequenceParameter->picture_height_in_mbs; + int emit_new_state = 1, object_len_in_bytes; + int x, y; intel_batchbuffer_start_atomic(ctx, 0x1000); @@ -634,15 +632,15 @@ static void gen6_vme_pipeline_programing(VADriverContextP ctx, /*Step3: State commands configuring pipeline states*/ gen6_vme_state_base_address(ctx); - gen6_vme_vfe_state(ctx); - gen6_vme_curbe_load(ctx); - gen6_vme_idrt(ctx); + gen6_vme_vfe_state(ctx, gen6_encoder_context); + gen6_vme_curbe_load(ctx, gen6_encoder_context); + gen6_vme_idrt(ctx, gen6_encoder_context); emit_new_state = 0; } /*Step4: Primitive commands*/ - object_len_in_bytes = gen6_vme_media_object(ctx, context, encode_state, x, y, is_intra ? VME_INTRA_SHADER : VME_INTER_SHADER); + object_len_in_bytes = gen6_vme_media_object(ctx, encode_state, x, y, is_intra ? VME_INTRA_SHADER : VME_INTER_SHADER); if (intel_batchbuffer_check_free_space(ctx, object_len_in_bytes) == 0) { intel_batchbuffer_end_atomic(ctx); @@ -657,28 +655,28 @@ static void gen6_vme_pipeline_programing(VADriverContextP ctx, } static VAStatus gen6_vme_prepare(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { VAStatus vaStatus = VA_STATUS_SUCCESS; VAEncSliceParameterBuffer *pSliceParameter = (VAEncSliceParameterBuffer *)encode_state->slice_params[0]->buffer; int is_intra = pSliceParameter->slice_flags.bits.is_intra; /*Setup all the memory object*/ - gen6_vme_surface_setup(ctx, context, encode_state, is_intra); - gen6_vme_interface_setup(ctx, context, encode_state); - gen6_vme_constant_setup(ctx, context, encode_state); - gen6_vme_vme_state_setup(ctx, context, encode_state, is_intra); + gen6_vme_surface_setup(ctx, encode_state, is_intra, gen6_encoder_context); + gen6_vme_interface_setup(ctx, encode_state, gen6_encoder_context); + gen6_vme_constant_setup(ctx, encode_state, gen6_encoder_context); + gen6_vme_vme_state_setup(ctx, encode_state, is_intra, gen6_encoder_context); /*Programing media pipeline*/ - gen6_vme_pipeline_programing(ctx, context, encode_state); + gen6_vme_pipeline_programing(ctx, encode_state, gen6_encoder_context); return vaStatus; } static VAStatus gen6_vme_run(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { intel_batchbuffer_flush(ctx); @@ -686,25 +684,26 @@ static VAStatus gen6_vme_run(VADriverContextP ctx, } static VAStatus gen6_vme_stop(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { return VA_STATUS_SUCCESS; } -VAStatus gen6_vme_media_pipeline(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) +VAStatus gen6_vme_pipeline(VADriverContextP ctx, + VAProfile profile, + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context) { - gen6_vme_media_init(ctx); - gen6_vme_prepare(ctx, context, encode_state); - gen6_vme_run(ctx, context, encode_state); - gen6_vme_stop(ctx, context, encode_state); + gen6_vme_media_init(ctx, gen6_encoder_context); + gen6_vme_prepare(ctx, encode_state, gen6_encoder_context); + gen6_vme_run(ctx, encode_state, gen6_encoder_context); + gen6_vme_stop(ctx, encode_state, gen6_encoder_context); return VA_STATUS_SUCCESS; } -Bool gen6_vme_init(VADriverContextP ctx) +Bool gen6_vme_context_init(VADriverContextP ctx, struct gen6_vme_context *vme_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); int i; @@ -724,10 +723,30 @@ Bool gen6_vme_init(VADriverContextP ctx) return True; } -Bool gen6_vme_terminate(VADriverContextP ctx) +Bool gen6_vme_context_destroy(struct gen6_vme_context *vme_context) { int i; + for (i = 0; i < MAX_MEDIA_SURFACES_GEN6; i++) { + dri_bo_unreference(vme_context->surface_state[i].bo); + vme_context->surface_state[i].bo = NULL; + } + + dri_bo_unreference(vme_context->idrt.bo); + vme_context->idrt.bo = NULL; + + dri_bo_unreference(vme_context->binding_table.bo); + vme_context->binding_table.bo = NULL; + + dri_bo_unreference(vme_context->curbe.bo); + vme_context->curbe.bo = NULL; + + dri_bo_unreference(vme_context->vme_output.bo); + vme_context->vme_output.bo = NULL; + + dri_bo_unreference(vme_context->vme_state.bo); + vme_context->vme_state.bo = NULL; + for (i = 0; i < GEN6_VME_KERNEL_NUMBER; i++) { /*Load kernel into GPU memory*/ struct media_kernel *kernel = &gen6_vme_kernels[i]; diff --git a/i965_drv_video/gen6_vme.h b/i965_drv_video/gen6_vme.h index 57b23f1..a63bc18 100644 --- a/i965_drv_video/gen6_vme.h +++ b/i965_drv_video/gen6_vme.h @@ -26,8 +26,8 @@ * */ -#ifndef _GEN6_MEDIA_H_ -#define _GEN6_MEDIA_H_ +#ifndef _GEN6_VME_H_ +#define _GEN6_VME_H_ #include #include @@ -38,9 +38,10 @@ #define MAX_INTERFACE_DESC_GEN6 32 #define MAX_MEDIA_SURFACES_GEN6 34 -struct mfc_encode_state; +struct encode_state; +struct gen6_encoder_context; -struct gen6_media_state +struct gen6_vme_context { struct { dri_bo *bo; @@ -78,10 +79,11 @@ struct gen6_media_state } vme_output; }; -VAStatus gen6_vme_media_pipeline(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state); -Bool gen6_vme_init(VADriverContextP ctx); -Bool gen6_vme_terminate(VADriverContextP ctx); +VAStatus gen6_vme_pipeline(VADriverContextP ctx, + VAProfile profile, + struct encode_state *encode_state, + struct gen6_encoder_context *gen6_encoder_context); +Bool gen6_vme_context_init(VADriverContextP ctx, struct gen6_vme_context *vme_context); +Bool gen6_vme_context_destroy(struct gen6_vme_context *vme_context); -#endif /* _GEN6_MEDIA_H_ */ +#endif /* _GEN6_VME_H_ */ diff --git a/i965_drv_video/i965_avc_bsd.c b/i965_drv_video/i965_avc_bsd.c index 89bd169..41fb8fc 100644 --- a/i965_drv_video/i965_avc_bsd.c +++ b/i965_drv_video/i965_avc_bsd.c @@ -61,11 +61,10 @@ i965_avc_bsd_free_avc_bsd_surface(void **data) static void i965_avc_bsd_init_avc_bsd_surface(VADriverContextP ctx, struct object_surface *obj_surface, - VAPictureParameterBufferH264 *pic_param) + VAPictureParameterBufferH264 *pic_param, + struct i965_h264_context *i965_h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_bsd_context *i965_avc_bsd_context = &i965_h264_context->i965_avc_bsd_context; struct i965_avc_bsd_surface *avc_bsd_surface = obj_surface->private_data; @@ -112,11 +111,10 @@ i965_bsd_ind_obj_base_address(VADriverContextP ctx, struct decode_state *decode_ } static void -i965_avc_bsd_img_state(VADriverContextP ctx, struct decode_state *decode_state) +i965_avc_bsd_img_state(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; int qm_present_flag; int img_struct; int mbaff_frame_flag; @@ -248,11 +246,9 @@ i965_avc_bsd_qm_state(VADriverContextP ctx, struct decode_state *decode_state) static void i965_avc_bsd_slice_state(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, - VASliceParameterBufferH264 *slice_param) + VASliceParameterBufferH264 *slice_param, + struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; int present_flag, cmd_len, list, j; struct { unsigned char bottom_idc:1; @@ -420,19 +416,16 @@ i965_avc_bsd_slice_state(VADriverContextP ctx, static void i965_avc_bsd_buf_base_state(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, - VASliceParameterBufferH264 *slice_param) + VASliceParameterBufferH264 *slice_param, + struct i965_h264_context *i965_h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context; struct i965_avc_bsd_context *i965_avc_bsd_context; int i, j; VAPictureH264 *va_pic; struct object_surface *obj_surface; struct i965_avc_bsd_surface *avc_bsd_surface; - assert(media_state->private_context); - i965_h264_context = (struct i965_h264_context *)media_state->private_context; i965_avc_bsd_context = &i965_h264_context->i965_avc_bsd_context; BEGIN_BCS_BATCH(ctx, 74); @@ -509,7 +502,7 @@ i965_avc_bsd_buf_base_state(VADriverContextP ctx, assert(obj_surface); obj_surface->flags &= ~SURFACE_REF_DIS_MASK; obj_surface->flags |= (pic_param->pic_fields.bits.reference_pic_flag ? SURFACE_REFERENCED : 0); - i965_avc_bsd_init_avc_bsd_surface(ctx, obj_surface, pic_param); + i965_avc_bsd_init_avc_bsd_surface(ctx, obj_surface, pic_param, i965_h264_context); avc_bsd_surface = obj_surface->private_data; if (obj_surface->bo == NULL) { @@ -601,7 +594,8 @@ g4x_avc_bsd_object(VADriverContextP ctx, struct decode_state *decode_state, VAPictureParameterBufferH264 *pic_param, VASliceParameterBufferH264 *slice_param, - int slice_index) + int slice_index, + struct i965_h264_context *i965_h264_context) { int width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1; int height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; /* frame height */ @@ -728,15 +722,13 @@ ironlake_avc_bsd_object(VADriverContextP ctx, struct decode_state *decode_state, VAPictureParameterBufferH264 *pic_param, VASliceParameterBufferH264 *slice_param, - int slice_index) + int slice_index, + struct i965_h264_context *i965_h264_context) { int width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1; int height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; /* frame height */ if (slice_param) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; int encrypted, counter_value; int slice_hor_pos, slice_ver_pos; int num_ref_idx_l0, num_ref_idx_l1; @@ -873,31 +865,32 @@ i965_avc_bsd_object(VADriverContextP ctx, struct decode_state *decode_state, VAPictureParameterBufferH264 *pic_param, VASliceParameterBufferH264 *slice_param, - int slice_index) + int slice_index, + struct i965_h264_context *i965_h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); if (IS_IRONLAKE(i965->intel.device_id)) - ironlake_avc_bsd_object(ctx, decode_state, pic_param, slice_param, slice_index); + ironlake_avc_bsd_object(ctx, decode_state, pic_param, slice_param, slice_index, i965_h264_context); else - g4x_avc_bsd_object(ctx, decode_state, pic_param, slice_param, slice_index); + g4x_avc_bsd_object(ctx, decode_state, pic_param, slice_param, slice_index, i965_h264_context); } static void i965_avc_bsd_phantom_slice(VADriverContextP ctx, struct decode_state *decode_state, - VAPictureParameterBufferH264 *pic_param) + VAPictureParameterBufferH264 *pic_param, + struct i965_h264_context *i965_h264_context) { - i965_avc_bsd_object(ctx, decode_state, pic_param, NULL, 0); + i965_avc_bsd_object(ctx, decode_state, pic_param, NULL, 0, i965_h264_context); } static void i965_avc_bsd_frame_store_index(VADriverContextP ctx, - VAPictureParameterBufferH264 *pic_param) + VAPictureParameterBufferH264 *pic_param, + struct i965_h264_context *i965_h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; int i, j; assert(ARRAY_ELEMS(i965_h264_context->fsid_list) == ARRAY_ELEMS(pic_param->ReferenceFrames)); @@ -1015,18 +1008,16 @@ i965_avc_bsd_frame_store_index(VADriverContextP ctx, } void -i965_avc_bsd_pipeline(VADriverContextP ctx, struct decode_state *decode_state) +i965_avc_bsd_pipeline(VADriverContextP ctx, struct decode_state *decode_state, void *h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; + struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)h264_context; VAPictureParameterBufferH264 *pic_param; VASliceParameterBufferH264 *slice_param; int i, j; assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; - i965_avc_bsd_frame_store_index(ctx, pic_param); + i965_avc_bsd_frame_store_index(ctx, pic_param, i965_h264_context); i965_h264_context->enable_avc_ildb = 0; i965_h264_context->picture.i_flag = 1; @@ -1055,7 +1046,7 @@ i965_avc_bsd_pipeline(VADriverContextP ctx, struct decode_state *decode_state) intel_batchbuffer_start_atomic_bcs(ctx, 0x1000); - i965_avc_bsd_img_state(ctx, decode_state); + i965_avc_bsd_img_state(ctx, decode_state, i965_h264_context); i965_avc_bsd_qm_state(ctx, decode_state); for (j = 0; j < decode_state->num_slice_params; j++) { @@ -1078,25 +1069,24 @@ i965_avc_bsd_pipeline(VADriverContextP ctx, struct decode_state *decode_state) slice_param->slice_type != SLICE_TYPE_SI)) i965_h264_context->picture.i_flag = 0; - i965_avc_bsd_slice_state(ctx, pic_param, slice_param); - i965_avc_bsd_buf_base_state(ctx, pic_param, slice_param); - i965_avc_bsd_object(ctx, decode_state, pic_param, slice_param, j); + i965_avc_bsd_slice_state(ctx, pic_param, slice_param, i965_h264_context); + i965_avc_bsd_buf_base_state(ctx, pic_param, slice_param, i965_h264_context); + i965_avc_bsd_object(ctx, decode_state, pic_param, slice_param, j, i965_h264_context); slice_param++; } } - i965_avc_bsd_phantom_slice(ctx, decode_state, pic_param); + i965_avc_bsd_phantom_slice(ctx, decode_state, pic_param, i965_h264_context); intel_batchbuffer_emit_mi_flush_bcs(ctx); intel_batchbuffer_end_atomic_bcs(ctx); intel_batchbuffer_flush_bcs(ctx); } void -i965_avc_bsd_decode_init(VADriverContextP ctx) +i965_avc_bsd_decode_init(VADriverContextP ctx, void *h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; + struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)h264_context; struct i965_avc_bsd_context *i965_avc_bsd_context; dri_bo *bo; @@ -1118,10 +1108,6 @@ i965_avc_bsd_decode_init(VADriverContextP ctx) 64); assert(bo); i965_avc_bsd_context->mpr_row_store.bo = bo; - - if (!i965_avc_bsd_context->init) { - i965_avc_bsd_context->init = 1; - } } Bool diff --git a/i965_drv_video/i965_avc_bsd.h b/i965_drv_video/i965_avc_bsd.h index e064de8..25606ba 100644 --- a/i965_drv_video/i965_avc_bsd.h +++ b/i965_drv_video/i965_avc_bsd.h @@ -40,8 +40,6 @@ struct i965_avc_bsd_context struct { dri_bo *bo; } mpr_row_store; - - int init; }; struct i965_avc_bsd_surface @@ -52,8 +50,8 @@ struct i965_avc_bsd_surface int dmv_bottom_flag; }; -void i965_avc_bsd_pipeline(VADriverContextP, struct decode_state *); -void i965_avc_bsd_decode_init(VADriverContextP); +void i965_avc_bsd_pipeline(VADriverContextP, struct decode_state *, void *h264_context); +void i965_avc_bsd_decode_init(VADriverContextP, void *h264_context); Bool i965_avc_bsd_ternimate(struct i965_avc_bsd_context *); #endif /* __I965_AVC_BSD_H__ */ diff --git a/i965_drv_video/i965_avc_hw_scoreboard.c b/i965_drv_video/i965_avc_hw_scoreboard.c index 2398599..3dd9025 100644 --- a/i965_drv_video/i965_avc_hw_scoreboard.c +++ b/i965_drv_video/i965_avc_hw_scoreboard.c @@ -322,11 +322,9 @@ i965_avc_hw_scoreboard_pipeline_setup(VADriverContextP ctx, struct i965_avc_hw_s } void -i965_avc_hw_scoreboard(VADriverContextP ctx, struct decode_state *decode_state) +i965_avc_hw_scoreboard(VADriverContextP ctx, struct decode_state *decode_state, void *h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; + struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)h264_context; if (i965_h264_context->use_avc_hw_scoreboard) { struct i965_avc_hw_scoreboard_context *avc_hw_scoreboard_context = &i965_h264_context->avc_hw_scoreboard_context; @@ -352,11 +350,10 @@ i965_avc_hw_scoreboard(VADriverContextP ctx, struct decode_state *decode_state) } void -i965_avc_hw_scoreboard_decode_init(VADriverContextP ctx) +i965_avc_hw_scoreboard_decode_init(VADriverContextP ctx, void *h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; + struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)h264_context; if (i965_h264_context->use_avc_hw_scoreboard) { struct i965_avc_hw_scoreboard_context *avc_hw_scoreboard_context = &i965_h264_context->avc_hw_scoreboard_context; diff --git a/i965_drv_video/i965_avc_hw_scoreboard.h b/i965_drv_video/i965_avc_hw_scoreboard.h index 99c0a43..bca8831 100644 --- a/i965_drv_video/i965_avc_hw_scoreboard.h +++ b/i965_drv_video/i965_avc_hw_scoreboard.h @@ -77,8 +77,8 @@ struct i965_avc_hw_scoreboard_context } urb; }; -void i965_avc_hw_scoreboard(VADriverContextP, struct decode_state *); -void i965_avc_hw_scoreboard_decode_init(VADriverContextP); +void i965_avc_hw_scoreboard(VADriverContextP, struct decode_state *, void *h264_context); +void i965_avc_hw_scoreboard_decode_init(VADriverContextP, void *h264_context); Bool i965_avc_hw_scoreboard_ternimate(struct i965_avc_hw_scoreboard_context *); #endif /* __I965_AVC_HW_SCOREBOARD_H__ */ diff --git a/i965_drv_video/i965_avc_ildb.c b/i965_drv_video/i965_avc_ildb.c index a6be42b..44c3b53 100644 --- a/i965_drv_video/i965_avc_ildb.c +++ b/i965_drv_video/i965_avc_ildb.c @@ -129,11 +129,11 @@ extern struct media_kernel *h264_avc_kernels; static unsigned long *avc_ildb_kernel_offset = NULL; static void -i965_avc_ildb_surface_state(VADriverContextP ctx, struct decode_state *decode_state) +i965_avc_ildb_surface_state(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_h264_context *i965_h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; struct i965_surface_state *ss; struct object_surface *obj_surface; @@ -237,11 +237,8 @@ i965_avc_ildb_surface_state(VADriverContextP ctx, struct decode_state *decode_st } static void -i965_avc_ildb_binding_table(VADriverContextP ctx) +i965_avc_ildb_binding_table(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; unsigned int *binding_table; dri_bo *bo = avc_ildb_context->binding_table.bo; @@ -265,11 +262,8 @@ i965_avc_ildb_binding_table(VADriverContextP ctx) } static void -i965_avc_ildb_interface_descriptor_table(VADriverContextP ctx) +i965_avc_ildb_interface_descriptor_table(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; struct i965_interface_descriptor *desc; dri_bo *bo; @@ -311,11 +305,8 @@ i965_avc_ildb_interface_descriptor_table(VADriverContextP ctx) } static void -i965_avc_ildb_vfe_state(VADriverContextP ctx) +i965_avc_ildb_vfe_state(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; struct i965_vfe_state *vfe_state; dri_bo *bo; @@ -341,11 +332,11 @@ i965_avc_ildb_vfe_state(VADriverContextP ctx) } static void -i965_avc_ildb_upload_constants(VADriverContextP ctx, struct decode_state *decode_state) +i965_avc_ildb_upload_constants(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_h264_context *i965_h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; VAPictureParameterBufferH264 *pic_param; struct avc_ildb_root_input *root_input; @@ -395,13 +386,15 @@ i965_avc_ildb_upload_constants(VADriverContextP ctx, struct decode_state *decode } static void -i965_avc_ildb_states_setup(VADriverContextP ctx, struct decode_state *decode_state) +i965_avc_ildb_states_setup(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_h264_context *i965_h264_context) { - i965_avc_ildb_surface_state(ctx, decode_state); - i965_avc_ildb_binding_table(ctx); - i965_avc_ildb_interface_descriptor_table(ctx); - i965_avc_ildb_vfe_state(ctx); - i965_avc_ildb_upload_constants(ctx, decode_state); + i965_avc_ildb_surface_state(ctx, decode_state, i965_h264_context); + i965_avc_ildb_binding_table(ctx, i965_h264_context); + i965_avc_ildb_interface_descriptor_table(ctx, i965_h264_context); + i965_avc_ildb_vfe_state(ctx, i965_h264_context); + i965_avc_ildb_upload_constants(ctx, decode_state, i965_h264_context); } static void @@ -413,11 +406,9 @@ i965_avc_ildb_pipeline_select(VADriverContextP ctx) } static void -i965_avc_ildb_urb_layout(VADriverContextP ctx) +i965_avc_ildb_urb_layout(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; unsigned int vfe_fence, cs_fence; @@ -463,11 +454,8 @@ i965_avc_ildb_state_base_address(VADriverContextP ctx) } static void -i965_avc_ildb_state_pointers(VADriverContextP ctx) +i965_avc_ildb_state_pointers(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; BEGIN_BATCH(ctx, 3); @@ -478,11 +466,8 @@ i965_avc_ildb_state_pointers(VADriverContextP ctx) } static void -i965_avc_ildb_cs_urb_layout(VADriverContextP ctx) +i965_avc_ildb_cs_urb_layout(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; BEGIN_BATCH(ctx, 2); @@ -494,11 +479,8 @@ i965_avc_ildb_cs_urb_layout(VADriverContextP ctx) } static void -i965_avc_ildb_constant_buffer(VADriverContextP ctx) +i965_avc_ildb_constant_buffer(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; BEGIN_BATCH(ctx, 2); @@ -510,11 +492,8 @@ i965_avc_ildb_constant_buffer(VADriverContextP ctx) } static void -i965_avc_ildb_objects(VADriverContextP ctx) +i965_avc_ildb_objects(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context; BEGIN_BATCH(ctx, 6); @@ -547,37 +526,34 @@ i965_avc_ildb_objects(VADriverContextP ctx) } static void -i965_avc_ildb_pipeline_setup(VADriverContextP ctx) +i965_avc_ildb_pipeline_setup(VADriverContextP ctx, struct i965_h264_context *i965_h264_context) { intel_batchbuffer_emit_mi_flush(ctx); i965_avc_ildb_pipeline_select(ctx); i965_avc_ildb_state_base_address(ctx); - i965_avc_ildb_state_pointers(ctx); - i965_avc_ildb_urb_layout(ctx); - i965_avc_ildb_cs_urb_layout(ctx); - i965_avc_ildb_constant_buffer(ctx); - i965_avc_ildb_objects(ctx); + i965_avc_ildb_state_pointers(ctx, i965_h264_context); + i965_avc_ildb_urb_layout(ctx, i965_h264_context); + i965_avc_ildb_cs_urb_layout(ctx, i965_h264_context); + i965_avc_ildb_constant_buffer(ctx, i965_h264_context); + i965_avc_ildb_objects(ctx, i965_h264_context); } void -i965_avc_ildb(VADriverContextP ctx, struct decode_state *decode_state) +i965_avc_ildb(VADriverContextP ctx, struct decode_state *decode_state, void *h264_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; + struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)h264_context; if (i965_h264_context->enable_avc_ildb) { - i965_avc_ildb_states_setup(ctx, decode_state); - i965_avc_ildb_pipeline_setup(ctx); + i965_avc_ildb_states_setup(ctx, decode_state, i965_h264_context); + i965_avc_ildb_pipeline_setup(ctx, i965_h264_context); } } void -i965_avc_ildb_decode_init(VADriverContextP ctx) +i965_avc_ildb_decode_init(VADriverContextP ctx, void *h264_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)media_state->private_context; + struct i965_h264_context *i965_h264_context = (struct i965_h264_context *)h264_context; struct i965_avc_ildb_context *avc_ildb_context = &i965_h264_context->avc_ildb_context;; dri_bo *bo; int i; diff --git a/i965_drv_video/i965_avc_ildb.h b/i965_drv_video/i965_avc_ildb.h index d48bb50..ff16ac6 100644 --- a/i965_drv_video/i965_avc_ildb.h +++ b/i965_drv_video/i965_avc_ildb.h @@ -88,8 +88,8 @@ struct i965_avc_ildb_context int mbs_per_picture; }; -void i965_avc_ildb(VADriverContextP, struct decode_state *); -void i965_avc_ildb_decode_init(VADriverContextP); +void i965_avc_ildb(VADriverContextP, struct decode_state *, void *h264_context); +void i965_avc_ildb_decode_init(VADriverContextP, void *h264_context); Bool i965_avc_ildb_ternimate(struct i965_avc_ildb_context *); #endif /* __I965_AVC_ILDB_H__ */ diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c index 77801ba..8f353f1 100644 --- a/i965_drv_video/i965_drv_video.c +++ b/i965_drv_video/i965_drv_video.c @@ -37,11 +37,8 @@ #include "intel_driver.h" #include "intel_memman.h" #include "intel_batchbuffer.h" - -#include "i965_media.h" -#include "i965_drv_video.h" #include "i965_defines.h" -#include "i965_encoder.h" +#include "i965_drv_video.h" #define CONFIG_ID_OFFSET 0x01000000 #define CONTEXT_ID_OFFSET 0x02000000 @@ -132,6 +129,25 @@ get_subpic_format(const VAImageFormat *va_format) return NULL; } +extern struct hw_context *g4x_dec_hw_context_init(VADriverContextP, VAProfile); +static struct hw_codec_info g4x_hw_codec_info = { + .dec_hw_context_init = g4x_dec_hw_context_init, + .enc_hw_context_init = NULL, +}; + +extern struct hw_context *ironlake_dec_hw_context_init(VADriverContextP, VAProfile); +static struct hw_codec_info ironlake_hw_codec_info = { + .dec_hw_context_init = ironlake_dec_hw_context_init, + .enc_hw_context_init = NULL, +}; + +extern struct hw_context *gen6_dec_hw_context_init(VADriverContextP, VAProfile); +extern struct hw_context *gen6_enc_hw_context_init(VADriverContextP, VAProfile); +static struct hw_codec_info gen6_hw_codec_info = { + .dec_hw_context_init = gen6_dec_hw_context_init, + .enc_hw_context_init = gen6_enc_hw_context_init, +}; + VAStatus i965_QueryConfigProfiles(VADriverContextP ctx, VAProfile *profile_list, /* out */ @@ -362,7 +378,6 @@ i965_CreateConfig(VADriverContextP ctx, VAStatus i965_DestroyConfig(VADriverContextP ctx, VAConfigID config_id) { - struct intel_driver_data * const intel = intel_driver_data(ctx); struct i965_driver_data *i965 = i965_driver_data(ctx); struct object_config *obj_config = CONFIG(config_id); VAStatus vaStatus; @@ -736,26 +751,38 @@ i965_destroy_context(struct object_heap *heap, struct object_base *obj) struct object_context *obj_context = (struct object_context *)obj; int i; - assert(obj_context->decode_state.num_slice_params <= obj_context->decode_state.max_slice_params); - assert(obj_context->decode_state.num_slice_datas <= obj_context->decode_state.max_slice_datas); + if (obj_context->hw_context) { + obj_context->hw_context->destroy(obj_context->hw_context); + obj_context->hw_context = NULL; + } + + if (obj_context->codec_type == CODEC_ENC) { + assert(obj_context->codec_state.enc.num_slice_params <= obj_context->codec_state.enc.max_slice_params); + i965_release_buffer_store(&obj_context->codec_state.enc.pic_param); + i965_release_buffer_store(&obj_context->codec_state.enc.seq_param); + } else { + assert(obj_context->codec_state.dec.num_slice_params <= obj_context->codec_state.dec.max_slice_params); + assert(obj_context->codec_state.dec.num_slice_datas <= obj_context->codec_state.dec.max_slice_datas); + + i965_release_buffer_store(&obj_context->codec_state.dec.pic_param); + i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix); + i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane); - i965_release_buffer_store(&obj_context->decode_state.pic_param); - i965_release_buffer_store(&obj_context->decode_state.iq_matrix); - i965_release_buffer_store(&obj_context->decode_state.bit_plane); + for (i = 0; i < obj_context->codec_state.dec.num_slice_params; i++) + i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[i]); - for (i = 0; i < obj_context->decode_state.num_slice_params; i++) - i965_release_buffer_store(&obj_context->decode_state.slice_params[i]); + for (i = 0; i < obj_context->codec_state.dec.num_slice_datas; i++) + i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[i]); - for (i = 0; i < obj_context->decode_state.num_slice_datas; i++) - i965_release_buffer_store(&obj_context->decode_state.slice_datas[i]); + free(obj_context->codec_state.dec.slice_params); + free(obj_context->codec_state.dec.slice_datas); + } - free(obj_context->decode_state.slice_params); - free(obj_context->decode_state.slice_datas); free(obj_context->render_targets); object_heap_free(heap, obj); } -VAStatus +VAStatus i965_CreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width, @@ -812,6 +839,7 @@ i965_CreateContext(VADriverContextP ctx, obj_context->num_render_targets = num_render_targets; obj_context->render_targets = (VASurfaceID *)calloc(num_render_targets, sizeof(VASurfaceID)); + obj_context->hw_context = NULL; for(i = 0; i < num_render_targets; i++) { if (NULL == SURFACE(render_targets[i])) { @@ -824,18 +852,27 @@ i965_CreateContext(VADriverContextP ctx, if (VA_STATUS_SUCCESS == vaStatus) { if (VAEntrypointEncSlice == obj_config->entrypoint ) { /*encode routin only*/ - memset(&obj_context->encode_state, 0, sizeof(obj_context->encode_state)); - vaStatus = i965_encoder_create_context(ctx, config_id, picture_width, picture_height, - flag, render_targets, num_render_targets, obj_context); + obj_context->codec_type = CODEC_ENC; + memset(&obj_context->codec_state.enc, 0, sizeof(obj_context->codec_state.enc)); + obj_context->codec_state.enc.current_render_target = VA_INVALID_ID; + obj_context->codec_state.enc.max_slice_params = NUM_SLICES; + obj_context->codec_state.enc.slice_params = calloc(obj_context->codec_state.enc.max_slice_params, + sizeof(*obj_context->codec_state.enc.slice_params)); + assert(i965->codec_info->enc_hw_context_init); + obj_context->hw_context = i965->codec_info->enc_hw_context_init(ctx, obj_config->profile); } else { - memset(&obj_context->decode_state, 0, sizeof(obj_context->decode_state)); - obj_context->decode_state.current_render_target = -1; - obj_context->decode_state.max_slice_params = NUM_SLICES; - obj_context->decode_state.max_slice_datas = NUM_SLICES; - obj_context->decode_state.slice_params = calloc(obj_context->decode_state.max_slice_params, - sizeof(*obj_context->decode_state.slice_params)); - obj_context->decode_state.slice_datas = calloc(obj_context->decode_state.max_slice_datas, - sizeof(*obj_context->decode_state.slice_datas)); + obj_context->codec_type = CODEC_DEC; + memset(&obj_context->codec_state.dec, 0, sizeof(obj_context->codec_state.dec)); + obj_context->codec_state.dec.current_render_target = -1; + obj_context->codec_state.dec.max_slice_params = NUM_SLICES; + obj_context->codec_state.dec.max_slice_datas = NUM_SLICES; + obj_context->codec_state.dec.slice_params = calloc(obj_context->codec_state.dec.max_slice_params, + sizeof(*obj_context->codec_state.dec.slice_params)); + obj_context->codec_state.dec.slice_datas = calloc(obj_context->codec_state.dec.max_slice_datas, + sizeof(*obj_context->codec_state.dec.slice_datas)); + + assert(i965->codec_info->dec_hw_context_init); + obj_context->hw_context = i965->codec_info->dec_hw_context_init(ctx, obj_config->profile); } } @@ -852,19 +889,9 @@ i965_DestroyContext(VADriverContextP ctx, VAContextID context) { struct i965_driver_data *i965 = i965_driver_data(ctx); struct object_context *obj_context = CONTEXT(context); - struct object_config *obj_config; - VAContextID config; assert(obj_context); - config = obj_context->config_id; - obj_config = CONFIG(config); - assert(obj_config); - - if (VAEntrypointEncSlice == obj_config->entrypoint ){ - i965_encoder_destroy_context(&i965->context_heap, (struct object_base *)obj_context); - } else { - i965_destroy_context(&i965->context_heap, (struct object_base *)obj_context); - } + i965_destroy_context(&i965->context_heap, (struct object_base *)obj_context); return VA_STATUS_SUCCESS; } @@ -1103,7 +1130,6 @@ i965_BeginPicture(VADriverContextP ctx, VAContextID context, VASurfaceID render_target) { - struct intel_driver_data * const intel = intel_driver_data(ctx); struct i965_driver_data *i965 = i965_driver_data(ctx); struct object_context *obj_context = CONTEXT(context); struct object_surface *obj_surface = SURFACE(render_target); @@ -1118,11 +1144,6 @@ i965_BeginPicture(VADriverContextP ctx, obj_config = CONFIG(config); assert(obj_config); - if (VAEntrypointEncSlice == obj_config->entrypoint ){ - vaStatus = i965_encoder_begin_picture(ctx, context, render_target); - return vaStatus; - } - switch (obj_config->profile) { case VAProfileMPEG2Simple: case VAProfileMPEG2Main: @@ -1147,7 +1168,10 @@ i965_BeginPicture(VADriverContextP ctx, break; } - obj_context->decode_state.current_render_target = render_target; + if (obj_context->codec_type == CODEC_ENC) + obj_context->codec_state.enc.current_render_target = render_target; /*This is input new frame*/ + else + obj_context->codec_state.dec.current_render_target = render_target; return vaStatus; } @@ -1159,8 +1183,8 @@ i965_render_picture_parameter_buffer(VADriverContextP ctx, { assert(obj_buffer->buffer_store->bo == NULL); assert(obj_buffer->buffer_store->buffer); - i965_release_buffer_store(&obj_context->decode_state.pic_param); - i965_reference_buffer_store(&obj_context->decode_state.pic_param, + i965_release_buffer_store(&obj_context->codec_state.dec.pic_param); + i965_reference_buffer_store(&obj_context->codec_state.dec.pic_param, obj_buffer->buffer_store); return VA_STATUS_SUCCESS; @@ -1173,8 +1197,8 @@ i965_render_iq_matrix_buffer(VADriverContextP ctx, { assert(obj_buffer->buffer_store->bo == NULL); assert(obj_buffer->buffer_store->buffer); - i965_release_buffer_store(&obj_context->decode_state.iq_matrix); - i965_reference_buffer_store(&obj_context->decode_state.iq_matrix, + i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix); + i965_reference_buffer_store(&obj_context->codec_state.dec.iq_matrix, obj_buffer->buffer_store); return VA_STATUS_SUCCESS; @@ -1187,8 +1211,8 @@ i965_render_bit_plane_buffer(VADriverContextP ctx, { assert(obj_buffer->buffer_store->bo == NULL); assert(obj_buffer->buffer_store->buffer); - i965_release_buffer_store(&obj_context->decode_state.bit_plane); - i965_reference_buffer_store(&obj_context->decode_state.bit_plane, + i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane); + i965_reference_buffer_store(&obj_context->codec_state.dec.bit_plane, obj_buffer->buffer_store); return VA_STATUS_SUCCESS; @@ -1202,17 +1226,17 @@ i965_render_slice_parameter_buffer(VADriverContextP ctx, assert(obj_buffer->buffer_store->bo == NULL); assert(obj_buffer->buffer_store->buffer); - if (obj_context->decode_state.num_slice_params == obj_context->decode_state.max_slice_params) { - obj_context->decode_state.slice_params = realloc(obj_context->decode_state.slice_params, - (obj_context->decode_state.max_slice_params + NUM_SLICES) * sizeof(*obj_context->decode_state.slice_params)); - memset(obj_context->decode_state.slice_params + obj_context->decode_state.max_slice_params, 0, NUM_SLICES * sizeof(*obj_context->decode_state.slice_params)); - obj_context->decode_state.max_slice_params += NUM_SLICES; + if (obj_context->codec_state.dec.num_slice_params == obj_context->codec_state.dec.max_slice_params) { + obj_context->codec_state.dec.slice_params = realloc(obj_context->codec_state.dec.slice_params, + (obj_context->codec_state.dec.max_slice_params + NUM_SLICES) * sizeof(*obj_context->codec_state.dec.slice_params)); + memset(obj_context->codec_state.dec.slice_params + obj_context->codec_state.dec.max_slice_params, 0, NUM_SLICES * sizeof(*obj_context->codec_state.dec.slice_params)); + obj_context->codec_state.dec.max_slice_params += NUM_SLICES; } - i965_release_buffer_store(&obj_context->decode_state.slice_params[obj_context->decode_state.num_slice_params]); - i965_reference_buffer_store(&obj_context->decode_state.slice_params[obj_context->decode_state.num_slice_params], + i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[obj_context->codec_state.dec.num_slice_params]); + i965_reference_buffer_store(&obj_context->codec_state.dec.slice_params[obj_context->codec_state.dec.num_slice_params], obj_buffer->buffer_store); - obj_context->decode_state.num_slice_params++; + obj_context->codec_state.dec.num_slice_params++; return VA_STATUS_SUCCESS; } @@ -1225,45 +1249,31 @@ i965_render_slice_data_buffer(VADriverContextP ctx, assert(obj_buffer->buffer_store->buffer == NULL); assert(obj_buffer->buffer_store->bo); - if (obj_context->decode_state.num_slice_datas == obj_context->decode_state.max_slice_datas) { - obj_context->decode_state.slice_datas = realloc(obj_context->decode_state.slice_datas, - (obj_context->decode_state.max_slice_datas + NUM_SLICES) * sizeof(*obj_context->decode_state.slice_datas)); - memset(obj_context->decode_state.slice_datas + obj_context->decode_state.max_slice_datas, 0, NUM_SLICES * sizeof(*obj_context->decode_state.slice_datas)); - obj_context->decode_state.max_slice_datas += NUM_SLICES; + if (obj_context->codec_state.dec.num_slice_datas == obj_context->codec_state.dec.max_slice_datas) { + obj_context->codec_state.dec.slice_datas = realloc(obj_context->codec_state.dec.slice_datas, + (obj_context->codec_state.dec.max_slice_datas + NUM_SLICES) * sizeof(*obj_context->codec_state.dec.slice_datas)); + memset(obj_context->codec_state.dec.slice_datas + obj_context->codec_state.dec.max_slice_datas, 0, NUM_SLICES * sizeof(*obj_context->codec_state.dec.slice_datas)); + obj_context->codec_state.dec.max_slice_datas += NUM_SLICES; } - i965_release_buffer_store(&obj_context->decode_state.slice_datas[obj_context->decode_state.num_slice_datas]); - i965_reference_buffer_store(&obj_context->decode_state.slice_datas[obj_context->decode_state.num_slice_datas], + i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[obj_context->codec_state.dec.num_slice_datas]); + i965_reference_buffer_store(&obj_context->codec_state.dec.slice_datas[obj_context->codec_state.dec.num_slice_datas], obj_buffer->buffer_store); - obj_context->decode_state.num_slice_datas++; + obj_context->codec_state.dec.num_slice_datas++; return VA_STATUS_SUCCESS; } -VAStatus -i965_RenderPicture(VADriverContextP ctx, - VAContextID context, - VABufferID *buffers, - int num_buffers) +static VAStatus +i965_decoder_render_picture(VADriverContextP ctx, + VAContextID context, + VABufferID *buffers, + int num_buffers) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct object_context *obj_context; - struct object_config *obj_config; - VAContextID config; + struct i965_driver_data *i965 = i965_driver_data(ctx); + struct object_context *obj_context = CONTEXT(context); + VAStatus vaStatus; int i; - VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN; - - obj_context = CONTEXT(context); - assert(obj_context); - - config = obj_context->config_id; - obj_config = CONFIG(config); - assert(obj_config); - - if (VAEntrypointEncSlice == obj_config->entrypoint ){ - vaStatus = i965_encoder_render_picture(ctx, context, buffers, num_buffers); - return vaStatus; - } for (i = 0; i < num_buffers; i++) { struct object_buffer *obj_buffer = BUFFER(buffers[i]); @@ -1291,8 +1301,177 @@ i965_RenderPicture(VADriverContextP ctx, break; default: + vaStatus = VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE; + break; + } + } + + return vaStatus; +} + +static VAStatus +i965_encoder_render_squence_parameter_buffer(VADriverContextP ctx, + struct object_context *obj_context, + struct object_buffer *obj_buffer) +{ + assert(obj_buffer->buffer_store->bo == NULL); + assert(obj_buffer->buffer_store->buffer); + i965_release_buffer_store(&obj_context->codec_state.enc.seq_param); + i965_reference_buffer_store(&obj_context->codec_state.enc.seq_param, + obj_buffer->buffer_store); + + return VA_STATUS_SUCCESS; +} + + +static VAStatus +i965_encoder_render_picture_parameter_buffer(VADriverContextP ctx, + struct object_context *obj_context, + struct object_buffer *obj_buffer) +{ + assert(obj_buffer->buffer_store->bo == NULL); + assert(obj_buffer->buffer_store->buffer); + i965_release_buffer_store(&obj_context->codec_state.enc.pic_param); + i965_reference_buffer_store(&obj_context->codec_state.enc.pic_param, + obj_buffer->buffer_store); + + return VA_STATUS_SUCCESS; +} + +static VAStatus +i965_encoder_render_slice_parameter_buffer(VADriverContextP ctx, + struct object_context *obj_context, + struct object_buffer *obj_buffer) +{ + if (obj_context->codec_state.enc.num_slice_params == obj_context->codec_state.enc.max_slice_params) { + obj_context->codec_state.enc.slice_params = realloc(obj_context->codec_state.enc.slice_params, + (obj_context->codec_state.enc.max_slice_params + NUM_SLICES) * sizeof(*obj_context->codec_state.enc.slice_params)); + memset(obj_context->codec_state.enc.slice_params + obj_context->codec_state.enc.max_slice_params, 0, NUM_SLICES * sizeof(*obj_context->codec_state.enc.slice_params)); + obj_context->codec_state.enc.max_slice_params += NUM_SLICES; + } + + i965_release_buffer_store(&obj_context->codec_state.enc.slice_params[obj_context->codec_state.enc.num_slice_params]); + i965_reference_buffer_store(&obj_context->codec_state.enc.slice_params[obj_context->codec_state.enc.num_slice_params], + obj_buffer->buffer_store); + obj_context->codec_state.enc.num_slice_params++; + + return VA_STATUS_SUCCESS; +} + +static VAStatus +i965_encoder_render_picture_control_buffer(VADriverContextP ctx, + struct object_context *obj_context, + struct object_buffer *obj_buffer) +{ + assert(obj_buffer->buffer_store->bo == NULL); + assert(obj_buffer->buffer_store->buffer); + i965_release_buffer_store(&obj_context->codec_state.enc.pic_control); + i965_reference_buffer_store(&obj_context->codec_state.enc.pic_control, + obj_buffer->buffer_store); + + return VA_STATUS_SUCCESS; +} + +static VAStatus +i965_encoder_render_qmatrix_buffer(VADriverContextP ctx, + struct object_context *obj_context, + struct object_buffer *obj_buffer) +{ + assert(obj_buffer->buffer_store->bo == NULL); + assert(obj_buffer->buffer_store->buffer); + i965_release_buffer_store(&obj_context->codec_state.enc.q_matrix); + i965_reference_buffer_store(&obj_context->codec_state.enc.iq_matrix, + obj_buffer->buffer_store); + + return VA_STATUS_SUCCESS; +} + +static VAStatus +i965_encoder_render_iqmatrix_buffer(VADriverContextP ctx, + struct object_context *obj_context, + struct object_buffer *obj_buffer) +{ + assert(obj_buffer->buffer_store->bo == NULL); + assert(obj_buffer->buffer_store->buffer); + i965_release_buffer_store(&obj_context->codec_state.enc.iq_matrix); + i965_reference_buffer_store(&obj_context->codec_state.enc.iq_matrix, + obj_buffer->buffer_store); + + return VA_STATUS_SUCCESS; +} + +static VAStatus +i965_encoder_render_picture(VADriverContextP ctx, + VAContextID context, + VABufferID *buffers, + int num_buffers) +{ + struct i965_driver_data *i965 = i965_driver_data(ctx); + struct object_context *obj_context = CONTEXT(context); + VAStatus vaStatus; + int i; + + for (i = 0; i < num_buffers; i++) { + struct object_buffer *obj_buffer = BUFFER(buffers[i]); + assert(obj_buffer); + + switch (obj_buffer->type) { + case VAEncSequenceParameterBufferType: + vaStatus = i965_encoder_render_squence_parameter_buffer(ctx, obj_context, obj_buffer); + break; + + case VAEncPictureParameterBufferType: + vaStatus = i965_encoder_render_picture_parameter_buffer(ctx, obj_context, obj_buffer); + break; + + case VAEncSliceParameterBufferType: + vaStatus = i965_encoder_render_slice_parameter_buffer(ctx, obj_context, obj_buffer); + break; + + case VAPictureParameterBufferType: + vaStatus = i965_encoder_render_picture_control_buffer(ctx, obj_context, obj_buffer); + break; + + case VAQMatrixBufferType: + vaStatus = i965_encoder_render_qmatrix_buffer(ctx, obj_context, obj_buffer); + break; + + case VAIQMatrixBufferType: + vaStatus = i965_encoder_render_iqmatrix_buffer(ctx, obj_context, obj_buffer); + break; + + default: + vaStatus = VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE; break; } + } + + return vaStatus; +} + +VAStatus +i965_RenderPicture(VADriverContextP ctx, + VAContextID context, + VABufferID *buffers, + int num_buffers) +{ + struct i965_driver_data *i965 = i965_driver_data(ctx); + struct object_context *obj_context; + struct object_config *obj_config; + VAContextID config; + VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN; + + obj_context = CONTEXT(context); + assert(obj_context); + + config = obj_context->config_id; + obj_config = CONFIG(config); + assert(obj_config); + + if (VAEntrypointEncSlice == obj_config->entrypoint ){ + vaStatus = i965_encoder_render_picture(ctx, context, buffers, num_buffers); + } else { + vaStatus = i965_decoder_render_picture(ctx, context, buffers, num_buffers); } return vaStatus; @@ -1312,26 +1491,43 @@ i965_EndPicture(VADriverContextP ctx, VAContextID context) obj_config = CONFIG(config); assert(obj_config); - if (VAEntrypointEncSlice == obj_config->entrypoint ){ - return i965_encoder_end_picture(ctx, context); + if (obj_context->codec_type == CODEC_ENC) { + assert(VAEntrypointEncSlice == obj_config->entrypoint); + + assert(obj_context->codec_state.enc.pic_param); + assert(obj_context->codec_state.enc.seq_param); + assert(obj_context->codec_state.enc.num_slice_params >= 1); + } else { + assert(obj_context->codec_state.dec.pic_param); + assert(obj_context->codec_state.dec.num_slice_params >= 1); + assert(obj_context->codec_state.dec.num_slice_datas >= 1); + assert(obj_context->codec_state.dec.num_slice_params == obj_context->codec_state.dec.num_slice_datas); } - assert(obj_context->decode_state.pic_param); - assert(obj_context->decode_state.num_slice_params >= 1); - assert(obj_context->decode_state.num_slice_datas >= 1); - assert(obj_context->decode_state.num_slice_params == obj_context->decode_state.num_slice_datas); + assert(obj_context->hw_context->run); + obj_context->hw_context->run(ctx, obj_config->profile, &obj_context->codec_state, obj_context->hw_context); - i965_media_decode_picture(ctx, obj_config->profile, &obj_context->decode_state); - obj_context->decode_state.current_render_target = -1; - obj_context->decode_state.num_slice_params = 0; - obj_context->decode_state.num_slice_datas = 0; - i965_release_buffer_store(&obj_context->decode_state.pic_param); - i965_release_buffer_store(&obj_context->decode_state.iq_matrix); - i965_release_buffer_store(&obj_context->decode_state.bit_plane); + if (obj_context->codec_type == CODEC_ENC) { + obj_context->codec_state.enc.current_render_target = VA_INVALID_SURFACE; + obj_context->codec_state.enc.num_slice_params = 0; + i965_release_buffer_store(&obj_context->codec_state.enc.pic_param); + i965_release_buffer_store(&obj_context->codec_state.enc.seq_param); - for (i = 0; i < obj_context->decode_state.num_slice_params; i++) { - i965_release_buffer_store(&obj_context->decode_state.slice_params[i]); - i965_release_buffer_store(&obj_context->decode_state.slice_datas[i]); + for (i = 0; i < obj_context->codec_state.enc.num_slice_params; i++) { + i965_release_buffer_store(&obj_context->codec_state.enc.slice_params[i]); + } + } else { + obj_context->codec_state.dec.current_render_target = -1; + obj_context->codec_state.dec.num_slice_params = 0; + obj_context->codec_state.dec.num_slice_datas = 0; + i965_release_buffer_store(&obj_context->codec_state.dec.pic_param); + i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix); + i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane); + + for (i = 0; i < obj_context->codec_state.dec.num_slice_params; i++) { + i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[i]); + i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[i]); + } } return VA_STATUS_SUCCESS; @@ -1441,12 +1637,13 @@ i965_Init(VADriverContextP ctx) if (intel_driver_init(ctx) == False) return VA_STATUS_ERROR_UNKNOWN; - if (!IS_G4X(i965->intel.device_id) && - !IS_IRONLAKE(i965->intel.device_id) && - !IS_GEN6(i965->intel.device_id)) - return VA_STATUS_ERROR_UNKNOWN; - - if (i965_media_init(ctx) == False) + if (IS_G4X(i965->intel.device_id)) + i965->codec_info = &g4x_hw_codec_info; + else if (IS_IRONLAKE(i965->intel.device_id)) + i965->codec_info = &ironlake_hw_codec_info; + else if (IS_GEN6(i965->intel.device_id)) + i965->codec_info = &gen6_hw_codec_info; + else return VA_STATUS_ERROR_UNKNOWN; if (i965_post_processing_init(ctx) == False) @@ -1455,9 +1652,6 @@ i965_Init(VADriverContextP ctx) if (i965_render_init(ctx) == False) return VA_STATUS_ERROR_UNKNOWN; - if (HAS_ENCODER(i965) && (i965_encoder_init(ctx) == False)) - return VA_STATUS_ERROR_UNKNOWN; - return VA_STATUS_SUCCESS; } @@ -2113,18 +2307,12 @@ i965_Terminate(VADriverContextP ctx) { struct i965_driver_data *i965 = i965_driver_data(ctx); - if (HAS_ENCODER(i965) && (i965_encoder_terminate(ctx) == False)) - return VA_STATUS_ERROR_UNKNOWN; - if (i965_render_terminate(ctx) == False) return VA_STATUS_ERROR_UNKNOWN; if (i965_post_processing_terminate(ctx) == False) return VA_STATUS_ERROR_UNKNOWN; - if (i965_media_terminate(ctx) == False) - return VA_STATUS_ERROR_UNKNOWN; - if (intel_driver_terminate(ctx) == False) return VA_STATUS_ERROR_UNKNOWN; diff --git a/i965_drv_video/i965_drv_video.h b/i965_drv_video/i965_drv_video.h index 20cb84e..96f692d 100644 --- a/i965_drv_video/i965_drv_video.h +++ b/i965_drv_video/i965_drv_video.h @@ -37,12 +37,8 @@ #include "intel_driver.h" -#include "i965_media.h" #include "i965_render.h" -#include "gen6_vme.h" -#include "gen6_mfc.h" - #define I965_MAX_PROFILES 11 #define I965_MAX_ENTRYPOINTS 5 #define I965_MAX_CONFIG_ATTRIBUTES 10 @@ -51,6 +47,15 @@ #define I965_MAX_DISPLAY_ATTRIBUTES 4 #define I965_STR_VENDOR "i965 Driver 0.1" +struct media_kernel +{ + char *name; + int interface; + unsigned int (*bin)[4]; + int size; + dri_bo *bo; +}; + struct buffer_store { unsigned char *buffer; @@ -84,8 +89,7 @@ struct decode_state int num_slice_datas; }; -//keeping mfc encoder's stuff here -struct mfc_encode_state +struct encode_state { struct buffer_store *seq_param; struct buffer_store *pic_param; @@ -98,6 +102,24 @@ struct mfc_encode_state int num_slice_params; }; +#define CODEC_DEC 0 +#define CODEC_ENC 1 + +union codec_state +{ + struct decode_state dec; + struct encode_state enc; +}; + +struct hw_context +{ + void (*run)(VADriverContextP ctx, + VAProfile profile, + union codec_state *codec_state, + struct hw_context *hw_context); + void (*destroy)(void *); +}; + struct object_context { struct object_base base; @@ -108,8 +130,9 @@ struct object_context int picture_width; int picture_height; int flags; - struct decode_state decode_state; - struct mfc_encode_state encode_state; + int codec_type; + union codec_state codec_state; + struct hw_context *hw_context; }; #define SURFACE_REFERENCED (1 << 0) @@ -175,6 +198,12 @@ struct object_subpic dri_bo *bo; }; +struct hw_codec_info +{ + struct hw_context *(*dec_hw_context_init)(VADriverContextP, VAProfile); + struct hw_context *(*enc_hw_context_init)(VADriverContextP, VAProfile); +}; + struct i965_driver_data { struct intel_driver_data intel; @@ -184,11 +213,9 @@ struct i965_driver_data struct object_heap buffer_heap; struct object_heap image_heap; struct object_heap subpic_heap; - struct i965_media_state media_state; struct i965_render_state render_state; + struct hw_codec_info *codec_info; void *pp_context; - struct gen6_media_state gen6_media_state; - struct gen6_mfc_bcs_state gen6_mfc_bcs_state; }; #define NEW_CONFIG_ID() object_heap_allocate(&i965->config_heap); diff --git a/i965_drv_video/i965_encoder.c b/i965_drv_video/i965_encoder.c index cb21344..09cef6f 100644 --- a/i965_drv_video/i965_encoder.c +++ b/i965_drv_video/i965_encoder.c @@ -40,346 +40,40 @@ #include "i965_drv_video.h" #include "i965_encoder.h" -extern void i965_reference_buffer_store(struct buffer_store **ptr, - struct buffer_store *buffer_store); -extern void i965_release_buffer_store(struct buffer_store **ptr); - -static VAStatus i965_encoder_render_squence_parameter_buffer(VADriverContextP ctx, - struct object_context *obj_context, - struct object_buffer *obj_buffer) -{ - assert(obj_buffer->buffer_store->bo == NULL); - assert(obj_buffer->buffer_store->buffer); - i965_release_buffer_store(&obj_context->encode_state.seq_param); - i965_reference_buffer_store(&obj_context->encode_state.seq_param, - obj_buffer->buffer_store); - - return VA_STATUS_SUCCESS; -} - - -static VAStatus i965_encoder_render_picture_parameter_buffer(VADriverContextP ctx, - struct object_context *obj_context, - struct object_buffer *obj_buffer) -{ - assert(obj_buffer->buffer_store->bo == NULL); - assert(obj_buffer->buffer_store->buffer); - i965_release_buffer_store(&obj_context->encode_state.pic_param); - i965_reference_buffer_store(&obj_context->encode_state.pic_param, - obj_buffer->buffer_store); - - return VA_STATUS_SUCCESS; -} - -static VAStatus i965_encoder_render_slice_parameter_buffer(VADriverContextP ctx, - struct object_context *obj_context, - struct object_buffer *obj_buffer) -{ - if (obj_context->encode_state.num_slice_params == obj_context->encode_state.max_slice_params) { - obj_context->encode_state.slice_params = realloc(obj_context->encode_state.slice_params, - (obj_context->encode_state.max_slice_params + NUM_SLICES) * sizeof(*obj_context->encode_state.slice_params)); - memset(obj_context->encode_state.slice_params + obj_context->encode_state.max_slice_params, 0, NUM_SLICES * sizeof(*obj_context->encode_state.slice_params)); - obj_context->encode_state.max_slice_params += NUM_SLICES; - } - - i965_release_buffer_store(&obj_context->encode_state.slice_params[obj_context->encode_state.num_slice_params]); - i965_reference_buffer_store(&obj_context->encode_state.slice_params[obj_context->encode_state.num_slice_params], - obj_buffer->buffer_store); - obj_context->encode_state.num_slice_params++; - - return VA_STATUS_SUCCESS; -} - -static void i965_encoder_render_picture_control_buffer(VADriverContextP ctx, - struct object_context *obj_context, - struct object_buffer *obj_buffer) -{ - assert(obj_buffer->buffer_store->bo == NULL); - assert(obj_buffer->buffer_store->buffer); - i965_release_buffer_store(&obj_context->encode_state.pic_control); - i965_reference_buffer_store(&obj_context->encode_state.pic_control, - obj_buffer->buffer_store); -} - -static void i965_encoder_render_qmatrix_buffer(VADriverContextP ctx, - struct object_context *obj_context, - struct object_buffer *obj_buffer) -{ - assert(obj_buffer->buffer_store->bo == NULL); - assert(obj_buffer->buffer_store->buffer); - i965_release_buffer_store(&obj_context->encode_state.q_matrix); - i965_reference_buffer_store(&obj_context->encode_state.iq_matrix, - obj_buffer->buffer_store); -} - -static void i965_encoder_render_iqmatrix_buffer(VADriverContextP ctx, - struct object_context *obj_context, - struct object_buffer *obj_buffer) -{ - assert(obj_buffer->buffer_store->bo == NULL); - assert(obj_buffer->buffer_store->buffer); - i965_release_buffer_store(&obj_context->encode_state.iq_matrix); - i965_reference_buffer_store(&obj_context->encode_state.iq_matrix, - obj_buffer->buffer_store); -} - -VAStatus i965_encoder_create_context(VADriverContextP ctx, - VAConfigID config_id, - int picture_width, - int picture_height, - int flag, - VASurfaceID *render_targets, - int num_render_targets, - struct object_context *obj_context) -{ - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct object_config *obj_config = CONFIG(config_id); - VAStatus vaStatus = VA_STATUS_SUCCESS; - - - if (NULL == obj_config) { - vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; - return vaStatus; - } - - if (NULL == obj_context) { - vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; - return vaStatus; - } - - if( VAProfileH264Baseline != obj_config->profile || - VAEntrypointEncSlice != obj_config->entrypoint) { - vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; - return vaStatus; - } - - /*encdoe_state init */ - obj_context->encode_state.current_render_target = VA_INVALID_ID; - obj_context->encode_state.max_slice_params = NUM_SLICES; - obj_context->encode_state.slice_params = calloc(obj_context->encode_state.max_slice_params, - sizeof(*obj_context->encode_state.slice_params)); - - return vaStatus; -} - - -VAStatus i965_encoder_begin_picture(VADriverContextP ctx, - VAContextID context, - VASurfaceID render_target) -{ - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct object_context *obj_context = CONTEXT(context); - struct object_surface *obj_surface = SURFACE(render_target); - struct object_config *obj_config; - VAContextID config; - VAStatus vaStatus; - - assert(obj_context); - assert(obj_surface); - - config = obj_context->config_id; - obj_config = CONFIG(config); - assert(obj_config); - - if( VAProfileH264Baseline != obj_config->profile || - VAEntrypointEncSlice != obj_config->entrypoint){ - vaStatus = VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; - }else{ - vaStatus = VA_STATUS_SUCCESS; - } - - obj_context->encode_state.current_render_target = render_target; /*This is input new frame*/ - - return vaStatus; -} - -VAStatus i965_encoder_render_picture(VADriverContextP ctx, - VAContextID context, - VABufferID *buffers, - int num_buffers) -{ - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct object_context *obj_context = CONTEXT(context); - struct object_config *obj_config; - VAContextID config; - VAStatus vaStatus; - int i; - - assert(obj_context); - config = obj_context->config_id; - obj_config = CONFIG(config); - assert(obj_config); - - - for (i = 0; i < num_buffers; i++) { - struct object_buffer *obj_buffer = BUFFER(buffers[i]); - assert(obj_buffer); - - switch (obj_buffer->type) { - case VAEncSequenceParameterBufferType: - i965_encoder_render_squence_parameter_buffer(ctx, obj_context, obj_buffer); - break; - - case VAEncPictureParameterBufferType: - i965_encoder_render_picture_parameter_buffer(ctx, obj_context, obj_buffer); - break; - - case VAEncSliceParameterBufferType: - i965_encoder_render_slice_parameter_buffer(ctx, obj_context, obj_buffer); - break; - - case VAPictureParameterBufferType: - i965_encoder_render_picture_control_buffer(ctx, obj_context, obj_buffer); - break; - - case VAQMatrixBufferType: - i965_encoder_render_qmatrix_buffer(ctx, obj_context, obj_buffer); - break; - - case VAIQMatrixBufferType: - i965_encoder_render_iqmatrix_buffer(ctx, obj_context, obj_buffer); - break; - - default: - break; - } - } - - vaStatus = VA_STATUS_SUCCESS; - return vaStatus; -} - -static VAStatus +static void gen6_encoder_end_picture(VADriverContextP ctx, - VAContextID context, - struct mfc_encode_state *encode_state) + VAProfile profile, + union codec_state *codec_state, + struct hw_context *hw_context) { + struct gen6_encoder_context *gen6_encoder_context = (struct gen6_encoder_context *)hw_context; + struct encode_state *encode_state = &codec_state->enc; VAStatus vaStatus; - vaStatus = gen6_vme_media_pipeline(ctx, context, encode_state); + vaStatus = gen6_vme_pipeline(ctx, profile, encode_state, gen6_encoder_context); if (vaStatus == VA_STATUS_SUCCESS) - vaStatus = gen6_mfc_pipeline(ctx, context, encode_state); - - return vaStatus; + gen6_mfc_pipeline(ctx, profile, encode_state, gen6_encoder_context); } - -VAStatus i965_encoder_end_picture(VADriverContextP ctx, VAContextID context) +static void +gen6_encoder_context_destroy(void *hw_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct object_context *obj_context = CONTEXT(context); - struct object_config *obj_config; - VAContextID config; - VAStatus vaStatus; - int i; - - assert(obj_context); - config = obj_context->config_id; - obj_config = CONFIG(config); - assert(obj_config); - - assert(obj_context->encode_state.pic_param); - assert(obj_context->encode_state.num_slice_params >= 1); - - if (IS_GEN6(i965->intel.device_id)) { - vaStatus = gen6_encoder_end_picture(ctx, context, &(obj_context->encode_state)); - } else { - /* add for other chipset */ - assert(0); - } + struct gen6_encoder_context *gen6_encoder_context = (struct gen6_encoder_context *)hw_context; - obj_context->encode_state.current_render_target = VA_INVALID_SURFACE; - obj_context->encode_state.num_slice_params = 0; - i965_release_buffer_store(&obj_context->encode_state.pic_param); - - for (i = 0; i < obj_context->encode_state.num_slice_params; i++) { - i965_release_buffer_store(&obj_context->encode_state.slice_params[i]); - } - - return VA_STATUS_SUCCESS; + gen6_mfc_context_destroy(&gen6_encoder_context->mfc_context); + gen6_vme_context_destroy(&gen6_encoder_context->vme_context); + free(gen6_encoder_context); } - -void i965_encoder_destroy_context(struct object_heap *heap, struct object_base *obj) +struct hw_context * +gen6_enc_hw_context_init(VADriverContextP ctx, VAProfile profile) { - struct object_context *obj_context = (struct object_context *)obj; - - assert(obj_context->encode_state.num_slice_params <= obj_context->encode_state.max_slice_params); - - i965_release_buffer_store(&obj_context->encode_state.pic_param); - i965_release_buffer_store(&obj_context->encode_state.seq_param); - - free(obj_context->render_targets); - object_heap_free(heap, obj); -} - -Bool i965_encoder_init(VADriverContextP ctx) -{ - struct i965_driver_data *i965 = i965_driver_data(ctx); - - if (IS_GEN6(i965->intel.device_id)) { - gen6_vme_init(ctx); - } - - return True; -} - -Bool i965_encoder_terminate(VADriverContextP ctx) -{ - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct gen6_media_state *media_state = &i965->gen6_media_state; - struct gen6_mfc_bcs_state *bcs_state = &i965->gen6_mfc_bcs_state; - int i; - - if (IS_GEN6(i965->intel.device_id)) { - gen6_vme_terminate(ctx); - } - - for (i = 0; i < MAX_MEDIA_SURFACES_GEN6; i++) { - dri_bo_unreference(media_state->surface_state[i].bo); - media_state->surface_state[i].bo = NULL; - } - - dri_bo_unreference(media_state->idrt.bo); - media_state->idrt.bo = NULL; - - dri_bo_unreference(media_state->binding_table.bo); - media_state->binding_table.bo = NULL; - - dri_bo_unreference(media_state->curbe.bo); - media_state->curbe.bo = NULL; - - dri_bo_unreference(media_state->vme_output.bo); - media_state->vme_output.bo = NULL; - - dri_bo_unreference(media_state->vme_state.bo); - media_state->vme_state.bo = NULL; - - dri_bo_unreference(bcs_state->post_deblocking_output.bo); - bcs_state->post_deblocking_output.bo = NULL; - - dri_bo_unreference(bcs_state->pre_deblocking_output.bo); - bcs_state->pre_deblocking_output.bo = NULL; - - dri_bo_unreference(bcs_state->uncompressed_picture_source.bo); - bcs_state->uncompressed_picture_source.bo = NULL; - - dri_bo_unreference(bcs_state->mfc_indirect_pak_bse_object.bo); - bcs_state->mfc_indirect_pak_bse_object.bo = NULL; - - for (i = 0; i < NUM_MFC_DMV_BUFFERS; i++){ - dri_bo_unreference(bcs_state->direct_mv_buffers[i].bo); - bcs_state->direct_mv_buffers[i].bo = NULL; - } - - dri_bo_unreference(bcs_state->intra_row_store_scratch_buffer.bo); - bcs_state->intra_row_store_scratch_buffer.bo = NULL; - - dri_bo_unreference(bcs_state->deblocking_filter_row_store_scratch_buffer.bo); - bcs_state->deblocking_filter_row_store_scratch_buffer.bo = NULL; + struct gen6_encoder_context *gen6_encoder_context = calloc(1, sizeof(struct gen6_encoder_context)); - dri_bo_unreference(bcs_state->bsd_mpc_row_store_scratch_buffer.bo); - bcs_state->bsd_mpc_row_store_scratch_buffer.bo = NULL; + gen6_encoder_context->base.destroy = gen6_encoder_context_destroy; + gen6_encoder_context->base.run = gen6_encoder_end_picture; + gen6_vme_context_init(ctx, &gen6_encoder_context->vme_context); + gen6_mfc_context_init(ctx, &gen6_encoder_context->mfc_context); - return True; + return (struct hw_context *)gen6_encoder_context; } diff --git a/i965_drv_video/i965_encoder.h b/i965_drv_video/i965_encoder.h index e1e0b16..555efe3 100644 --- a/i965_drv_video/i965_encoder.h +++ b/i965_drv_video/i965_encoder.h @@ -26,8 +26,8 @@ * */ -#ifndef _GEN6_MFC_H_ -#define _GEN6_MFC_H_ +#ifndef _I965_ENCODER_H_ +#define _I965_ENCODER_H_ #include #include @@ -36,40 +36,16 @@ #include "i965_structs.h" #include "i965_drv_video.h" +#include "gen6_vme.h" +#include "gen6_mfc.h" -VAStatus i965_encoder_create_context( - VADriverContextP ctx, - VAConfigID config_id, - int picture_width, - int picture_height, - int flag, - VASurfaceID *render_targets, - int num_render_targets, - struct object_context *obj_context - ); +struct gen6_encoder_context +{ + struct hw_context base; + struct gen6_vme_context vme_context; + struct gen6_mfc_context mfc_context; +}; -VAStatus i965_encoder_begin_picture( - VADriverContextP ctx, - VAContextID context, - VASurfaceID render_target - ); - -VAStatus i965_encoder_render_picture(VADriverContextP ctx, - VAContextID context, - VABufferID *buffers, - int num_buffers - ); - -VAStatus i965_encoder_end_picture(VADriverContextP ctx, - VAContextID context - ); - - -void i965_encoder_destroy_context(struct object_heap *heap, struct object_base *obj); - -Bool i965_encoder_init(VADriverContextP ctx); -Bool i965_encoder_terminate(VADriverContextP ctx); - -#endif /* _GEN6_MFC_H_ */ +#endif /* _I965_ENCODER_H_ */ diff --git a/i965_drv_video/i965_media.c b/i965_drv_video/i965_media.c index 172dde5..8745488 100644 --- a/i965_drv_video/i965_media.c +++ b/i965_drv_video/i965_media.c @@ -28,6 +28,7 @@ */ #include +#include #include #include @@ -35,13 +36,12 @@ #include "intel_batchbuffer.h" #include "intel_driver.h" - #include "i965_defines.h" +#include "i965_drv_video.h" + +#include "i965_media.h" #include "i965_media_mpeg2.h" #include "i965_media_h264.h" -#include "gen6_mfd.h" -#include "i965_media.h" -#include "i965_drv_video.h" static void i965_media_pipeline_select(VADriverContextP ctx) @@ -52,13 +52,12 @@ i965_media_pipeline_select(VADriverContextP ctx) } static void -i965_media_urb_layout(VADriverContextP ctx) +i965_media_urb_layout(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; + struct i965_driver_data *i965 = i965_driver_data(ctx); unsigned int vfe_fence, cs_fence; - vfe_fence = media_state->urb.cs_start; + vfe_fence = media_context->urb.cs_start; cs_fence = URB_SIZE((&i965->intel)); BEGIN_BATCH(ctx, 3); @@ -71,10 +70,9 @@ i965_media_urb_layout(VADriverContextP ctx) } static void -i965_media_state_base_address(VADriverContextP ctx) +i965_media_state_base_address(VADriverContextP ctx, struct i965_media_context *media_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; if (IS_IRONLAKE(i965->intel.device_id)) { BEGIN_BATCH(ctx, 8); @@ -82,9 +80,9 @@ i965_media_state_base_address(VADriverContextP ctx) OUT_BATCH(ctx, 0 | BASE_ADDRESS_MODIFY); OUT_BATCH(ctx, 0 | BASE_ADDRESS_MODIFY); - if (media_state->indirect_object.bo) { - OUT_RELOC(ctx, media_state->indirect_object.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, - media_state->indirect_object.offset | BASE_ADDRESS_MODIFY); + if (media_context->indirect_object.bo) { + OUT_RELOC(ctx, media_context->indirect_object.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, + media_context->indirect_object.offset | BASE_ADDRESS_MODIFY); } else { OUT_BATCH(ctx, 0 | BASE_ADDRESS_MODIFY); } @@ -100,9 +98,9 @@ i965_media_state_base_address(VADriverContextP ctx) OUT_BATCH(ctx, 0 | BASE_ADDRESS_MODIFY); OUT_BATCH(ctx, 0 | BASE_ADDRESS_MODIFY); - if (media_state->indirect_object.bo) { - OUT_RELOC(ctx, media_state->indirect_object.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, - media_state->indirect_object.offset | BASE_ADDRESS_MODIFY); + if (media_context->indirect_object.bo) { + OUT_RELOC(ctx, media_context->indirect_object.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, + media_context->indirect_object.offset | BASE_ADDRESS_MODIFY); } else { OUT_BATCH(ctx, 0 | BASE_ADDRESS_MODIFY); } @@ -114,56 +112,47 @@ i965_media_state_base_address(VADriverContextP ctx) } static void -i965_media_state_pointers(VADriverContextP ctx) +i965_media_state_pointers(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - BEGIN_BATCH(ctx, 3); OUT_BATCH(ctx, CMD_MEDIA_STATE_POINTERS | 1); - if (media_state->extended_state.enabled) - OUT_RELOC(ctx, media_state->extended_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); + if (media_context->extended_state.enabled) + OUT_RELOC(ctx, media_context->extended_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); else OUT_BATCH(ctx, 0); - OUT_RELOC(ctx, media_state->vfe_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + OUT_RELOC(ctx, media_context->vfe_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); ADVANCE_BATCH(ctx); } static void -i965_media_cs_urb_layout(VADriverContextP ctx) +i965_media_cs_urb_layout(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - BEGIN_BATCH(ctx, 2); OUT_BATCH(ctx, CMD_CS_URB_STATE | 0); OUT_BATCH(ctx, - ((media_state->urb.size_cs_entry - 1) << 4) | /* URB Entry Allocation Size */ - (media_state->urb.num_cs_entries << 0)); /* Number of URB Entries */ + ((media_context->urb.size_cs_entry - 1) << 4) | /* URB Entry Allocation Size */ + (media_context->urb.num_cs_entries << 0)); /* Number of URB Entries */ ADVANCE_BATCH(ctx); } static void -i965_media_pipeline_state(VADriverContextP ctx) +i965_media_pipeline_state(VADriverContextP ctx, struct i965_media_context *media_context) { - i965_media_state_base_address(ctx); - i965_media_state_pointers(ctx); - i965_media_cs_urb_layout(ctx); + i965_media_state_base_address(ctx, media_context); + i965_media_state_pointers(ctx, media_context); + i965_media_cs_urb_layout(ctx, media_context); } static void -i965_media_constant_buffer(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_constant_buffer(VADriverContextP ctx, struct decode_state *decode_state, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - BEGIN_BATCH(ctx, 2); OUT_BATCH(ctx, CMD_CONSTANT_BUFFER | (1 << 8) | (2 - 2)); - OUT_RELOC(ctx, media_state->curbe.bo, + OUT_RELOC(ctx, media_context->curbe.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, - media_state->urb.size_cs_entry - 1); + media_context->urb.size_cs_entry - 1); ADVANCE_BATCH(ctx); } @@ -182,82 +171,83 @@ i965_media_depth_buffer(VADriverContextP ctx) } static void -i965_media_pipeline_setup(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_pipeline_setup(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - intel_batchbuffer_start_atomic(ctx, 0x1000); - intel_batchbuffer_emit_mi_flush(ctx); /* step 1 */ + intel_batchbuffer_emit_mi_flush(ctx); /* step 1 */ i965_media_depth_buffer(ctx); - i965_media_pipeline_select(ctx); /* step 2 */ - i965_media_urb_layout(ctx); /* step 3 */ - i965_media_pipeline_state(ctx); /* step 4 */ - i965_media_constant_buffer(ctx, decode_state); /* step 5 */ - assert(media_state->media_objects); - media_state->media_objects(ctx, decode_state); /* step 6 */ + i965_media_pipeline_select(ctx); /* step 2 */ + i965_media_urb_layout(ctx, media_context); /* step 3 */ + i965_media_pipeline_state(ctx, media_context); /* step 4 */ + i965_media_constant_buffer(ctx, decode_state, media_context); /* step 5 */ + assert(media_context->media_objects); + media_context->media_objects(ctx, decode_state, media_context); /* step 6 */ intel_batchbuffer_end_atomic(ctx); } static void -i965_media_decode_init(VADriverContextP ctx, VAProfile profile, struct decode_state *decode_state) +i965_media_decode_init(VADriverContextP ctx, + VAProfile profile, + struct decode_state *decode_state, + struct i965_media_context *media_context) { int i; struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; dri_bo *bo; /* constant buffer */ - dri_bo_unreference(media_state->curbe.bo); + dri_bo_unreference(media_context->curbe.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "constant buffer", 4096, 64); assert(bo); - media_state->curbe.bo = bo; + media_context->curbe.bo = bo; /* surface state */ for (i = 0; i < MAX_MEDIA_SURFACES; i++) { - dri_bo_unreference(media_state->surface_state[i].bo); - media_state->surface_state[i].bo = NULL; + dri_bo_unreference(media_context->surface_state[i].bo); + media_context->surface_state[i].bo = NULL; } /* binding table */ - dri_bo_unreference(media_state->binding_table.bo); + dri_bo_unreference(media_context->binding_table.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "binding table", MAX_MEDIA_SURFACES * sizeof(unsigned int), 32); assert(bo); - media_state->binding_table.bo = bo; + media_context->binding_table.bo = bo; /* interface descriptor remapping table */ - dri_bo_unreference(media_state->idrt.bo); + dri_bo_unreference(media_context->idrt.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "interface discriptor", MAX_INTERFACE_DESC * sizeof(struct i965_interface_descriptor), 16); assert(bo); - media_state->idrt.bo = bo; + media_context->idrt.bo = bo; /* vfe state */ - dri_bo_unreference(media_state->vfe_state.bo); + dri_bo_unreference(media_context->vfe_state.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "vfe state", sizeof(struct i965_vfe_state), 32); assert(bo); - media_state->vfe_state.bo = bo; + media_context->vfe_state.bo = bo; /* extended state */ - media_state->extended_state.enabled = 0; + media_context->extended_state.enabled = 0; switch (profile) { case VAProfileMPEG2Simple: case VAProfileMPEG2Main: - i965_media_mpeg2_decode_init(ctx, decode_state); + i965_media_mpeg2_decode_init(ctx, decode_state, media_context); break; case VAProfileH264Baseline: case VAProfileH264Main: case VAProfileH264High: - i965_media_h264_decode_init(ctx, decode_state); + i965_media_h264_decode_init(ctx, decode_state, media_context); break; default: @@ -266,72 +256,111 @@ i965_media_decode_init(VADriverContextP ctx, VAProfile profile, struct decode_st } } -void +static void i965_media_decode_picture(VADriverContextP ctx, VAProfile profile, - struct decode_state *decode_state) + union codec_state *codec_state, + struct hw_context *hw_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - - if (IS_GEN6(i965->intel.device_id)) { - gen6_mfd_decode_picture(ctx, profile, decode_state); - return; - } + struct i965_media_context *media_context = (struct i965_media_context *)hw_context; + struct decode_state *decode_state = &codec_state->dec; - i965_media_decode_init(ctx, profile, decode_state); - assert(media_state->media_states_setup); - media_state->media_states_setup(ctx, decode_state); - i965_media_pipeline_setup(ctx, decode_state); + i965_media_decode_init(ctx, profile, decode_state, media_context); + assert(media_context->media_states_setup); + media_context->media_states_setup(ctx, decode_state, media_context); + i965_media_pipeline_setup(ctx, decode_state, media_context); } -Bool -i965_media_init(VADriverContextP ctx) +static void +i965_media_context_destroy(void *hw_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); + struct i965_media_context *media_context = (struct i965_media_context *)hw_context; + int i; + + if (media_context->free_private_context) + media_context->free_private_context(&media_context->private_context); + + for (i = 0; i < MAX_MEDIA_SURFACES; i++) { + dri_bo_unreference(media_context->surface_state[i].bo); + media_context->surface_state[i].bo = NULL; + } + + dri_bo_unreference(media_context->extended_state.bo); + media_context->extended_state.bo = NULL; + + dri_bo_unreference(media_context->vfe_state.bo); + media_context->vfe_state.bo = NULL; + + dri_bo_unreference(media_context->idrt.bo); + media_context->idrt.bo = NULL; + + dri_bo_unreference(media_context->binding_table.bo); + media_context->binding_table.bo = NULL; + + dri_bo_unreference(media_context->curbe.bo); + media_context->curbe.bo = NULL; - if (IS_GEN6(i965->intel.device_id)) - return gen6_mfd_init(ctx); + dri_bo_unreference(media_context->indirect_object.bo); + media_context->indirect_object.bo = NULL; - return True; + free(media_context); } -Bool -i965_media_terminate(VADriverContextP ctx) +struct hw_context * +g4x_dec_hw_context_init(VADriverContextP ctx, VAProfile profile) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - int i; + struct i965_media_context *media_context = calloc(1, sizeof(struct i965_media_context)); - if (IS_GEN6(i965->intel.device_id)) - return gen6_mfd_terminate(ctx); + media_context->base.destroy = i965_media_context_destroy; + media_context->base.run = i965_media_decode_picture; - if (media_state->free_private_context) - media_state->free_private_context(&media_state->private_context); + switch (profile) { + case VAProfileMPEG2Simple: + case VAProfileMPEG2Main: + i965_media_mpeg2_dec_context_init(ctx, media_context); + break; - for (i = 0; i < MAX_MEDIA_SURFACES; i++) { - dri_bo_unreference(media_state->surface_state[i].bo); - media_state->surface_state[i].bo = NULL; + case VAProfileH264Baseline: + case VAProfileH264Main: + case VAProfileH264High: + case VAProfileVC1Simple: + case VAProfileVC1Main: + case VAProfileVC1Advanced: + default: + assert(0); + break; } - - dri_bo_unreference(media_state->extended_state.bo); - media_state->extended_state.bo = NULL; - dri_bo_unreference(media_state->vfe_state.bo); - media_state->vfe_state.bo = NULL; + return (struct hw_context *)media_context; +} + +struct hw_context * +ironlake_dec_hw_context_init(VADriverContextP ctx, VAProfile profile) +{ + struct i965_media_context *media_context = calloc(1, sizeof(struct i965_media_context)); - dri_bo_unreference(media_state->idrt.bo); - media_state->idrt.bo = NULL; + media_context->base.destroy = i965_media_context_destroy; + media_context->base.run = i965_media_decode_picture; - dri_bo_unreference(media_state->binding_table.bo); - media_state->binding_table.bo = NULL; + switch (profile) { + case VAProfileMPEG2Simple: + case VAProfileMPEG2Main: + i965_media_mpeg2_dec_context_init(ctx, media_context); + break; - dri_bo_unreference(media_state->curbe.bo); - media_state->curbe.bo = NULL; + case VAProfileH264Baseline: + case VAProfileH264Main: + case VAProfileH264High: + i965_media_h264_dec_context_init(ctx, media_context); + break; - dri_bo_unreference(media_state->indirect_object.bo); - media_state->indirect_object.bo = NULL; + case VAProfileVC1Simple: + case VAProfileVC1Main: + case VAProfileVC1Advanced: + default: + assert(0); + break; + } - return True; + return (struct hw_context *)media_context; } - diff --git a/i965_drv_video/i965_media.h b/i965_drv_video/i965_media.h index 4ed3d4b..2bb6bb2 100644 --- a/i965_drv_video/i965_media.h +++ b/i965_drv_video/i965_media.h @@ -46,17 +46,10 @@ struct decode_state; -struct media_kernel +struct i965_media_context { - char *name; - int interface; - unsigned int (*bin)[4]; - int size; - dri_bo *bo; -}; + struct hw_context base; -struct i965_media_state -{ struct { dri_bo *bo; } surface_state[MAX_MEDIA_SURFACES]; @@ -99,14 +92,9 @@ struct i965_media_state } urb; void *private_context; - void (*media_states_setup)(VADriverContextP ctx, struct decode_state *decode_state); - void (*media_objects)(VADriverContextP ctx, struct decode_state *decode_state); + void (*media_states_setup)(VADriverContextP ctx, struct decode_state *decode_state, struct i965_media_context *media_context); + void (*media_objects)(VADriverContextP ctx, struct decode_state *decode_state, struct i965_media_context *media_context); void (*free_private_context)(void **data); }; -Bool i965_media_init(VADriverContextP ctx); -Bool i965_media_terminate(VADriverContextP ctx); -void i965_media_decode_picture(VADriverContextP ctx, - VAProfile profile, - struct decode_state *decode_state); #endif /* _I965_MEDIA_H_ */ diff --git a/i965_drv_video/i965_media_h264.c b/i965_drv_video/i965_media_h264.c index add774f..e739e52 100644 --- a/i965_drv_video/i965_media_h264.c +++ b/i965_drv_video/i965_media_h264.c @@ -292,10 +292,10 @@ i965_media_h264_surface_state(VADriverContextP ctx, Bool is_dst, int vert_line_stride, int vert_line_stride_ofs, - int format) + int format, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; + struct i965_driver_data *i965 = i965_driver_data(ctx); struct i965_surface_state *ss; dri_bo *bo; uint32_t write_domain, read_domain; @@ -333,15 +333,15 @@ i965_media_h264_surface_state(VADriverContextP ctx, dri_bo_unmap(bo); assert(index < MAX_MEDIA_SURFACES); - media_state->surface_state[index].bo = bo; + media_context->surface_state[index].bo = bo; } static void i965_media_h264_surfaces_setup(VADriverContextP ctx, - struct decode_state *decode_state) + struct decode_state *decode_state, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; + struct i965_driver_data *i965 = i965_driver_data(ctx); struct i965_h264_context *i965_h264_context; struct object_surface *obj_surface; VAPictureParameterBufferH264 *pic_param; @@ -349,8 +349,8 @@ i965_media_h264_surfaces_setup(VADriverContextP ctx, int i, j, w, h; int field_picture; - assert(media_state->private_context); - i965_h264_context = (struct i965_h264_context *)media_state->private_context; + assert(media_context->private_context); + i965_h264_context = (struct i965_h264_context *)media_context->private_context; assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; @@ -368,13 +368,15 @@ i965_media_h264_surfaces_setup(VADriverContextP ctx, 1, field_picture, !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD), - I965_SURFACEFORMAT_R8_SINT); /* Y */ + I965_SURFACEFORMAT_R8_SINT, /* Y */ + media_context); i965_media_h264_surface_state(ctx, 1, obj_surface, w * h, w / 4, h / 2 / (1 + field_picture), w, 1, field_picture, !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD), - I965_SURFACEFORMAT_R8G8_SINT); /* INTERLEAVED U/V */ + I965_SURFACEFORMAT_R8G8_SINT, /* INTERLEAVED U/V */ + media_context); /* Reference Pictures */ for (i = 0; i < ARRAY_ELEMS(i965_h264_context->fsid_list); i++) { @@ -404,25 +406,25 @@ i965_media_h264_surfaces_setup(VADriverContextP ctx, 0, field_picture, !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD), - I965_SURFACEFORMAT_R8_SINT); /* Y */ + I965_SURFACEFORMAT_R8_SINT, /* Y */ + media_context); i965_media_h264_surface_state(ctx, 18 + i, obj_surface, w * h, w / 4, h / 2 / (1 + field_picture), w, 0, field_picture, !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD), - I965_SURFACEFORMAT_R8G8_SINT); /* INTERLEAVED U/V */ + I965_SURFACEFORMAT_R8G8_SINT, /* INTERLEAVED U/V */ + media_context); } } } static void -i965_media_h264_binding_table(VADriverContextP ctx) +i965_media_h264_binding_table(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; int i; unsigned int *binding_table; - dri_bo *bo = media_state->binding_table.bo; + dri_bo *bo = media_context->binding_table.bo; dri_bo_map(bo, 1); assert(bo->virtual); @@ -430,29 +432,27 @@ i965_media_h264_binding_table(VADriverContextP ctx) memset(binding_table, 0, bo->size); for (i = 0; i < MAX_MEDIA_SURFACES; i++) { - if (media_state->surface_state[i].bo) { - binding_table[i] = media_state->surface_state[i].bo->offset; + if (media_context->surface_state[i].bo) { + binding_table[i] = media_context->surface_state[i].bo->offset; dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0, i * sizeof(*binding_table), - media_state->surface_state[i].bo); + media_context->surface_state[i].bo); } } - dri_bo_unmap(media_state->binding_table.bo); + dri_bo_unmap(media_context->binding_table.bo); } static void -i965_media_h264_interface_descriptor_remap_table(VADriverContextP ctx) +i965_media_h264_interface_descriptor_remap_table(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_interface_descriptor *desc; int i; dri_bo *bo; - bo = media_state->idrt.bo; + bo = media_context->idrt.bo; dri_bo_map(bo, 1); assert(bo->virtual); desc = bo->virtual; @@ -466,7 +466,7 @@ i965_media_h264_interface_descriptor_remap_table(VADriverContextP ctx) desc->desc1.const_urb_entry_read_len = 2; desc->desc3.binding_table_entry_count = 0; desc->desc3.binding_table_pointer = - media_state->binding_table.bo->offset >> 5; /*reloc */ + media_context->binding_table.bo->offset >> 5; /*reloc */ dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, @@ -478,7 +478,7 @@ i965_media_h264_interface_descriptor_remap_table(VADriverContextP ctx) I915_GEM_DOMAIN_INSTRUCTION, 0, desc->desc3.binding_table_entry_count, i * sizeof(*desc) + offsetof(struct i965_interface_descriptor, desc3), - media_state->binding_table.bo); + media_context->binding_table.bo); desc++; } @@ -486,57 +486,54 @@ i965_media_h264_interface_descriptor_remap_table(VADriverContextP ctx) } static void -i965_media_h264_vfe_state(VADriverContextP ctx) +i965_media_h264_vfe_state(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_vfe_state *vfe_state; dri_bo *bo; - bo = media_state->vfe_state.bo; + bo = media_context->vfe_state.bo; dri_bo_map(bo, 1); assert(bo->virtual); vfe_state = bo->virtual; memset(vfe_state, 0, sizeof(*vfe_state)); vfe_state->vfe0.extend_vfe_state_present = 1; - vfe_state->vfe1.max_threads = media_state->urb.num_vfe_entries - 1; - vfe_state->vfe1.urb_entry_alloc_size = media_state->urb.size_vfe_entry - 1; - vfe_state->vfe1.num_urb_entries = media_state->urb.num_vfe_entries; + vfe_state->vfe1.max_threads = media_context->urb.num_vfe_entries - 1; + vfe_state->vfe1.urb_entry_alloc_size = media_context->urb.size_vfe_entry - 1; + vfe_state->vfe1.num_urb_entries = media_context->urb.num_vfe_entries; vfe_state->vfe1.vfe_mode = VFE_AVC_IT_MODE; vfe_state->vfe1.children_present = 0; vfe_state->vfe2.interface_descriptor_base = - media_state->idrt.bo->offset >> 4; /* reloc */ + media_context->idrt.bo->offset >> 4; /* reloc */ dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0, offsetof(struct i965_vfe_state, vfe2), - media_state->idrt.bo); + media_context->idrt.bo); dri_bo_unmap(bo); } static void i965_media_h264_vfe_state_extension(VADriverContextP ctx, - struct decode_state *decode_state) + struct decode_state *decode_state, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_h264_context *i965_h264_context; struct i965_vfe_state_ex *vfe_state_ex; VAPictureParameterBufferH264 *pic_param; int mbaff_frame_flag; - assert(media_state->private_context); - i965_h264_context = (struct i965_h264_context *)media_state->private_context; + assert(media_context->private_context); + i965_h264_context = (struct i965_h264_context *)media_context->private_context; assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; mbaff_frame_flag = (pic_param->seq_fields.bits.mb_adaptive_frame_field_flag && !pic_param->pic_fields.bits.field_pic_flag); - assert(media_state->extended_state.bo); - dri_bo_map(media_state->extended_state.bo, 1); - assert(media_state->extended_state.bo->virtual); - vfe_state_ex = media_state->extended_state.bo->virtual; + assert(media_context->extended_state.bo); + dri_bo_map(media_context->extended_state.bo, 1); + assert(media_context->extended_state.bo->virtual); + vfe_state_ex = media_context->extended_state.bo->virtual; memset(vfe_state_ex, 0, sizeof(*vfe_state_ex)); /* @@ -643,27 +640,27 @@ i965_media_h264_vfe_state_extension(VADriverContextP ctx, vfe_state_ex->scoreboard2.delta_y7 = -2; } - dri_bo_unmap(media_state->extended_state.bo); + dri_bo_unmap(media_context->extended_state.bo); } static void -i965_media_h264_upload_constants(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_h264_upload_constants(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_h264_context *i965_h264_context; unsigned char *constant_buffer; VASliceParameterBufferH264 *slice_param; - assert(media_state->private_context); - i965_h264_context = (struct i965_h264_context *)media_state->private_context; + assert(media_context->private_context); + i965_h264_context = (struct i965_h264_context *)media_context->private_context; assert(decode_state->slice_params[0] && decode_state->slice_params[0]->buffer); slice_param = (VASliceParameterBufferH264 *)decode_state->slice_params[0]->buffer; - dri_bo_map(media_state->curbe.bo, 1); - assert(media_state->curbe.bo->virtual); - constant_buffer = media_state->curbe.bo->virtual; + dri_bo_map(media_context->curbe.bo, 1); + assert(media_context->curbe.bo->virtual); + constant_buffer = media_context->curbe.bo->virtual; /* HW solution for W=128 */ if (i965_h264_context->use_hw_w128) { @@ -684,41 +681,42 @@ i965_media_h264_upload_constants(VADriverContextP ctx, struct decode_state *deco } } - dri_bo_unmap(media_state->curbe.bo); + dri_bo_unmap(media_context->curbe.bo); } static void -i965_media_h264_states_setup(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_h264_states_setup(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_h264_context *i965_h264_context; - assert(media_state->private_context); - i965_h264_context = (struct i965_h264_context *)media_state->private_context; + assert(media_context->private_context); + i965_h264_context = (struct i965_h264_context *)media_context->private_context; - i965_avc_bsd_pipeline(ctx, decode_state); + i965_avc_bsd_pipeline(ctx, decode_state, i965_h264_context); - i965_avc_hw_scoreboard(ctx, decode_state); + if (i965_h264_context->use_avc_hw_scoreboard) + i965_avc_hw_scoreboard(ctx, decode_state, i965_h264_context); - i965_media_h264_surfaces_setup(ctx, decode_state); - i965_media_h264_binding_table(ctx); - i965_media_h264_interface_descriptor_remap_table(ctx); - i965_media_h264_vfe_state_extension(ctx, decode_state); - i965_media_h264_vfe_state(ctx); - i965_media_h264_upload_constants(ctx, decode_state); + i965_media_h264_surfaces_setup(ctx, decode_state, media_context); + i965_media_h264_binding_table(ctx, media_context); + i965_media_h264_interface_descriptor_remap_table(ctx, media_context); + i965_media_h264_vfe_state_extension(ctx, decode_state, media_context); + i965_media_h264_vfe_state(ctx, media_context); + i965_media_h264_upload_constants(ctx, decode_state, media_context); } static void -i965_media_h264_objects(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_h264_objects(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_h264_context *i965_h264_context; unsigned int *object_command; - assert(media_state->private_context); - i965_h264_context = (struct i965_h264_context *)media_state->private_context; + assert(media_context->private_context); + i965_h264_context = (struct i965_h264_context *)media_context->private_context; dri_bo_map(i965_h264_context->avc_it_command_mb_info.bo, True); assert(i965_h264_context->avc_it_command_mb_info.bo->virtual); @@ -742,7 +740,7 @@ i965_media_h264_objects(VADriverContextP ctx, struct decode_state *decode_state) intel_batchbuffer_end_atomic(ctx); intel_batchbuffer_flush(ctx); intel_batchbuffer_start_atomic(ctx, 0x1000); - i965_avc_ildb(ctx, decode_state); + i965_avc_ildb(ctx, decode_state, i965_h264_context); } static void @@ -772,80 +770,15 @@ i965_media_h264_free_private_context(void **data) } void -i965_media_h264_decode_init(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_h264_decode_init(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; - struct i965_h264_context *i965_h264_context; + struct i965_h264_context *i965_h264_context = media_context->private_context; dri_bo *bo; - int i; VAPictureParameterBufferH264 *pic_param; - i965_h264_context = media_state->private_context; - - if (i965_h264_context == NULL) { - /* kernel */ - assert(NUM_H264_AVC_KERNELS == (sizeof(h264_avc_kernels_gen5) / - sizeof(h264_avc_kernels_gen5[0]))); - assert(NUM_AVC_MC_INTERFACES == (sizeof(avc_mc_kernel_offset_gen5) / - sizeof(avc_mc_kernel_offset_gen5[0]))); - - i965_h264_context = calloc(1, sizeof(struct i965_h264_context)); - - if (IS_IRONLAKE(i965->intel.device_id)) { - h264_avc_kernels = h264_avc_kernels_gen5; - avc_mc_kernel_offset = avc_mc_kernel_offset_gen5; - intra_kernel_header = &intra_kernel_header_gen5; - i965_h264_context->use_avc_hw_scoreboard = 1; - i965_h264_context->use_hw_w128 = 1; - } else { - h264_avc_kernels = h264_avc_kernels_gen4; - avc_mc_kernel_offset = avc_mc_kernel_offset_gen4; - intra_kernel_header = &intra_kernel_header_gen4; - i965_h264_context->use_avc_hw_scoreboard = 0; - i965_h264_context->use_hw_w128 = 0; - } - - for (i = 0; i < NUM_H264_AVC_KERNELS; i++) { - struct media_kernel *kernel = &h264_avc_kernels[i]; - kernel->bo = dri_bo_alloc(i965->intel.bufmgr, - kernel->name, - kernel->size, 0x1000); - assert(kernel->bo); - 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; - } - - media_state->private_context = i965_h264_context; - media_state->free_private_context = i965_media_h264_free_private_context; - - /* URB */ - if (IS_IRONLAKE(i965->intel.device_id)) { - media_state->urb.num_vfe_entries = 63; - } else { - media_state->urb.num_vfe_entries = 23; - } - - media_state->urb.size_vfe_entry = 16; - - media_state->urb.num_cs_entries = 1; - media_state->urb.size_cs_entry = 1; - - media_state->urb.vfe_start = 0; - media_state->urb.cs_start = media_state->urb.vfe_start + - media_state->urb.num_vfe_entries * media_state->urb.size_vfe_entry; - assert(media_state->urb.cs_start + - media_state->urb.num_cs_entries * media_state->urb.size_cs_entry <= URB_SIZE((&i965->intel))); - - /* hook functions */ - media_state->media_states_setup = i965_media_h264_states_setup; - media_state->media_objects = i965_media_h264_objects; - } - assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; i965_h264_context->picture.width_in_mbs = ((pic_param->picture_width_in_mbs_minus1 + 1) & 0xff); @@ -874,10 +807,10 @@ i965_media_h264_decode_init(VADriverContextP ctx, struct decode_state *decode_st assert(bo); i965_h264_context->avc_it_data.bo = bo; i965_h264_context->avc_it_data.write_offset = 0; - dri_bo_unreference(media_state->indirect_object.bo); - media_state->indirect_object.bo = bo; - dri_bo_reference(media_state->indirect_object.bo); - media_state->indirect_object.offset = i965_h264_context->avc_it_data.write_offset; + dri_bo_unreference(media_context->indirect_object.bo); + media_context->indirect_object.bo = bo; + dri_bo_reference(media_context->indirect_object.bo); + media_context->indirect_object.offset = i965_h264_context->avc_it_data.write_offset; dri_bo_unreference(i965_h264_context->avc_ildb_data.bo); bo = dri_bo_alloc(i965->intel.bufmgr, @@ -888,20 +821,92 @@ i965_media_h264_decode_init(VADriverContextP ctx, struct decode_state *decode_st i965_h264_context->avc_ildb_data.bo = bo; /* bsd pipeline */ - i965_avc_bsd_decode_init(ctx); + i965_avc_bsd_decode_init(ctx, i965_h264_context); /* HW scoreboard */ - i965_avc_hw_scoreboard_decode_init(ctx); + if (i965_h264_context->use_avc_hw_scoreboard) + i965_avc_hw_scoreboard_decode_init(ctx, i965_h264_context); /* ILDB */ - i965_avc_ildb_decode_init(ctx); + i965_avc_ildb_decode_init(ctx, i965_h264_context); /* for Media pipeline */ - media_state->extended_state.enabled = 1; - dri_bo_unreference(media_state->extended_state.bo); + media_context->extended_state.enabled = 1; + dri_bo_unreference(media_context->extended_state.bo); bo = dri_bo_alloc(i965->intel.bufmgr, "extened vfe state", sizeof(struct i965_vfe_state_ex), 32); assert(bo); - media_state->extended_state.bo = bo; + media_context->extended_state.bo = bo; +} + +void +i965_media_h264_dec_context_init(VADriverContextP ctx, struct i965_media_context *media_context) +{ + struct i965_driver_data *i965 = i965_driver_data(ctx); + struct i965_h264_context *i965_h264_context; + int i; + + i965_h264_context = calloc(1, sizeof(struct i965_h264_context)); + + /* kernel */ + if (h264_avc_kernels == NULL) { + assert(NUM_H264_AVC_KERNELS == (sizeof(h264_avc_kernels_gen5) / + sizeof(h264_avc_kernels_gen5[0]))); + assert(NUM_AVC_MC_INTERFACES == (sizeof(avc_mc_kernel_offset_gen5) / + sizeof(avc_mc_kernel_offset_gen5[0]))); + + if (IS_IRONLAKE(i965->intel.device_id)) { + h264_avc_kernels = h264_avc_kernels_gen5; + avc_mc_kernel_offset = avc_mc_kernel_offset_gen5; + intra_kernel_header = &intra_kernel_header_gen5; + i965_h264_context->use_avc_hw_scoreboard = 1; + i965_h264_context->use_hw_w128 = 1; + } else { + h264_avc_kernels = h264_avc_kernels_gen4; + avc_mc_kernel_offset = avc_mc_kernel_offset_gen4; + intra_kernel_header = &intra_kernel_header_gen4; + i965_h264_context->use_avc_hw_scoreboard = 0; + i965_h264_context->use_hw_w128 = 0; + } + + for (i = 0; i < NUM_H264_AVC_KERNELS; i++) { + struct media_kernel *kernel = &h264_avc_kernels[i]; + kernel->bo = dri_bo_alloc(i965->intel.bufmgr, + kernel->name, + kernel->size, 0x1000); + assert(kernel->bo); + 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; + } + + media_context->private_context = i965_h264_context; + media_context->free_private_context = i965_media_h264_free_private_context; + + /* URB */ + if (IS_IRONLAKE(i965->intel.device_id)) { + media_context->urb.num_vfe_entries = 63; + } else { + media_context->urb.num_vfe_entries = 23; + } + + media_context->urb.size_vfe_entry = 16; + + media_context->urb.num_cs_entries = 1; + media_context->urb.size_cs_entry = 1; + + media_context->urb.vfe_start = 0; + media_context->urb.cs_start = media_context->urb.vfe_start + + media_context->urb.num_vfe_entries * media_context->urb.size_vfe_entry; + assert(media_context->urb.cs_start + + media_context->urb.num_cs_entries * media_context->urb.size_cs_entry <= URB_SIZE((&i965->intel))); + + /* hook functions */ + media_context->media_states_setup = i965_media_h264_states_setup; + media_context->media_objects = i965_media_h264_objects; } diff --git a/i965_drv_video/i965_media_h264.h b/i965_drv_video/i965_media_h264.h index d1b6214..3af7e8d 100644 --- a/i965_drv_video/i965_media_h264.h +++ b/i965_drv_video/i965_media_h264.h @@ -5,6 +5,9 @@ #include "i965_avc_hw_scoreboard.h" #include "i965_avc_ildb.h" +struct decode_state; +struct i965_media_context; + #define INST_UNIT_GEN4 16 #define INST_UNIT_GEN5 8 @@ -61,6 +64,7 @@ struct i965_h264_context } fsid_list[16]; }; -void i965_media_h264_decode_init(VADriverContextP ctx, struct decode_state *decode_state); +void i965_media_h264_decode_init(VADriverContextP ctx, struct decode_state *decode_state, struct i965_media_context *media_context); +void i965_media_h264_dec_context_init(VADriverContextP ctx, struct i965_media_context *media_context); #endif /* _I965_MEDIA_H264_H_ */ diff --git a/i965_drv_video/i965_media_mpeg2.c b/i965_drv_video/i965_media_mpeg2.c index 6b20d89..db02025 100644 --- a/i965_drv_video/i965_media_mpeg2.c +++ b/i965_drv_video/i965_media_mpeg2.c @@ -35,11 +35,11 @@ #include "intel_batchbuffer.h" #include "intel_driver.h" - #include "i965_defines.h" +#include "i965_drv_video.h" + #include "i965_media.h" #include "i965_media_mpeg2.h" -#include "i965_drv_video.h" #define SURFACE_TARGET 0 #define SURFACE_FORWARD 1 @@ -462,10 +462,10 @@ i965_media_mpeg2_surface_state(VADriverContextP ctx, int w, int h, Bool is_dst, int vert_line_stride, - int vert_line_stride_ofs) + int vert_line_stride_ofs, + struct i965_media_context *media_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_surface_state *ss; dri_bo *bo; uint32_t write_domain, read_domain; @@ -503,8 +503,8 @@ i965_media_mpeg2_surface_state(VADriverContextP ctx, dri_bo_unmap(bo); assert(index < MAX_MEDIA_SURFACES); -// assert(media_state->surface_state[index].bo == NULL); - media_state->surface_state[index].bo = bo; +// assert(media_context->surface_state[index].bo == NULL); + media_context->surface_state[index].bo = bo; } static void @@ -513,7 +513,8 @@ i965_media_mpeg2_surface_setup(VADriverContextP ctx, struct object_surface *obj_surface, Bool is_dst, int picture_structure, - int surface) + int surface, + struct i965_media_context *media_context) { int w = obj_surface->width; int h = obj_surface->height; @@ -529,64 +530,80 @@ i965_media_mpeg2_surface_setup(VADriverContextP ctx, if (picture_structure == MPEG_FRAME) { i965_media_mpeg2_surface_state(ctx, base_index + 0, obj_surface, - 0, w, h, - is_dst, 0, 0); + 0, w, h, + is_dst, 0, 0, + media_context); i965_media_mpeg2_surface_state(ctx, base_index + 1, obj_surface, - w * h, w / 2, h / 2, - is_dst, 0, 0); + w * h, w / 2, h / 2, + is_dst, 0, 0, + media_context); i965_media_mpeg2_surface_state(ctx, base_index + 2, obj_surface, - w * h + w * h / 4, w / 2, h / 2, - is_dst, 0, 0); + w * h + w * h / 4, w / 2, h / 2, + is_dst, 0, 0, + media_context); } else { if (surface == SURFACE_TARGET) { i965_media_mpeg2_surface_state(ctx, 3, obj_surface, - 0, w, h, - False, 0, 0); + 0, w, h, + False, 0, 0, + media_context); i965_media_mpeg2_surface_state(ctx, 10, obj_surface, - w * h, w / 2, h / 2, - False, 0, 0); + w * h, w / 2, h / 2, + False, 0, 0, + media_context); i965_media_mpeg2_surface_state(ctx, 11, obj_surface, - w * h + w * h / 4, w / 2, h / 2, - False, 0, 0); + w * h + w * h / 4, w / 2, h / 2, + False, 0, 0, + media_context); if (picture_structure == MPEG_TOP_FIELD) { i965_media_mpeg2_surface_state(ctx, base_index + 0, obj_surface, - 0, w, h, - True, 1, 0); + 0, w, h, + True, 1, 0, + media_context); i965_media_mpeg2_surface_state(ctx, base_index + 1, obj_surface, - w * h, w / 2, h / 2, - True, 1, 0); + w * h, w / 2, h / 2, + True, 1, 0, + media_context); i965_media_mpeg2_surface_state(ctx, base_index + 2, obj_surface, - w * h + w * h / 4, w / 2, h / 2, - True, 1, 0); + w * h + w * h / 4, w / 2, h / 2, + True, 1, 0, + media_context); } else { assert(picture_structure == MPEG_BOTTOM_FIELD); i965_media_mpeg2_surface_state(ctx, base_index + 0, obj_surface, - 0, w, h, - True, 1, 1); + 0, w, h, + True, 1, 1, + media_context); i965_media_mpeg2_surface_state(ctx, base_index + 1, obj_surface, - w * h, w / 2, h / 2, - True, 1, 1); + w * h, w / 2, h / 2, + True, 1, 1, + media_context); i965_media_mpeg2_surface_state(ctx, base_index + 2, obj_surface, - w * h + w * h / 4, w / 2, h / 2, - True, 1, 1); + w * h + w * h / 4, w / 2, h / 2, + True, 1, 1, + media_context); } } else { i965_media_mpeg2_surface_state(ctx, base_index + 0, obj_surface, - 0, w, h, - is_dst, 0, 0); + 0, w, h, + is_dst, 0, 0, + media_context); i965_media_mpeg2_surface_state(ctx, base_index + 1, obj_surface, - w * h, w / 2, h / 2, - is_dst, 0, 0); + w * h, w / 2, h / 2, + is_dst, 0, 0, + media_context); i965_media_mpeg2_surface_state(ctx, base_index + 2, obj_surface, - w * h + w * h / 4, w / 2, h / 2, - is_dst, 0, 0); + w * h + w * h / 4, w / 2, h / 2, + is_dst, 0, 0, + media_context); } } } void i965_media_mpeg2_surfaces_setup(VADriverContextP ctx, - struct decode_state *decode_state) + struct decode_state *decode_state, + struct i965_media_context *media_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); struct object_surface *obj_surface; @@ -598,37 +615,43 @@ i965_media_mpeg2_surfaces_setup(VADriverContextP ctx, obj_surface = SURFACE(decode_state->current_render_target); assert(obj_surface); i965_media_mpeg2_surface_setup(ctx, 0, obj_surface, True, - param->picture_coding_extension.bits.picture_structure, SURFACE_TARGET); + param->picture_coding_extension.bits.picture_structure, + SURFACE_TARGET, + media_context); obj_surface = SURFACE(param->forward_reference_picture); if (!obj_surface) { // assert(param->picture_coding_type == 1); /* I-picture */ } else { i965_media_mpeg2_surface_setup(ctx, 4, obj_surface, False, - param->picture_coding_extension.bits.picture_structure, SURFACE_FORWARD); + param->picture_coding_extension.bits.picture_structure, + SURFACE_FORWARD, + media_context); obj_surface = SURFACE(param->backward_reference_picture); if (!obj_surface) { assert(param->picture_coding_type == 2); /* P-picture */ obj_surface = SURFACE(param->forward_reference_picture); i965_media_mpeg2_surface_setup(ctx, 7, obj_surface, False, - param->picture_coding_extension.bits.picture_structure, SURFACE_BACKWARD); + param->picture_coding_extension.bits.picture_structure, + SURFACE_BACKWARD, + media_context); } else { assert(param->picture_coding_type == 3); /* B-picture */ i965_media_mpeg2_surface_setup(ctx, 7, obj_surface, False, - param->picture_coding_extension.bits.picture_structure, SURFACE_BIDIRECT); + param->picture_coding_extension.bits.picture_structure, + SURFACE_BIDIRECT, + media_context); } } } static void -i965_media_mpeg2_binding_table(VADriverContextP ctx) +i965_media_mpeg2_binding_table(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; int i; unsigned int *binding_table; - dri_bo *bo = media_state->binding_table.bo; + dri_bo *bo = media_context->binding_table.bo; dri_bo_map(bo, 1); assert(bo->virtual); @@ -636,58 +659,54 @@ i965_media_mpeg2_binding_table(VADriverContextP ctx) memset(binding_table, 0, bo->size); for (i = 0; i < MAX_MEDIA_SURFACES; i++) { - if (media_state->surface_state[i].bo) { - binding_table[i] = media_state->surface_state[i].bo->offset; + if (media_context->surface_state[i].bo) { + binding_table[i] = media_context->surface_state[i].bo->offset; dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0, i * sizeof(*binding_table), - media_state->surface_state[i].bo); + media_context->surface_state[i].bo); } } - dri_bo_unmap(media_state->binding_table.bo); + dri_bo_unmap(media_context->binding_table.bo); } static void -i965_media_mpeg2_vfe_state(VADriverContextP ctx) +i965_media_mpeg2_vfe_state(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_vfe_state *vfe_state; dri_bo *bo; - bo = media_state->vfe_state.bo; + bo = media_context->vfe_state.bo; dri_bo_map(bo, 1); assert(bo->virtual); vfe_state = bo->virtual; memset(vfe_state, 0, sizeof(*vfe_state)); vfe_state->vfe0.extend_vfe_state_present = 1; vfe_state->vfe1.vfe_mode = VFE_VLD_MODE; - vfe_state->vfe1.num_urb_entries = media_state->urb.num_vfe_entries; + vfe_state->vfe1.num_urb_entries = media_context->urb.num_vfe_entries; vfe_state->vfe1.children_present = 0; - vfe_state->vfe1.urb_entry_alloc_size = media_state->urb.size_vfe_entry - 1; - vfe_state->vfe1.max_threads = media_state->urb.num_vfe_entries - 1; + vfe_state->vfe1.urb_entry_alloc_size = media_context->urb.size_vfe_entry - 1; + vfe_state->vfe1.max_threads = media_context->urb.num_vfe_entries - 1; vfe_state->vfe2.interface_descriptor_base = - media_state->idrt.bo->offset >> 4; /* reloc */ + media_context->idrt.bo->offset >> 4; /* reloc */ dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0, offsetof(struct i965_vfe_state, vfe2), - media_state->idrt.bo); + media_context->idrt.bo); dri_bo_unmap(bo); } static void -i965_media_mpeg2_interface_descriptor_remap_table(VADriverContextP ctx) +i965_media_mpeg2_interface_descriptor_remap_table(VADriverContextP ctx, struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_interface_descriptor *desc; int i; dri_bo *bo; - bo = media_state->idrt.bo; + bo = media_context->idrt.bo; dri_bo_map(bo, 1); assert(bo->virtual); desc = bo->virtual; @@ -700,7 +719,7 @@ i965_media_mpeg2_interface_descriptor_remap_table(VADriverContextP ctx) desc->desc1.const_urb_entry_read_len = 30; desc->desc3.binding_table_entry_count = 0; desc->desc3.binding_table_pointer = - media_state->binding_table.bo->offset >> 5; /*reloc */ + media_context->binding_table.bo->offset >> 5; /*reloc */ dri_bo_emit_reloc(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, @@ -712,7 +731,7 @@ i965_media_mpeg2_interface_descriptor_remap_table(VADriverContextP ctx) I915_GEM_DOMAIN_INSTRUCTION, 0, desc->desc3.binding_table_entry_count, i * sizeof(*desc) + offsetof(struct i965_interface_descriptor, desc3), - media_state->binding_table.bo); + media_context->binding_table.bo); desc++; } @@ -720,20 +739,20 @@ i965_media_mpeg2_interface_descriptor_remap_table(VADriverContextP ctx) } void -i965_media_mpeg2_vld_state(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_mpeg2_vld_state(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; struct i965_vld_state *vld_state; VAPictureParameterBufferMPEG2 *param; assert(decode_state->pic_param && decode_state->pic_param->buffer); param = (VAPictureParameterBufferMPEG2 *)decode_state->pic_param->buffer; - assert(media_state->extended_state.bo); - dri_bo_map(media_state->extended_state.bo, 1); - assert(media_state->extended_state.bo->virtual); - vld_state = media_state->extended_state.bo->virtual; + assert(media_context->extended_state.bo); + dri_bo_map(media_context->extended_state.bo, 1); + assert(media_context->extended_state.bo->virtual); + vld_state = media_context->extended_state.bo->virtual; memset(vld_state, 0, sizeof(*vld_state)); vld_state->vld0.f_code_0_0 = ((param->f_code >> 12) & 0xf); @@ -782,23 +801,23 @@ i965_media_mpeg2_vld_state(VADriverContextP ctx, struct decode_state *decode_sta vld_state->desc_remap_table0.index_7 = FIELD_BIDIRECT_16X8; } - dri_bo_unmap(media_state->extended_state.bo); + dri_bo_unmap(media_context->extended_state.bo); } static void -i965_media_mpeg2_upload_constants(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_mpeg2_upload_constants(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; int i, j; unsigned char *constant_buffer; unsigned char *qmx; unsigned int *lib_reloc; int lib_reloc_offset = 0; - dri_bo_map(media_state->curbe.bo, 1); - assert(media_state->curbe.bo->virtual); - constant_buffer = media_state->curbe.bo->virtual; + dri_bo_map(media_context->curbe.bo, 1); + assert(media_context->curbe.bo->virtual); + constant_buffer = media_context->curbe.bo->virtual; /* iq_matrix */ if (decode_state->iq_matrix && decode_state->iq_matrix->buffer) { @@ -836,29 +855,33 @@ i965_media_mpeg2_upload_constants(VADriverContextP ctx, struct decode_state *dec lib_reloc = (unsigned int *)(constant_buffer + lib_reloc_offset); for (i = 0; i < 8; i++) { lib_reloc[i] = mpeg2_vld_kernels[LIB_INTERFACE].bo->offset; - dri_bo_emit_reloc(media_state->curbe.bo, + dri_bo_emit_reloc(media_context->curbe.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0, lib_reloc_offset + i * sizeof(unsigned int), mpeg2_vld_kernels[LIB_INTERFACE].bo); } - dri_bo_unmap(media_state->curbe.bo); + dri_bo_unmap(media_context->curbe.bo); } static void -i965_media_mpeg2_states_setup(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_mpeg2_states_setup(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { - i965_media_mpeg2_surfaces_setup(ctx, decode_state); - i965_media_mpeg2_binding_table(ctx); - i965_media_mpeg2_interface_descriptor_remap_table(ctx); - i965_media_mpeg2_vld_state(ctx, decode_state); - i965_media_mpeg2_vfe_state(ctx); - i965_media_mpeg2_upload_constants(ctx, decode_state); + i965_media_mpeg2_surfaces_setup(ctx, decode_state, media_context); + i965_media_mpeg2_binding_table(ctx, media_context); + i965_media_mpeg2_interface_descriptor_remap_table(ctx, media_context); + i965_media_mpeg2_vld_state(ctx, decode_state, media_context); + i965_media_mpeg2_vfe_state(ctx, media_context); + i965_media_mpeg2_upload_constants(ctx, decode_state, media_context); } static void -i965_media_mpeg2_objects(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_mpeg2_objects(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { int i, j; VASliceParameterBufferMPEG2 *slice_param; @@ -906,14 +929,33 @@ i965_media_mpeg2_free_private_context(void **data) } void -i965_media_mpeg2_decode_init(VADriverContextP ctx, struct decode_state *decode_state) +i965_media_mpeg2_decode_init(VADriverContextP ctx, + struct decode_state *decode_state, + struct i965_media_context *media_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_media_state *media_state = &i965->media_state; dri_bo *bo; + + dri_bo_unreference(media_context->indirect_object.bo); + media_context->indirect_object.bo = NULL; + + media_context->extended_state.enabled = 1; + dri_bo_unreference(media_context->extended_state.bo); + bo = dri_bo_alloc(i965->intel.bufmgr, + "vld state", + sizeof(struct i965_vld_state), 32); + assert(bo); + media_context->extended_state.bo = bo; +} + +void +i965_media_mpeg2_dec_context_init(VADriverContextP ctx, struct i965_media_context *media_context) +{ + struct i965_driver_data *i965 = i965_driver_data(ctx); int i; + + /* kernel */ if (mpeg2_vld_kernels == NULL) { - /* kernel */ assert(NUM_MPEG2_VLD_KERNELS == (sizeof(mpeg2_vld_kernels_gen5) / sizeof(mpeg2_vld_kernels_gen5[0]))); assert(NUM_MPEG2_VLD_KERNELS <= MAX_INTERFACE_DESC); @@ -931,33 +973,24 @@ i965_media_mpeg2_decode_init(VADriverContextP ctx, struct decode_state *decode_s assert(kernel->bo); dri_bo_subdata(kernel->bo, 0, kernel->size, kernel->bin); } + } - /* URB */ - media_state->urb.num_vfe_entries = 28; - media_state->urb.size_vfe_entry = 13; - - media_state->urb.num_cs_entries = 1; - media_state->urb.size_cs_entry = 16; + /* URB */ + media_context->urb.num_vfe_entries = 28; + media_context->urb.size_vfe_entry = 13; - media_state->urb.vfe_start = 0; - media_state->urb.cs_start = media_state->urb.vfe_start + - media_state->urb.num_vfe_entries * media_state->urb.size_vfe_entry; - assert(media_state->urb.cs_start + - media_state->urb.num_cs_entries * media_state->urb.size_cs_entry <= URB_SIZE((&i965->intel))); + media_context->urb.num_cs_entries = 1; + media_context->urb.size_cs_entry = 16; - /* hook functions */ - media_state->media_states_setup = i965_media_mpeg2_states_setup; - media_state->media_objects = i965_media_mpeg2_objects; - media_state->free_private_context = i965_media_mpeg2_free_private_context; - } + media_context->urb.vfe_start = 0; + media_context->urb.cs_start = media_context->urb.vfe_start + + media_context->urb.num_vfe_entries * media_context->urb.size_vfe_entry; + assert(media_context->urb.cs_start + + media_context->urb.num_cs_entries * media_context->urb.size_cs_entry <= URB_SIZE((&i965->intel))); - media_state->extended_state.enabled = 1; - media_state->indirect_object.bo = NULL; - dri_bo_unreference(media_state->extended_state.bo); - bo = dri_bo_alloc(i965->intel.bufmgr, - "vld state", - sizeof(struct i965_vld_state), 32); - assert(bo); - media_state->extended_state.bo = bo; + /* hook functions */ + media_context->media_states_setup = i965_media_mpeg2_states_setup; + media_context->media_objects = i965_media_mpeg2_objects; + media_context->private_context = i965_mpeg2_context; + media_context->free_private_context = i965_media_mpeg2_free_private_context; } - diff --git a/i965_drv_video/i965_media_mpeg2.h b/i965_drv_video/i965_media_mpeg2.h index 3a78ac3..7da9b78 100644 --- a/i965_drv_video/i965_media_mpeg2.h +++ b/i965_drv_video/i965_media_mpeg2.h @@ -35,10 +35,10 @@ #include #include -#include "i965_structs.h" - struct decode_state; +struct i965_media_context; -void i965_media_mpeg2_decode_init(VADriverContextP ctx, struct decode_state * decode_state); +void i965_media_mpeg2_decode_init(VADriverContextP ctx, struct decode_state * decode_state, struct i965_media_context *media_context); +void i965_media_mpeg2_dec_context_init(VADriverContextP ctx, struct i965_media_context *media_context); #endif /* _I965_MEDIA_MPEG2_H_ */ diff --git a/i965_drv_video/i965_post_processing.c b/i965_drv_video/i965_post_processing.c index 29e02a2..b6db19a 100644 --- a/i965_drv_video/i965_post_processing.c +++ b/i965_drv_video/i965_post_processing.c @@ -35,8 +35,9 @@ #include "intel_batchbuffer.h" #include "intel_driver.h" - #include "i965_defines.h" +#include "i965_structs.h" + #include "i965_post_processing.h" #include "i965_render.h" #include "i965_drv_video.h" diff --git a/i965_drv_video/i965_render.c b/i965_drv_video/i965_render.c index efed4c3..c34f6ae 100644 --- a/i965_drv_video/i965_render.c +++ b/i965_drv_video/i965_render.c @@ -41,10 +41,11 @@ #include "intel_batchbuffer.h" #include "intel_driver.h" - #include "i965_defines.h" -#include "i965_render.h" #include "i965_drv_video.h" +#include "i965_structs.h" + +#include "i965_render.h" #define SF_KERNEL_NUM_GRF 16 #define SF_MAX_THREADS 1 diff --git a/i965_drv_video/intel_batchbuffer.h b/i965_drv_video/intel_batchbuffer.h index 77174fe..6df8d45 100644 --- a/i965_drv_video/intel_batchbuffer.h +++ b/i965_drv_video/intel_batchbuffer.h @@ -23,7 +23,7 @@ struct intel_batchbuffer int (*run)(drm_intel_bo *bo, int used, drm_clip_rect_t *cliprects, int num_cliprects, - int DR4, int ring_flag); + int DR4, unsigned int ring_flag); }; Bool intel_batchbuffer_init(struct intel_driver_data *intel); -- 2.7.4