OSDN Git Service

genX_mfd: align dmv buffer use with VC-1 spec and PRM
authorcarpalis <jerome.borsboom@carpalis.nl>
Mon, 23 Oct 2017 10:05:35 +0000 (12:05 +0200)
committerXiang, Haihao <haihao.xiang@intel.com>
Fri, 5 Jan 2018 06:57:31 +0000 (14:57 +0800)
As stated in VC-1 spec, the direct MV buffer will be written when
decoding a P frame. Subsequently, the direct MV buffer is read when
decoding a B frame that backward references this P frame.

Signed-off-by: Jerome Borsboom <jerome.borsboom@carpalis.nl>
src/gen6_mfd.c
src/gen75_mfd.c
src/gen7_mfd.c
src/gen8_mfd.c

index bea39e6..044dba8 100644 (file)
@@ -1490,11 +1490,8 @@ gen6_mfd_vc1_pic_state(VADriverContextP ctx,
         if (obj_surface)
             gen6_vc1_surface = obj_surface->private_data;
 
-        if (!gen6_vc1_surface ||
-            (gen6_vc1_surface->picture_type == GEN6_VC1_I_PICTURE ||
-             gen6_vc1_surface->picture_type == GEN6_VC1_BI_PICTURE))
-            dmv_surface_valid = 0;
-        else
+        if (gen6_vc1_surface &&
+            gen6_vc1_surface->picture_type == GEN6_VC1_P_PICTURE)
             dmv_surface_valid = 1;
     }
 
@@ -1674,19 +1671,26 @@ gen6_mfd_vc1_directmode_state(VADriverContextP ctx,
                               struct gen6_mfd_context *gen6_mfd_context)
 {
     struct intel_batchbuffer *batch = gen6_mfd_context->base.batch;
+    VAPictureParameterBufferVC1 *pic_param;
     struct object_surface *obj_surface;
     dri_bo *dmv_read_buffer = NULL, *dmv_write_buffer = NULL;
+    int picture_type;
 
-    obj_surface = decode_state->render_object;
+    pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
+    picture_type = pic_param->picture_fields.bits.picture_type;
 
-    if (obj_surface && obj_surface->private_data) {
+    if (picture_type == GEN6_VC1_P_PICTURE ||
+        picture_type == GEN6_VC1_SKIPPED_PICTURE) {
+        obj_surface = decode_state->render_object;
         dmv_write_buffer = ((struct gen6_vc1_surface *)(obj_surface->private_data))->dmv;
     }
 
-    obj_surface = decode_state->reference_objects[1];
-
-    if (obj_surface && obj_surface->private_data) {
-        dmv_read_buffer = ((struct gen6_vc1_surface *)(obj_surface->private_data))->dmv;
+    if (picture_type == GEN6_VC1_B_PICTURE) {
+        obj_surface = decode_state->reference_objects[1];
+        if (pic_param->backward_reference_picture != VA_INVALID_ID &&
+            obj_surface) {
+            dmv_read_buffer = ((struct gen6_vc1_surface *)(obj_surface->private_data))->dmv;
+        }
     }
 
     BEGIN_BCS_BATCH(batch, 3);
index 418cb60..fde0953 100644 (file)
@@ -1816,11 +1816,8 @@ gen75_mfd_vc1_pic_state(VADriverContextP ctx,
         if (obj_surface)
             gen7_vc1_surface = obj_surface->private_data;
 
-        if (!gen7_vc1_surface ||
-            (gen7_vc1_surface->picture_type == GEN7_VC1_I_PICTURE ||
-             gen7_vc1_surface->picture_type == GEN7_VC1_BI_PICTURE))
-            dmv_surface_valid = 0;
-        else
+        if (gen7_vc1_surface &&
+            gen7_vc1_surface->picture_type == GEN7_VC1_P_PICTURE)
             dmv_surface_valid = 1;
     }
 
@@ -1993,19 +1990,26 @@ gen75_mfd_vc1_directmode_state_bplus(VADriverContextP ctx,
                                      struct gen7_mfd_context *gen7_mfd_context)
 {
     struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
+    VAPictureParameterBufferVC1 *pic_param;
     struct object_surface *obj_surface;
     dri_bo *dmv_read_buffer = NULL, *dmv_write_buffer = NULL;
+    int picture_type;
 
-    obj_surface = decode_state->render_object;
+    pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
+    picture_type = pic_param->picture_fields.bits.picture_type;
 
-    if (obj_surface && obj_surface->private_data) {
+    if (picture_type == GEN7_VC1_P_PICTURE ||
+        picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+        obj_surface = decode_state->render_object;
         dmv_write_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
     }
 
-    obj_surface = decode_state->reference_objects[1];
-
-    if (obj_surface && obj_surface->private_data) {
-        dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
+    if (picture_type == GEN7_VC1_B_PICTURE) {
+        obj_surface = decode_state->reference_objects[1];
+        if (pic_param->backward_reference_picture != VA_INVALID_ID &&
+            obj_surface) {
+            dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
+        }
     }
 
     BEGIN_BCS_BATCH(batch, 7);
@@ -2039,25 +2043,32 @@ gen75_mfd_vc1_directmode_state(VADriverContextP ctx,
                                struct gen7_mfd_context *gen7_mfd_context)
 {
     struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
+    VAPictureParameterBufferVC1 *pic_param;
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct object_surface *obj_surface;
     dri_bo *dmv_read_buffer = NULL, *dmv_write_buffer = NULL;
+    int picture_type;
 
     if (IS_STEPPING_BPLUS(i965)) {
         gen75_mfd_vc1_directmode_state_bplus(ctx, decode_state, gen7_mfd_context);
         return;
     }
 
-    obj_surface = decode_state->render_object;
+    pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
+    picture_type = pic_param->picture_fields.bits.picture_type;
 
-    if (obj_surface && obj_surface->private_data) {
+    if (picture_type == GEN7_VC1_P_PICTURE ||
+        picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+        obj_surface = decode_state->render_object;
         dmv_write_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
     }
 
-    obj_surface = decode_state->reference_objects[1];
-
-    if (obj_surface && obj_surface->private_data) {
-        dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
+    if (picture_type == GEN7_VC1_B_PICTURE) {
+        obj_surface = decode_state->reference_objects[1];
+        if (pic_param->backward_reference_picture != VA_INVALID_ID &&
+            obj_surface) {
+            dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
+        }
     }
 
     BEGIN_BCS_BATCH(batch, 3);
index 61bab22..6d10846 100644 (file)
@@ -1542,7 +1542,6 @@ gen7_mfd_vc1_pic_state(VADriverContextP ctx,
         }
     }
 
-
     if (picture_type == GEN7_VC1_B_PICTURE) {
         struct gen7_vc1_surface *gen7_vc1_surface = NULL;
 
@@ -1551,11 +1550,8 @@ gen7_mfd_vc1_pic_state(VADriverContextP ctx,
         if (obj_surface)
             gen7_vc1_surface = obj_surface->private_data;
 
-        if (!gen7_vc1_surface ||
-            (gen7_vc1_surface->picture_type == GEN7_VC1_I_PICTURE ||
-             gen7_vc1_surface->picture_type == GEN7_VC1_BI_PICTURE))
-            dmv_surface_valid = 0;
-        else
+        if (gen7_vc1_surface &&
+            gen7_vc1_surface->picture_type == GEN7_VC1_P_PICTURE)
             dmv_surface_valid = 1;
     }
 
@@ -1729,19 +1725,26 @@ gen7_mfd_vc1_directmode_state(VADriverContextP ctx,
                               struct gen7_mfd_context *gen7_mfd_context)
 {
     struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
+    VAPictureParameterBufferVC1 *pic_param;
     struct object_surface *obj_surface;
     dri_bo *dmv_read_buffer = NULL, *dmv_write_buffer = NULL;
+    int picture_type;
 
-    obj_surface = decode_state->render_object;
+    pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
+    picture_type = pic_param->picture_fields.bits.picture_type;
 
-    if (obj_surface && obj_surface->private_data) {
+   if (picture_type == GEN7_VC1_P_PICTURE ||
+        picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+        obj_surface = decode_state->render_object;
         dmv_write_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
     }
 
-    obj_surface = decode_state->reference_objects[1];
-
-    if (obj_surface && obj_surface->private_data) {
-        dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
+    if (picture_type == GEN7_VC1_B_PICTURE) {
+        obj_surface = decode_state->reference_objects[1];
+        if (pic_param->backward_reference_picture != VA_INVALID_ID &&
+            obj_surface) {
+            dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
+        }
     }
 
     BEGIN_BCS_BATCH(batch, 3);
index d5c76a1..51f3bcf 100644 (file)
@@ -1595,11 +1595,8 @@ gen8_mfd_vc1_pic_state(VADriverContextP ctx,
         if (obj_surface)
             gen7_vc1_surface = obj_surface->private_data;
 
-        if (!gen7_vc1_surface ||
-            (gen7_vc1_surface->picture_type == GEN7_VC1_I_PICTURE ||
-             gen7_vc1_surface->picture_type == GEN7_VC1_BI_PICTURE))
-            dmv_surface_valid = 0;
-        else
+        if (gen7_vc1_surface &&
+            gen7_vc1_surface->picture_type == GEN7_VC1_P_PICTURE)
             dmv_surface_valid = 1;
     }
 
@@ -1772,20 +1769,27 @@ gen8_mfd_vc1_directmode_state(VADriverContextP ctx,
                               struct gen7_mfd_context *gen7_mfd_context)
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
+    VAPictureParameterBufferVC1 *pic_param;
     struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
     struct object_surface *obj_surface;
     dri_bo *dmv_read_buffer = NULL, *dmv_write_buffer = NULL;
+    int picture_type;
 
-    obj_surface = decode_state->render_object;
+    pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
+    picture_type = pic_param->picture_fields.bits.picture_type;
 
-    if (obj_surface && obj_surface->private_data) {
+    if (picture_type == GEN7_VC1_P_PICTURE ||
+        picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+        obj_surface = decode_state->render_object;
         dmv_write_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
     }
 
-    obj_surface = decode_state->reference_objects[1];
-
-    if (obj_surface && obj_surface->private_data) {
-        dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
+    if (picture_type == GEN7_VC1_B_PICTURE) {
+        obj_surface = decode_state->reference_objects[1];
+        if (pic_param->backward_reference_picture != VA_INVALID_ID &&
+            obj_surface) {
+            dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
+        }
     }
 
     BEGIN_BCS_BATCH(batch, 7);