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

Reply via email to