[Libva] [Libva-intel-driver PATCH 05/27] HEVC: All internal buffers used for HCP pipe on SKL

Xiang, Haihao haihao.xiang at intel.com
Wed Nov 19 07:05:20 PST 2014


Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
---
 src/gen9_mfd.c     | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/gen9_mfd.h     | 10 +++++++
 src/i965_decoder.h | 17 ++++++++++++
 src/i965_defines.h |  4 +++
 4 files changed, 107 insertions(+)

diff --git a/src/gen9_mfd.c b/src/gen9_mfd.c
index 2056439..0cd6a56 100644
--- a/src/gen9_mfd.c
+++ b/src/gen9_mfd.c
@@ -83,8 +83,27 @@ gen9_hcpd_hevc_decode_init(VADriverContextP ctx,
                            struct decode_state *decode_state,
                            struct gen9_hcpd_context *gen9_hcpd_context)
 {
+    struct i965_driver_data *i965 = i965_driver_data(ctx);
     VAPictureParameterBufferHEVC *pic_param;
+    VASliceParameterBufferHEVC *slice_param;
     struct object_surface *obj_surface;
+    uint32_t size;
+    int i, j, has_inter = 0;
+
+    for (j = 0; j < decode_state->num_slice_params && !has_inter; j++) {
+        assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
+        slice_param = (VASliceParameterBufferHEVC *)decode_state->slice_params[j]->buffer;
+
+        for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
+            if (slice_param->LongSliceFlags.fields.slice_type == HEVC_SLICE_B ||
+                slice_param->LongSliceFlags.fields.slice_type == HEVC_SLICE_P) {
+                has_inter = 1;
+                break;
+            }
+
+            slice_param++;
+        }
+    }
 
     assert(decode_state->pic_param && decode_state->pic_param->buffer);
     pic_param = (VAPictureParameterBufferHEVC *)decode_state->pic_param->buffer;
@@ -104,6 +123,53 @@ gen9_hcpd_hevc_decode_init(VADriverContextP ctx,
     obj_surface = decode_state->render_object;
     gen9_hcpd_init_hevc_surface(ctx, pic_param, obj_surface, gen9_hcpd_context);
 
+    size = ALIGN(gen9_hcpd_context->picture_width_in_pixels, 32) >> 3;
+    size <<= 6;
+    ALLOC_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_line_buffer), "line buffer", size);
+    ALLOC_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_tile_line_buffer), "tile line buffer", size);
+
+    size = ALIGN(gen9_hcpd_context->picture_height_in_pixels + 6 * gen9_hcpd_context->picture_height_in_ctbs, 32) >> 3;
+    size <<= 6;
+    ALLOC_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_tile_column_buffer), "tile column buffer", size);
+
+    if (has_inter) {
+        size = (((gen9_hcpd_context->picture_width_in_pixels + 15) >> 4) * 188 + 9 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
+        size <<= 6;
+        ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_line_buffer), "metadata line buffer", size);
+
+        size = (((gen9_hcpd_context->picture_width_in_pixels + 15) >> 4) * 172 + 9 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
+        size <<= 6;
+        ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_line_buffer), "metadata tile line buffer", size);
+
+        size = (((gen9_hcpd_context->picture_height_in_pixels + 15) >> 4) * 176 + 89 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
+        size <<= 6;
+        ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_column_buffer), "metadata tile column buffer", size);
+    } else {
+        size = (gen9_hcpd_context->picture_width_in_pixels + 8 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
+        size <<= 6;
+        ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_line_buffer), "metadata line buffer", size);
+
+        size = (gen9_hcpd_context->picture_width_in_pixels + 16 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
+        size <<= 6;
+        ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_line_buffer), "metadata tile line buffer", size);
+
+        size = (gen9_hcpd_context->picture_height_in_pixels + 8 * gen9_hcpd_context->picture_height_in_ctbs + 1023) >> 9;
+        size <<= 6;
+        ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_column_buffer), "metadata tile column buffer", size);
+    }
+
+    size = ALIGN(((gen9_hcpd_context->picture_width_in_pixels >> 1) + 3 * gen9_hcpd_context->picture_width_in_ctbs), 16) >> 3;
+    size <<= 6;
+    ALLOC_GEN_BUFFER((&gen9_hcpd_context->sao_line_buffer), "sao line buffer", size);
+
+    size = ALIGN(((gen9_hcpd_context->picture_width_in_pixels >> 1) + 6 * gen9_hcpd_context->picture_width_in_ctbs), 16) >> 3;
+    size <<= 6;
+    ALLOC_GEN_BUFFER((&gen9_hcpd_context->sao_tile_line_buffer), "sao tile line buffer", size);
+
+    size = ALIGN(((gen9_hcpd_context->picture_height_in_pixels >> 1) + 6 * gen9_hcpd_context->picture_height_in_ctbs), 16) >> 3;
+    size <<= 6;
+    ALLOC_GEN_BUFFER((&gen9_hcpd_context->sao_tile_column_buffer), "sao tile column buffer", size);
+
     return VA_STATUS_SUCCESS;
 }
 
