From fa80c1fe20f1fc33864f04fd9cf49f8bddfa4448 Mon Sep 17 00:00:00 2001 From: Leo Liu Date: Mon, 15 Jun 2015 14:11:57 -0400 Subject: [PATCH] radeon/vce: add dual pipe support for VI MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Leo Liu Reviewed-by: Christian König --- src/gallium/drivers/radeon/radeon_vce.c | 6 +++--- src/gallium/drivers/radeon/radeon_vce.h | 2 +- src/gallium/drivers/radeon/radeon_vce_40_2_2.c | 17 ----------------- src/gallium/drivers/radeon/radeon_vce_50.c | 18 +++++++++++++++++- 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/gallium/drivers/radeon/radeon_vce.c b/src/gallium/drivers/radeon/radeon_vce.c index 4af044303d2..644958a05e8 100644 --- a/src/gallium/drivers/radeon/radeon_vce.c +++ b/src/gallium/drivers/radeon/radeon_vce.c @@ -403,7 +403,7 @@ struct pipe_video_codec *rvce_create_encoder(struct pipe_context *context, if ((rscreen->info.drm_major > 2) || (rscreen->info.drm_minor >= 42)) enc->use_vui = true; if (rscreen->info.family >= CHIP_TONGA) - enc->use_2p = true; + enc->dual_pipe = true; enc->base = *templ; enc->base.context = context; @@ -443,9 +443,9 @@ struct pipe_video_codec *rvce_create_encoder(struct pipe_context *context, cpb_size = cpb_size * align(tmp_surf->npix_y, 16); cpb_size = cpb_size * 3 / 2; cpb_size = cpb_size * enc->cpb_num; - if (enc->use_2p) + if (enc->dual_pipe) cpb_size += RVCE_MAX_AUX_BUFFER_NUM * - RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE; + RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE * 2; tmp_buf->destroy(tmp_buf); if (!rvid_create_buffer(enc->screen, &enc->cpb, cpb_size, PIPE_USAGE_DEFAULT)) { RVID_ERR("Can't create CPB buffer.\n"); diff --git a/src/gallium/drivers/radeon/radeon_vce.h b/src/gallium/drivers/radeon/radeon_vce.h index a8448108a55..ae7b2b431be 100644 --- a/src/gallium/drivers/radeon/radeon_vce.h +++ b/src/gallium/drivers/radeon/radeon_vce.h @@ -104,7 +104,7 @@ struct rvce_encoder { struct pipe_h264_enc_picture_desc pic; bool use_vm; bool use_vui; - bool use_2p; + bool dual_pipe; }; /* CPB handling functions */ diff --git a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c index 904781525b5..71b5e89fd59 100644 --- a/src/gallium/drivers/radeon/radeon_vce_40_2_2.c +++ b/src/gallium/drivers/radeon/radeon_vce_40_2_2.c @@ -287,23 +287,6 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(enc->bs_size); // videoBitstreamRingSize RVCE_END(); - if (enc->use_2p) { - unsigned aux_offset = enc->cpb.res->buf->size - - RVCE_MAX_AUX_BUFFER_NUM * RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE; - RVCE_BEGIN(0x05000002); // auxiliary buffer - for (i = 0; i < 4; ++i) { - RVCE_CS(aux_offset); - aux_offset += RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE; - } - for (i = 0; i < 4; ++i) - RVCE_CS(0x00000000); - for (i = 0; i < 4; ++i) - RVCE_CS(RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE); - for (i = 0; i < 4; ++i) - RVCE_CS(0x00000000); - RVCE_END(); - } - RVCE_BEGIN(0x03000001); // encode RVCE_CS(0x00000000); // insertHeaders RVCE_CS(0x00000000); // pictureStructure diff --git a/src/gallium/drivers/radeon/radeon_vce_50.c b/src/gallium/drivers/radeon/radeon_vce_50.c index 2cdddf2e5b7..80a69b5442b 100644 --- a/src/gallium/drivers/radeon/radeon_vce_50.c +++ b/src/gallium/drivers/radeon/radeon_vce_50.c @@ -106,6 +106,19 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(enc->bs_size); // videoBitstreamRingSize RVCE_END(); + if (enc->dual_pipe) { + unsigned aux_offset = enc->cpb.res->buf->size - + RVCE_MAX_AUX_BUFFER_NUM * RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE * 2; + RVCE_BEGIN(0x05000002); // auxiliary buffer + for (i = 0; i < 8; ++i) { + RVCE_CS(aux_offset); + aux_offset += RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE; + } + for (i = 0; i < 8; ++i) + RVCE_CS(RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE); + RVCE_END(); + } + RVCE_BEGIN(0x03000001); // encode RVCE_CS(enc->pic.frame_num ? 0x0 : 0x11); // insertHeaders RVCE_CS(0x00000000); // pictureStructure @@ -121,7 +134,10 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(align(enc->luma->npix_y, 16)); // encInputFrameYPitch RVCE_CS(enc->luma->level[0].pitch_bytes); // encInputPicLumaPitch RVCE_CS(enc->chroma->level[0].pitch_bytes); // encInputPicChromaPitch - RVCE_CS(0x00010000); // encInputPic(Addr|Array)Mode,encDisable(TwoPipeMode|MBOffloading) + if (enc->dual_pipe) + RVCE_CS(0x00000000); // encInputPic(Addr|Array)Mode,encDisable(TwoPipeMode|MBOffloading) + else + RVCE_CS(0x00010000); // encInputPic(Addr|Array)Mode,encDisable(TwoPipeMode|MBOffloading) RVCE_CS(0x00000000); // encInputPicTileConfig RVCE_CS(enc->pic.picture_type); // encPicType RVCE_CS(enc->pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR); // encIdrFlag -- 2.30.2