[Mesa-dev] [PATCH 135/140] radeon/vce: adapt gfx9 surface to vce
Christian König
deathsimple at vodafone.de
Tue Mar 21 06:48:28 UTC 2017
Am 20.03.2017 um 23:49 schrieb Marek Olšák:
> From: Leo Liu <leo.liu at amd.com>
>
> Signed-off-by: Leo Liu <leo.liu at amd.com>
> Acked-by: Alex Deucher <alexander.deucher at amd.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
> ---
> src/gallium/drivers/radeon/radeon_vce.c | 24 +++++++++++++----
> src/gallium/drivers/radeon/radeon_vce_52.c | 42 +++++++++++++++++++++++-------
> 2 files changed, 51 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/radeon_vce.c b/src/gallium/drivers/radeon/radeon_vce.c
> index 0ff66f4..8d25dd7 100644
> --- a/src/gallium/drivers/radeon/radeon_vce.c
> +++ b/src/gallium/drivers/radeon/radeon_vce.c
> @@ -224,9 +224,17 @@ struct rvce_cpb_slot *l1_slot(struct rvce_encoder *enc)
> void rvce_frame_offset(struct rvce_encoder *enc, struct rvce_cpb_slot *slot,
> signed *luma_offset, signed *chroma_offset)
> {
> - unsigned pitch = align(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe, 128);
> - unsigned vpitch = align(enc->luma->u.legacy.level[0].nblk_y, 16);
> - unsigned fsize = pitch * (vpitch + vpitch / 2);
> + struct r600_common_screen *rscreen = (struct r600_common_screen *)enc->screen;
> + unsigned pitch, vpitch, fsize;
> +
> + if (rscreen->chip_class < GFX9) {
> + pitch = align(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe, 128);
> + vpitch = align(enc->luma->u.legacy.level[0].nblk_y, 16);
> + } else {
> + pitch = align(enc->luma->u.gfx9.surf_pitch * enc->luma->bpe, 256);
> + vpitch = align(enc->luma->u.gfx9.surf_height, 16);
> + }
> + fsize = pitch * (vpitch + vpitch / 2);
>
> *luma_offset = slot->index * fsize;
> *chroma_offset = *luma_offset + pitch * vpitch;
> @@ -456,8 +464,14 @@ struct pipe_video_codec *rvce_create_encoder(struct pipe_context *context,
> goto error;
>
> get_buffer(((struct vl_video_buffer *)tmp_buf)->resources[0], NULL, &tmp_surf);
> - cpb_size = align(tmp_surf->u.legacy.level[0].nblk_x * tmp_surf->bpe, 128);
> - cpb_size = cpb_size * align(tmp_surf->u.legacy.level[0].nblk_y, 32);
> +
> + cpb_size = (rscreen->chip_class < GFX9) ?
> + align(tmp_surf->u.legacy.level[0].nblk_x * tmp_surf->bpe, 128) *
> + align(tmp_surf->u.legacy.level[0].nblk_y, 32) :
> +
> + align(tmp_surf->u.gfx9.surf_pitch * tmp_surf->bpe, 256) *
> + align(tmp_surf->u.gfx9.surf_height, 32);
> +
> cpb_size = cpb_size * 3 / 2;
> cpb_size = cpb_size * enc->cpb_num;
> if (enc->dual_pipe)
> diff --git a/src/gallium/drivers/radeon/radeon_vce_52.c b/src/gallium/drivers/radeon/radeon_vce_52.c
> index 6f9194c..36cf480 100644
> --- a/src/gallium/drivers/radeon/radeon_vce_52.c
> +++ b/src/gallium/drivers/radeon/radeon_vce_52.c
> @@ -167,6 +167,7 @@ void radeon_vce_52_get_param(struct rvce_encoder *enc, struct pipe_h264_enc_pict
>
> static void create(struct rvce_encoder *enc)
> {
> + struct r600_common_screen *rscreen = (struct r600_common_screen *)enc->screen;
> enc->task_info(enc, 0x00000000, 0, 0, 0);
>
> RVCE_BEGIN(0x01000001); // create cmd
> @@ -177,9 +178,17 @@ static void create(struct rvce_encoder *enc)
> RVCE_CS(enc->enc_pic.ec.enc_pic_struct_restriction);
> RVCE_CS(enc->base.width); // encImageWidth
> RVCE_CS(enc->base.height); // encImageHeight
> - RVCE_CS(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe); // encRefPicLumaPitch
> - RVCE_CS(enc->chroma->u.legacy.level[0].nblk_x * enc->chroma->bpe); // encRefPicChromaPitch
> - RVCE_CS(align(enc->luma->u.legacy.level[0].nblk_y, 16) / 8); // encRefYHeightInQw
> +
> + if (rscreen->chip_class < GFX9) {
> + RVCE_CS(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe); // encRefPicLumaPitch
> + RVCE_CS(enc->chroma->u.legacy.level[0].nblk_x * enc->chroma->bpe); // encRefPicChromaPitch
> + RVCE_CS(align(enc->luma->u.legacy.level[0].nblk_y, 16) / 8); // encRefYHeightInQw
> + } else {
> + RVCE_CS(enc->luma->u.gfx9.surf_pitch * enc->luma->bpe); // encRefPicLumaPitch
> + RVCE_CS(enc->chroma->u.gfx9.surf_pitch * enc->chroma->bpe); // encRefPicChromaPitch
> + RVCE_CS(align(enc->luma->u.gfx9.surf_height, 16) / 8); // encRefYHeightInQw
> + }
> +
> RVCE_CS(enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants);
>
> RVCE_CS(enc->enc_pic.ec.enc_pre_encode_context_buffer_offset);
> @@ -191,6 +200,7 @@ static void create(struct rvce_encoder *enc)
>
> static void encode(struct rvce_encoder *enc)
> {
> + struct r600_common_screen *rscreen = (struct r600_common_screen *)enc->screen;
> signed luma_offset, chroma_offset, bs_offset;
> unsigned dep, bs_idx = enc->bs_idx++;
> int i;
> @@ -239,13 +249,25 @@ static void encode(struct rvce_encoder *enc)
> RVCE_CS(enc->enc_pic.eo.insert_aud);
> RVCE_CS(enc->enc_pic.eo.end_of_sequence);
> RVCE_CS(enc->enc_pic.eo.end_of_stream);
> - RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM,
> - enc->luma->u.legacy.level[0].offset); // inputPictureLumaAddressHi/Lo
> - RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM,
> - enc->chroma->u.legacy.level[0].offset); // inputPictureChromaAddressHi/Lo
> - RVCE_CS(align(enc->luma->u.legacy.level[0].nblk_y, 16)); // encInputFrameYPitch
> - RVCE_CS(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe); // encInputPicLumaPitch
> - RVCE_CS(enc->chroma->u.legacy.level[0].nblk_x * enc->chroma->bpe); // encInputPicChromaPitch
> +
> + if (rscreen->chip_class < GFX9) {
> + RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM,
> + enc->luma->u.legacy.level[0].offset); // inputPictureLumaAddressHi/Lo
> + RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM,
> + enc->chroma->u.legacy.level[0].offset); // inputPictureChromaAddressHi/Lo
> + RVCE_CS(align(enc->luma->u.legacy.level[0].nblk_y, 16)); // encInputFrameYPitch
> + RVCE_CS(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe); // encInputPicLumaPitch
> + RVCE_CS(enc->chroma->u.legacy.level[0].nblk_x * enc->chroma->bpe); // encInputPicChromaPitch
> + } else {
> + RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM,
> + enc->luma->u.gfx9.surf_offset); // inputPictureLumaAddressHi/Lo
> + RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM,
> + enc->chroma->u.gfx9.surf_offset); // inputPictureChromaAddressHi/Lo
> + RVCE_CS(align(enc->luma->u.gfx9.surf_height, 16)); // encInputFrameYPitch
> + RVCE_CS(enc->luma->u.gfx9.surf_pitch * enc->luma->bpe); // encInputPicLumaPitch
> + RVCE_CS(enc->chroma->u.gfx9.surf_pitch * enc->chroma->bpe); // encInputPicChromaPitch
> + }
> +
> if (enc->dual_pipe)
> enc->enc_pic.eo.enc_input_pic_addr_array_disable2pipe_disablemboffload = 0x00000000;
> else
More information about the mesa-dev
mailing list