@@ -168,6 +234,16 @@ gen9_hcpd_context_destroy(void *hw_context)
 {
     struct gen9_hcpd_context *gen9_hcpd_context = (struct gen9_hcpd_context *)hw_context;
 
+    FREE_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_line_buffer));
+    FREE_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_tile_line_buffer));
+    FREE_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_tile_column_buffer));
+    FREE_GEN_BUFFER((&gen9_hcpd_context->metadata_line_buffer));
+    FREE_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_line_buffer));
+    FREE_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_column_buffer));
+    FREE_GEN_BUFFER((&gen9_hcpd_context->sao_line_buffer));
+    FREE_GEN_BUFFER((&gen9_hcpd_context->sao_tile_line_buffer));
+    FREE_GEN_BUFFER((&gen9_hcpd_context->sao_tile_column_buffer));
+
     intel_batchbuffer_free(gen9_hcpd_context->base.batch);
     free(gen9_hcpd_context);
 }
diff --git a/src/gen9_mfd.h b/src/gen9_mfd.h
index 8b2213a..d3d546d 100644
--- a/src/gen9_mfd.h
+++ b/src/gen9_mfd.h
@@ -49,6 +49,16 @@ struct gen9_hcpd_context
     uint16_t picture_height_in_min_cb_minus1;
     uint8_t ctb_size;
     uint8_t min_cb_size;
+
+    GenBuffer deblocking_filter_line_buffer;
+    GenBuffer deblocking_filter_tile_line_buffer;
+    GenBuffer deblocking_filter_tile_column_buffer;
+    GenBuffer metadata_line_buffer;
+    GenBuffer metadata_tile_line_buffer;
+    GenBuffer metadata_tile_column_buffer;
+    GenBuffer sao_line_buffer;
+    GenBuffer sao_tile_line_buffer;
+    GenBuffer sao_tile_column_buffer;
 };
 
 #endif /* GEN9_MFD_H */
diff --git a/src/i965_decoder.h b/src/i965_decoder.h
index 14d4d0c..843d2e4 100644
--- a/src/i965_decoder.h
+++ b/src/i965_decoder.h
@@ -33,6 +33,23 @@
 #include <intel_bufmgr.h>
 
 #define MAX_GEN_REFERENCE_FRAMES 16
+#define MAX_GEN_HCP_REFERENCE_FRAMES    8
+
+#define ALLOC_GEN_BUFFER(gen_buffer, string, size) do {         \
+        dri_bo_unreference(gen_buffer->bo);                     \
+        gen_buffer->bo = dri_bo_alloc(i965->intel.bufmgr,       \
+                                      string,                   \
+                                      size,                     \
+                                      0x1000);                  \
+        assert(gen_buffer->bo);                                 \
+        gen_buffer->valid = 1;                                  \
+    } while (0);
+
+#define FREE_GEN_BUFFER(gen_buffer) do {        \
+        dri_bo_unreference(gen_buffer->bo);     \
+        gen_buffer->bo = NULL;                  \
+        gen_buffer->valid = 0;                  \
+    } while (0)
 
 typedef struct gen_frame_store GenFrameStore;
 struct gen_frame_store {
diff --git a/src/i965_defines.h b/src/i965_defines.h
index af1edc1..a67b6e7 100755
--- a/src/i965_defines.h
+++ b/src/i965_defines.h
@@ -888,4 +888,8 @@
 #define GEN9_SBE_ACTIVE_COMPONENT_XYZ           2
 #define GEN9_SBE_ACTIVE_COMPONENT_XYZW          3
 
+#define HEVC_SLICE_B                            0
+#define HEVC_SLICE_P                            1
+#define HEVC_SLICE_I                            2
+
 #endif /* _I965_DEFINES_H_ */
-- 
1.9.1



More information about the Libva mailing list