Signed-off-by: Xiang, Haihao <haihao.xi...@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 _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva