From: Boyuan Zhang <boyuan.zh...@amd.com> When using dual instance and rate control, driver needs to submit jobs either in dual submissions or 2 consecutive single submissions to keep the pattern constant for rate control
Signed-off-by: Boyuan Zhang <boyuan.zh...@amd.com> --- src/gallium/state_trackers/va/picture.c | 16 +++++++++++----- src/gallium/state_trackers/va/surface.c | 7 +++++-- src/gallium/state_trackers/va/va_private.h | 2 ++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c index db08a3c..8326b5b 100644 --- a/src/gallium/state_trackers/va/picture.c +++ b/src/gallium/state_trackers/va/picture.c @@ -412,7 +412,6 @@ handleVAEncPictureParameterBufferType(vlVaDriver *drv, vlVaContext *context, vlV context->desc.h264enc.quant_i_frames = h264->pic_init_qp; context->desc.h264enc.quant_b_frames = h264->pic_init_qp; context->desc.h264enc.quant_p_frames = h264->pic_init_qp; - context->desc.h264enc.frame_num_cnt++; context->desc.h264enc.gop_cnt++; if (context->desc.h264enc.gop_cnt == context->desc.h264enc.gop_size) context->desc.h264enc.gop_cnt = 0; @@ -568,18 +567,25 @@ vlVaEndPicture(VADriverContextP ctx, VAContextID context_id) if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) { coded_buf = context->coded_buf; getEncParamPreset(context); + context->desc.h264enc.frame_num_cnt++; context->decoder->begin_frame(context->decoder, context->target, &context->desc.base); context->decoder->encode_bitstream(context->decoder, context->target, coded_buf->derived_surface.resource, &feedback); - surf->frame_num_cnt = context->desc.h264enc.frame_num_cnt; surf->feedback = feedback; surf->coded_buf = coded_buf; } context->decoder->end_frame(context->decoder, context->target, &context->desc.base); - if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE && - context->desc.h264enc.p_remain == 1) - context->decoder->flush(context->decoder); + + if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) { + surf->frame_num_cnt = context->desc.h264enc.frame_num_cnt; + surf->force_flushed = false; + if (context->first_single_submitted || (context->desc.h264enc.p_remain == 1)) { + context->decoder->flush(context->decoder); + context->first_single_submitted = false; + surf->force_flushed = true; + } + } pipe_mutex_unlock(drv->mutex); return VA_STATUS_SUCCESS; } diff --git a/src/gallium/state_trackers/va/surface.c b/src/gallium/state_trackers/va/surface.c index 3ee1cdd..39b1960 100644 --- a/src/gallium/state_trackers/va/surface.c +++ b/src/gallium/state_trackers/va/surface.c @@ -119,12 +119,15 @@ vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target) if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) { int frame_diff; - if (context->desc.h264enc.frame_num_cnt > surf->frame_num_cnt) + if (context->desc.h264enc.frame_num_cnt >= surf->frame_num_cnt) frame_diff = context->desc.h264enc.frame_num_cnt - surf->frame_num_cnt; else frame_diff = 0xFFFFFFFF - surf->frame_num_cnt + 1 + context->desc.h264enc.frame_num_cnt; - if (frame_diff < 2) + if (frame_diff == 0 && surf->force_flushed == false) { context->decoder->flush(context->decoder); + if (context->desc.h264enc.rate_ctrl.rate_ctrl_method == PIPE_H264_ENC_RATE_CONTROL_METHOD_VARIABLE) + context->first_single_submitted = true; + } context->decoder->get_feedback(context->decoder, surf->feedback, &(surf->coded_buf->coded_size)); } pipe_mutex_unlock(drv->mutex); diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h index e9ccdbf..e7f6f2d 100644 --- a/src/gallium/state_trackers/va/va_private.h +++ b/src/gallium/state_trackers/va/va_private.h @@ -244,6 +244,7 @@ typedef struct { struct vl_deint_filter *deint; struct vlVaBuffer *coded_buf; int target_id; + bool first_single_submitted; } vlVaContext; typedef struct { @@ -273,6 +274,7 @@ typedef struct { vlVaBuffer *coded_buf; void *feedback; unsigned int frame_num_cnt; + bool force_flushed; } vlVaSurface; // Public functions: -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev