vc1: fix bitplane buffer size(HSW)
[profile/ivi/vaapi-intel-driver.git] / src / gen75_mfd.c
index ec0d51e..2278a29 100644 (file)
@@ -41,6 +41,7 @@
 #include "i965_decoder_utils.h"
 
 #include "gen7_mfd.h"
+#include "intel_media.h"
 
 #define B0_STEP_REV            2
 #define IS_STEPPING_BPLUS(i965)        ((i965->intel.revision) >= B0_STEP_REV)
@@ -172,38 +173,21 @@ gen75_mfd_avc_frame_store_index(VADriverContextP ctx,
     }
 }
 
-static void 
-gen75_mfd_free_avc_surface(void **data)
-{
-    struct gen7_avc_surface *gen7_avc_surface = *data;
-
-    if (!gen7_avc_surface)
-        return;
-
-    dri_bo_unreference(gen7_avc_surface->dmv_top);
-    gen7_avc_surface->dmv_top = NULL;
-    dri_bo_unreference(gen7_avc_surface->dmv_bottom);
-    gen7_avc_surface->dmv_bottom = NULL;
-
-    free(gen7_avc_surface);
-    *data = NULL;
-}
-
 static void
 gen75_mfd_init_avc_surface(VADriverContextP ctx, 
                           VAPictureParameterBufferH264 *pic_param,
                           struct object_surface *obj_surface)
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
-    struct gen7_avc_surface *gen7_avc_surface = obj_surface->private_data;
+    GenAvcSurface *gen7_avc_surface = obj_surface->private_data;
     int width_in_mbs, height_in_mbs;
 
-    obj_surface->free_private_data = gen75_mfd_free_avc_surface;
+    obj_surface->free_private_data = gen_free_avc_surface;
     width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1;
     height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; /* frame height */
 
     if (!gen7_avc_surface) {
-        gen7_avc_surface = calloc(sizeof(struct gen7_avc_surface), 1);
+        gen7_avc_surface = calloc(sizeof(GenAvcSurface), 1);
         assert((obj_surface->size & 0x3f) == 0);
         obj_surface->private_data = gen7_avc_surface;
     }
@@ -788,6 +772,28 @@ gen75_mfd_avc_qm_state(VADriverContextP ctx,
 }
 
 static void
+gen75_mfd_avc_picid_state(VADriverContextP ctx,
+                      struct decode_state *decode_state,
+                      struct gen7_mfd_context *gen7_mfd_context)
+{
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
+    struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
+
+    BEGIN_BCS_BATCH(batch, 10);
+    OUT_BCS_BATCH(batch, MFD_AVC_PICID_STATE | (10 - 2));
+    OUT_BCS_BATCH(batch, 1); // disable Picture ID Remapping
+    OUT_BCS_BATCH(batch, 0);
+    OUT_BCS_BATCH(batch, 0);
+    OUT_BCS_BATCH(batch, 0);
+    OUT_BCS_BATCH(batch, 0);
+    OUT_BCS_BATCH(batch, 0);
+    OUT_BCS_BATCH(batch, 0);
+    OUT_BCS_BATCH(batch, 0);
+    OUT_BCS_BATCH(batch, 0);
+    ADVANCE_BCS_BATCH(batch);
+}
+
+static void
 gen75_mfd_avc_directmode_state_bplus(VADriverContextP ctx,
                               VAPictureParameterBufferH264 *pic_param,
                               VASliceParameterBufferH264 *slice_param,
@@ -796,7 +802,7 @@ gen75_mfd_avc_directmode_state_bplus(VADriverContextP ctx,
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
     struct object_surface *obj_surface;
-    struct gen7_avc_surface *gen7_avc_surface;
+    GenAvcSurface *gen7_avc_surface;
     VAPictureH264 *va_pic;
     int i, j;
 
@@ -883,7 +889,7 @@ gen75_mfd_avc_directmode_state(VADriverContextP ctx,
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
     struct object_surface *obj_surface;
-    struct gen7_avc_surface *gen7_avc_surface;
+    GenAvcSurface *gen7_avc_surface;
     VAPictureH264 *va_pic;
     int i, j;
 
@@ -1328,6 +1334,7 @@ gen75_mfd_avc_decode_picture(VADriverContextP ctx,
     gen75_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_AVC, gen7_mfd_context);
     gen75_mfd_avc_qm_state(ctx, decode_state, gen7_mfd_context);
     gen75_mfd_avc_img_state(ctx, decode_state, gen7_mfd_context);
+    gen75_mfd_avc_picid_state(ctx, decode_state, gen7_mfd_context);
 
     for (j = 0; j < decode_state->num_slice_params; j++) {
         assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
@@ -1800,7 +1807,7 @@ gen75_mfd_vc1_decode_init(VADriverContextP ctx,
 
         bo = dri_bo_alloc(i965->intel.bufmgr,
                           "VC-1 Bitplane",
-                          bitplane_width * bitplane_width,
+                          bitplane_width * height_in_mbs,
                           0x1000);
         assert(bo);
         gen7_mfd_context->bitplane_read_buffer.bo = bo;
@@ -2148,7 +2155,6 @@ gen75_mfd_vc1_directmode_state_bplus(VADriverContextP ctx,
     ADVANCE_BCS_BATCH(batch);
 }
 
-
 static void
 gen75_mfd_vc1_directmode_state(VADriverContextP ctx,
                               struct decode_state *decode_state,
@@ -3389,7 +3395,7 @@ gen75_dec_hw_context_init(VADriverContextP ctx, struct object_config *obj_config
 
     gen7_mfd_context->base.destroy = gen75_mfd_context_destroy;
     gen7_mfd_context->base.run = gen75_mfd_decode_picture;
-    gen7_mfd_context->base.batch = intel_batchbuffer_new(intel, I915_EXEC_RENDER);
+    gen7_mfd_context->base.batch = intel_batchbuffer_new(intel, I915_EXEC_RENDER, 0);
 
     for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
         gen7_mfd_context->reference_surface[i].surface_id = VA_INVALID_ID;