summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2010-05-28 13:20:17 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2010-06-02 13:58:26 +0800
commit2d7a2ce07ed74fcc405bc672c585a0d9e8c3c419 (patch)
treee7e38753a743d40e4740c4d042ad2c04d3e95bc1
parentb2aade854a573b7c4591b48c2befd4efdb78826c (diff)
downloadlibva-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.c42
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;