[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