diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2010-05-28 13:20:17 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2010-06-02 13:58:26 +0800 |
commit | 2d7a2ce07ed74fcc405bc672c585a0d9e8c3c419 (patch) | |
tree | e7e38753a743d40e4740c4d042ad2c04d3e95bc1 | |
parent | b2aade854a573b7c4591b48c2befd4efdb78826c (diff) | |
download | libva-2d7a2ce07ed74fcc405bc672c585a0d9e8c3c419.tar.gz |
i965_drv_video: [H.264] devide the command buffer into smaller sections for HWscoreboard thread.
-rw-r--r-- | i965_drv_video/i965_avc_hw_scoreboard.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/i965_drv_video/i965_avc_hw_scoreboard.c b/i965_drv_video/i965_avc_hw_scoreboard.c index f020c5b..e91f05f 100644 --- a/i965_drv_video/i965_avc_hw_scoreboard.c +++ b/i965_drv_video/i965_avc_hw_scoreboard.c @@ -269,15 +269,37 @@ i965_avc_hw_scoreboard_constant_buffer(VADriverContextP ctx, struct i965_avc_hw_ static void i965_avc_hw_scoreboard_objects(VADriverContextP ctx, struct i965_avc_hw_scoreboard_context *avc_hw_scoreboard_context) { - BEGIN_BATCH(ctx, 6); - OUT_BATCH(ctx, CMD_MEDIA_OBJECT | 4); - OUT_BATCH(ctx, 0); /* interface descriptor offset: 0 */ - OUT_BATCH(ctx, 0); /* no indirect data */ - OUT_BATCH(ctx, 0); - OUT_BATCH(ctx, ((avc_hw_scoreboard_context->inline_data.num_mb_cmds << 16) | - (avc_hw_scoreboard_context->inline_data.starting_mb_number << 0))); - OUT_BATCH(ctx, avc_hw_scoreboard_context->inline_data.pic_width_in_mbs); - ADVANCE_BATCH(ctx); + int number_mb_cmds = 512; + int starting_mb_number = avc_hw_scoreboard_context->inline_data.starting_mb_number; + int i; + + for (i = 0; i < avc_hw_scoreboard_context->inline_data.num_mb_cmds / 512; i++) { + BEGIN_BATCH(ctx, 6); + OUT_BATCH(ctx, CMD_MEDIA_OBJECT | 4); + OUT_BATCH(ctx, 0); /* interface descriptor offset: 0 */ + OUT_BATCH(ctx, 0); /* no indirect data */ + OUT_BATCH(ctx, 0); + OUT_BATCH(ctx, ((number_mb_cmds << 16) | + (starting_mb_number << 0))); + OUT_BATCH(ctx, avc_hw_scoreboard_context->inline_data.pic_width_in_mbs); + ADVANCE_BATCH(ctx); + + starting_mb_number += 512; + } + + number_mb_cmds = avc_hw_scoreboard_context->inline_data.num_mb_cmds % 512; + + if (number_mb_cmds) { + BEGIN_BATCH(ctx, 6); + OUT_BATCH(ctx, CMD_MEDIA_OBJECT | 4); + OUT_BATCH(ctx, 0); /* interface descriptor offset: 0 */ + OUT_BATCH(ctx, 0); /* no indirect data */ + OUT_BATCH(ctx, 0); + OUT_BATCH(ctx, ((number_mb_cmds << 16) | + (starting_mb_number << 0))); + OUT_BATCH(ctx, avc_hw_scoreboard_context->inline_data.pic_width_in_mbs); + ADVANCE_BATCH(ctx); + } } static void @@ -376,7 +398,7 @@ i965_avc_hw_scoreboard_decode_init(VADriverContextP ctx) assert(bo); avc_hw_scoreboard_context->vfe_state.bo = bo; - avc_hw_scoreboard_context->urb.num_vfe_entries = 1; + avc_hw_scoreboard_context->urb.num_vfe_entries = 32; avc_hw_scoreboard_context->urb.size_vfe_entry = 2; avc_hw_scoreboard_context->urb.num_cs_entries = 1; avc_hw_scoreboard_context->urb.size_cs_entry = 1; |